브라우저 환경의 자바스크립트는 보안상의 이유로 사용자의 로컬 컴퓨터 파일을 마음대로 읽거나 쓸 수 없습니다. 하지만 Node.js는 서버 환경에서 동작하기 때문에 운영체제의 파일 시스템(File System)에 직접 접근할 수 있는 권한을 가집니다. 이를 가능하게 해주는 핵심 내장 모듈이 바로 fs (File System) 모듈입니다.
Node.js는 싱글 스레드입니다. 만약 동기식(Sync) 메서드를 사용해 1GB짜리 거대한 파일을 읽는다면, 그 파일을 전부 읽어올 때까지 서버가 멈춰버립니다. 그동안 다른 사용자들이 요청한 접속은 전혀 처리되지 못하고 무한 대기 상태에 빠집니다. 따라서 Node.js에서는 특별한 초기화 스크립트 단계를 제외하고는 무조건 비동기 메서드를 사용하는 것이 원칙입니다.
| 모듈 임포트 방식 | 함수 예시 | 특징 및 권장 여부 |
|---|---|---|
const fs = require('fs') |
fs.readFile(path, cb) | 전통적인 콜백(Callback) 방식입니다. 여러 작업을 연속으로 처리할 때 '콜백 지옥(Callback Hell)'에 빠질 위험이 있습니다. |
const fs = require('fs').promises |
await fs.readFile(path) | 모던 자바스크립트 권장 방식! 비동기를 처리할 때 Promise 반환을 지원하므로 async/await 문법을 사용해 코드를 동기식처럼 깔끔하게 작성할 수 있습니다. |
실제 코드로 비동기 파일 시스템 접근을 테스트해 보면, 거대한 파일을 읽는 동안에도 메인 스레드가 멈추지 않고 다음 명령어를 즉시 처리하는 것을 콘솔 로그 순서를 통해 증명할 수 있습니다.