부트캠프를 시작하고 나서, 처음 SIMPLE API(로직이 별로 없는 API)
를 만들었을 당시 그리고 데이터베이스에 대한 개념이 잡히기 이전에 이미 생성되어 있는 CSV
파일을 활용해서 SIMPLE API
를 만들었던 적이 있다.
그 때 당시 외부에 있는 파일 데이터를 가져와 변형해서 SIMPLE API(로직이 별로 없는 API)
를 만들 때 사용했었던 모듈이 바로 이번 게시글에서 가볍게 다루게 될 fs module
이다.
가볍게 fs module
사용 방식을 알아보자
const fs = require('fs');
fs.readFile('./data.txt', (err, data) => {
if(err){
throw err;
}
console.log(data)
})
같은 디렉토리 내부에 저 함수가 포함되어 있는 js
파일과 data.txt
파일이 있다면 저렇게 fs module
를 활용 할 수 있는데 저렇게 fs
를 선언 후 사용하게 된다면 콜백 함수가 필요하게 되므로 인자로 에러와 결과 값을 받아 에러가 발생하면 던지고 결과가 읽히면 데이터를 출력하게끔 할 수 있다.
그리고 파일 읽으면 다음과 같이 이상한 것이 출력되는데 이것을 버퍼(Buffer)
라고 한다.
<Buffer ec a0 80 eb a5 ....>
이러한 버퍼는 컴퓨터의 메모리 데이터인데...사람이 알기 쉽게 바꾸기 위해서는 문자열로 변환해주는 toString()
을 적용해야 한다.
const fs = require('fs');
fs.readFile('./data.txt', (err, data) => {
if(err){
throw err;
}
console.log(data.toString())
})
fs에 대해서 조금 더 파헤치기 이전에 버퍼(Buffer)
는 무엇인지 한 번 가볍게 알아보도록 하자
버퍼...생각해보면 우리가 인터넷을 이용하면서 많이 들어본 혹은 언급한 단어의 의미와 비슷한데, 바로 버퍼링
이다. 그리고 버퍼링
을 언급하면 빠질 수 없는 것이 바로 스트리밍
이다. 두 개의 의미를 한 번 짚고 넘어가자
이 두 가지의 개념은 사실상 노드에서의 버퍼
와 스트림
의 개념들과 비슷한데.. 정리해보면
버퍼란.. 노드는 파일을 읽을 때 메모리에 파일 크기만큼 공간을 마련해두며 파일 데이터를 메모리에 저장하는데 이 때 저장되는 데이터가 버퍼이다.
스트림이란..파일 방식을 버퍼 방식으로만 관리하게 되면 크기가 커질수록 그만큼의 버퍼를 만들어야 하기 때문에 메모리 문제가 발생할 수 있는데 그러한 파일들을 잘게 쪼개서 여러번에 걸쳐 나눠 보내는 방식이 바로 스트림이다.
크기가 큰 파일의 경우, 조금 더 효율적으로 관리하기 위해서 스트림 방식으로 버퍼를 잘게 쪼개서 파일을 전송한다.
여기서는 버퍼와 스트림에 대한 기본적인 개념만 짚고 넘어갈 것이기 때문에 해당 개념들에 대한 조작법은 추후에 따로 다뤄보기로 하자.
다시 fs module
로 돌아오면, fs 모듈을 사용해 간단하게 파일을 읽고 쓰는 경우에는 대개 비동기 방식으로 실행이 된다.
다음 예제 코드를 한 번 보자
const fs = require('fs');
console.log('시작')
fs.readFile('./data.txt', (err, data) => {
if(err){
throw err;
}
console.log("1번", data.toString())
})
fs.readFile('./data.txt', (err, data) => {
if(err){
throw err;
}
console.log("2번",data.toString())
})
fs.readFile('./data.txt', (err, data) => {
if(err){
throw err;
}
console.log("3번", data.toString())
})
console.log('끝')
저 파일을 실행해보면, 시작 -> 1번 -> 2번 -> 3번 -> 끝 순으로 실행이 되는 것이 아닌 비동기적으로 시작 -> 끝이 실행된 후 랜덤으로 1번/2번/3번이 실행된다. 이걸 동기적으로 실행하기 위해서는 fs module의 readFileSync
를 사용하면 되는데 굳이 동기적으로 파일을 실행해서 수 많은 작업 할 시 메인 스레드 성능에 문제가 발생하게 하는 것 보다 fs module 의 promise화
라던가...스파게티 코드의 원인이 되는 콜백 지옥으로 해결 하면 된다.
fs module
의 메서드를 간단하게 알아보자