Node.js - 파일 시스템

안녕하세요, 미래의 프로그래머 여러분! 오늘은 Node.js와 그 파일 시스템 모듈의 흥미로운 세계로 함께潜入해보겠습니다. 여러분의 친절한 이웃 컴퓨터 선생님이자 저는 많은 예제와 설명으로 여러분을 안내해드릴 것입니다. 그麼, 안전벨트를 고정하고 시작해보겠습니다!

Node.js - File System

동기적 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