[Node.js] 노드에서의 파일 시스템

먹보·2023년 1월 17일
0

MUK_BO's Node.js

목록 보기
7/7
post-custom-banner

부트캠프를 시작하고 나서, 처음 SIMPLE API(로직이 별로 없는 API)를 만들었을 당시 그리고 데이터베이스에 대한 개념이 잡히기 이전에 이미 생성되어 있는 CSV파일을 활용해서 SIMPLE API를 만들었던 적이 있다.

그 때 당시 외부에 있는 파일 데이터를 가져와 변형해서 SIMPLE API(로직이 별로 없는 API)를 만들 때 사용했었던 모듈이 바로 이번 게시글에서 가볍게 다루게 될 fs module이다.

✍ 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)는 무엇인지 한 번 가볍게 알아보도록 하자

📝 버퍼 : Buffer & 스트림 : Stream

버퍼...생각해보면 우리가 인터넷을 이용하면서 많이 들어본 혹은 언급한 단어의 의미와 비슷한데, 바로 버퍼링이다. 그리고 버퍼링을 언급하면 빠질 수 없는 것이 바로 스트리밍이다. 두 개의 의미를 한 번 짚고 넘어가자

  • 버퍼링 : 인터넷에서 영상을 시청한다는 가정하에, 버퍼링은 영상을 재생할 수 있을 때까지 데이터를 모으는 동작
  • 스트리밍 : 방송인의 컴퓨터에서 시청자의 컴퓨터로 영상 데이터를 조금씩 전송하는 동작

이 두 가지의 개념은 사실상 노드에서의 버퍼스트림의 개념들과 비슷한데.. 정리해보면

버퍼란.. 노드는 파일을 읽을 때 메모리에 파일 크기만큼 공간을 마련해두며 파일 데이터를 메모리에 저장하는데 이 때 저장되는 데이터가 버퍼이다.

스트림이란..파일 방식을 버퍼 방식으로만 관리하게 되면 크기가 커질수록 그만큼의 버퍼를 만들어야 하기 때문에 메모리 문제가 발생할 수 있는데 그러한 파일들을 잘게 쪼개서 여러번에 걸쳐 나눠 보내는 방식이 바로 스트림이다.

크기가 큰 파일의 경우, 조금 더 효율적으로 관리하기 위해서 스트림 방식으로 버퍼를 잘게 쪼개서 파일을 전송한다.

여기서는 버퍼와 스트림에 대한 기본적인 개념만 짚고 넘어갈 것이기 때문에 해당 개념들에 대한 조작법은 추후에 따로 다뤄보기로 하자.

✍ fs module의 동기/비동기

다시 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 메서드 모음

fs module의 메서드를 간단하게 알아보자

  1. fs.readFile : 비동기적으로 파일 읽기/쓰기
  2. fs.readFileSync : 동기적으로 파일 읽기/쓰기
  3. fs.access (경로, 옵션, 콜백) : 폴더나 파일에 접근 여부 확인
  4. fs.mkdir (경로, 콜백) : 폴더 만들기
  5. fs.open (경로, 옵션, 콜백) : 파일의 아이디를 가져오기
  6. fs.rename (기존 경로, 새 경로, 콜백) : 파일 이름 변경
  7. fs.readdir (경로, 콜백) : 폴더 안 내용물 확인
  8. fs.unlink (경로, 콜백) : 파일 지우기
  9. fs.rmdir (경로, 콜백) : 폴더 지우기
profile
🍖먹은 만큼 성장하는 개발자👩‍💻
post-custom-banner

0개의 댓글