Node.js - 파일 시스템
안녕하세요, 미래의 프로그래머 여러분! 오늘은 Node.js와 그 파일 시스템 모듈의 흥미로운 세계로 함께潜入해보겠습니다. 여러분의 친절한 이웃 컴퓨터 선생님이자 저는 많은 예제와 설명으로 여러분을 안내해드릴 것입니다. 그麼, 안전벨트를 고정하고 시작해보겠습니다!
동기적 vs 비동기적
파일 연산의 본질로 뛰어들기 전에 두 가지 중요한 개념에 대해 이야기해보겠습니다: 동기적(synchronous)과 비동기적(asynchronous) 연산.
상상해보세요, 여러분이 카페에 있는 경우. 동기적인 세계에서는 커피를 주문하고, 그것이 만들어질 때까지 기다렸다가 다음 작업으로 넘어갑니다. 비동기적인 세계에서는 커피를 주문하고 그 사이에 다른 일을 하다가, 바리스타가 커피를 준비한 후에 돌아옵니다.
Node.js에서는 파일 연산을 위한 동기적과 비동기적 방법 모두를 제공합니다. 예제를 보겠습니다:
const fs = require('fs');
// 동기적 읽기
const data = fs.readFileSync('hello.txt', 'utf8');
console.log(data);
// 비동기적 읽기
fs.readFile('hello.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
동기 버전에서는 프로그램이 파일이 읽혀질 때까지 기다립니다. 비동기 버전에서는 파일이 읽히는 동안 다른 작업을 계속 수행하고, 파일이 읽혀진 후 콜백 함수를 실행합니다.
파일 쓰기
이제 파일에 쓰는 방법을 배워보겠습니다. 미래의 자신에게 메모를 남기는 것과 같은 일입니다!
const fs = require('fs');
// 동기적 쓰기
fs.writeFileSync('note.txt', '안녕하세요, 미래의 나야!');
// 비동기적 쓰기
fs.writeFile('note.txt', '안녕하세요, 미래의 나야!', (err) => {
if (err) throw err;
console.log('파일이 저장되었습니다!');
});
두 가지 방법 모두 'note.txt' 파일을 생성하거나 덮어쓰고, 내용을 "안녕하세요, 미래의 나야!"로 설정합니다. 비동기 버전은 파일이 쓰인 후 콜백 함수를 실행합니다.
파일 읽기
파일을 읽는 것은 자신에게 남긴 메모를 열어보는 것과 같습니다. 어떻게 하는지 보겠습니다:
const fs = require('fs');
// 동기적 읽기
const data = fs.readFileSync('note.txt', 'utf8');
console.log(data);
// 비동기적 읽기
fs.readFile('note.txt', 'utf8', (err, data) => {
if (err) throw err;
console.log(data);
});
두 가지 방법 모두 'note.txt' 파일의 내용을 출력합니다. 'utf8' 매개변수는 파일의 인코딩을 지정합니다.
파일 열기
occasionally, we want more control over how we interact with a file. That's where the open
method comes in:
const fs = require('fs');
// 비동기적 열기
fs.open('myfile.txt', 'r', (err, fd) => {
if (err) throw err;
console.log('파일이 성공적으로 열렸습니다!');
// 작업이 끝나면 파일을 닫아야 합니다
fs.close(fd, (err) => {
if (err) throw err;
});
});
이는 'myfile.txt' 파일을 읽기 모드('r')로 엽니다. 콜백 함수의 fd
는 파일 기호(file descriptor)로, 파일에 대한 추가 연산을 위해 사용됩니다.
Promises API
프로미스(Promises)를 사용하는 것을 좋아하는 사람들을 위해, Node.js는 파일 연산을 위한 프로미스 기반 API를 제공합니다:
const fs = require('fs').promises;
async function readMyFile() {
try {
const data = await fs.readFile('myfile.txt', 'utf8');
console.log(data);
} catch (error) {
console.error('파일 읽기 중 오류:', error);
}
}
readMyFile();
이는 이전 비동기 readFile
예제와 같은 결과를 얻지만, 최신 자바스크립트 문법을 사용합니다.
파일 정보 얻기
파일에 대한 정보가 궁금하신가요? Node.js는 여러분을 위해 준비되어 있습니다:
const fs = require('fs');
fs.stat('myfile.txt', (err, stats) => {
if (err) throw err;
console.log(`파일 크기: ${stats.size} 바이트`);
console.log(`디렉토리인가요? ${stats.isDirectory()}`);
console.log(`파일인가요? ${stats.isFile()}`);
});
이는 파일 크기, 파일이 디렉토리인지 파일인지 여부 등의 정보를 제공합니다.
파일 닫기
작업이 끝나면 항상 파일을 닫아야 합니다. 치약을 닫는 것과 같은 일입니다!
const fs = require('fs');
fs.open('myfile.txt', 'r', (err, fd) => {
if (err) throw err;
// 작업을 수행합니다...
fs.close(fd, (err) => {
if (err) throw err;
console.log('파일이 성공적으로 닫혔습니다');
});
});
파일 잘라내기
파일을 유지하면서 내용을 제거하고 싶을 때가 있습니다. 이럴 때는 잘라내기(truncate)를 사용합니다:
const fs = require('fs');
fs.truncate('myfile.txt', 0, (err) => {
if (err) throw err;
console.log('파일 내용이 지워졌습니다!');
});
이는 파일을 0 바이트로 줄이어 내용을 지웁니다.
파일 삭제
파일을 완전히 사용하지 않을 때는 파일을 삭제할 수 있습니다:
const fs = require('fs');
fs.unlink('myfile.txt', (err) => {
if (err) throw err;
console.log('파일이 성공적으로 삭제되었습니다');
});
이 작업은 매우 신중하게 해야 합니다. 실제 생활에서는 되돌릴 수 없습니다!
디렉토리 생성
새 폴더가 필요하다면 이렇게 만듭니다:
const fs = require('fs');
fs.mkdir('mynewfolder', (err) => {
if (err) throw err;
console.log('디렉토리가 성공적으로 생성되었습니다!');
});
디렉토리 읽기
디렉토리에 있는 내용을 보고 싶다면 이렇게 합니다:
const fs = require('fs');
fs.readdir('.', (err, files) => {
if (err) throw err;
console.log('디렉토리 내용:');
files.forEach(file => {
console.log(file);
});
});
이는 현재 디렉토리에 있는 모든 파일과 서브디렉토리를 나열합니다.
디렉토리 삭제
디렉토리를 제거하고 싶다면 이렇게 합니다:
const fs = require('fs');
fs.rmdir('mynewfolder', (err) => {
if (err) throw err;
console.log('디렉토리가 성공적으로 제거되었습니다');
});
이 작업은 비어 있는 디렉토리에만 적용됩니다.
메서드 참조
다음은 우리가 다루었던 메서드의 간단한 표입니다:
메서드 | 설명 |
---|---|
readFile | 파일의 전체 내용을 읽습니다 |
writeFile | 데이터를 파일에 쓰고, 파일이 이미 존재하면 덮어쓰습니다 |
open | 파일을 읽기나 쓰기 위해 엽니다 |
close | 파일 기호를 닫습니다 |
stat | 파일에 대한 정보를 얻습니다 |
truncate | 파일을 지정된 길이로 잘라냅니다 |
unlink | 파일을 삭제합니다 |
mkdir | 새 디렉토리를 생성합니다 |
readdir | 디렉토리의 내용을 읽습니다 |
rmdir | 디렉토리를 제거합니다 |
이제 여러분은 Node.js의 파일 시스템 연산 기초를 갖추셨습니다. 연습이 완벽을 만듭니다, 그래서 이 메서드들을 실험해보지 마세요. 행복한 코딩!
Credits: Image by storyset