JS 공부/모듈 정리

[JS] fs? 이런 기능은 처음이야...

장아장 2023. 8. 9. 10:31

진짜...이런 기능이 처음이라 너뭐돼?라는 생각으로 접근했었다.

자바에서는 한번도 써본 적 없는 파일 시스템 기능이었다. 

이를 위해서 파일 시스템을 먼저 알아야겠지?

 

이 파일 시스템을 알아야 하는 이유가 몇 가지 있다. 

  1. 이 fs모듈은 파일의 경로로 접근한다. 
  2. 해당 경로의 데이터가 파일인지, 디렉토리인지 알고 써야한다. (혹은 이를 검증하기 위한 로직이다)

 

fs모듈도 사실 파일 시스템에 대해서 공부하기 전에 사용해봤다. 

알고쓰니 이런 의미였나 싶기도 했다. 

 

그러면, Ara Boza!!

fs모듈은 쓰는 법은 간단하다. 외부 라이브러리도 아니고, 기본적으로 주어진 모듈이다.

 

const fs = require("fs")

일단 외부 모듈을 담아준다. 

그러면 fs에서 지원되는 기능이 되게 많다. 

 

  • readFile
  • writeFile
  • appendFile
  • unlink
  • mkdir
  • rmdir
  • readdir
  • rename
  • stat

크게 이정도의 기능들이 있으며, 얘네는 비동기 함수다. 동기로 하고 싶으면 뒤에 Sync를 붙여주면 끝이다. 

 

각 기능이 어떻게 동작하는지 하나씩 Araboza!

 

// readFile
const fs = require("fs")

fs.readFile(path[, options], callback)
비동기적으로 동작하며, 해당 path에 있는 파일을 option에 맞게 인코딩하는 방식으로 데이터를 읽어온다.
path에 해당하는 파일이 없다면 Error를 발생시킨다.
읽어온 결과는 콜백 함수를 통해 동작하게 된다.

fs.readFileSync(path[, options])
동기적으로 path에 있는 파일을 option에 맞게 인코딩한 결과를 반환한다.
path에 해당하는 파일이 없다면 Error를 발생시킨다.
//writeFile
const fs = require("fs")

fs.writeFile(file, data[, options], callback)
비동기적으로 file에 해당하는 경로의 파일에 data를 options에 맞게 초기화시킨다.
만약 파일이 없다면 생성시킨다.
이후에 callback이 동작한다. (callback에서 성공, 혹은 실패시 에러를 처리한다)

fs.writeFileSync(file, data[, options])
동기적으로 위의 과정을 처리한다. 
성공하면 아무일도 없지만, 실패하면 Error가 터진다.
// appendFile
const fs = require("fs")

fs.appendFile(file, data[, options], callback)
file의 경로상 파일에 data를 이어적는다. (즉, 기존의 데이터 다음에 data가 들어가게 한다)
callback으로 실패시 후처리, 성공시 결과에 대한 후처리를 콜백함수로 처리한다. 

fs.appendSync(file, data[, options])
file의 경로상 파일에 data를 이어적고, 동기적으로 성공여부를 반환한다.

이 외에도 기능이 매우 다양하다. 해당 함수들을 까보면서, 이에 맞는 처리를 하는게 좋다. 

 

여기에서, 하나 더 같이 쓰기 좋은 모듈이 있다. 

const path = require("path")

이걸 이용하면, file이나 path에 맞는 문자열을 쉽게 만들 수 있다. 

문자열을 입력해 해당 경로를 파싱해주는 함수를 만들어도 되지만, 이런 모듈도 쓰기 좋다라는 것을 보여주고 싶었다. 


어디에 활용할까?

나 같은 경우에는 데이터베이스를 연동하지 않고 저장, 조회, 수정, 삭제 기능을 구현할 때 활용할 수 있었다. 

또한, json같은 경우에는 stringify로 담아뒀다가 그대로 뽑아서 parse해주면 문자열을 그대로 뽑을 수 있어 좋았다. 

테스트를 위한 더미 데이터를 따로 DB에 담아두는 것이 아닌, 이런 식으로 적어뒀다가 그대로 뽑아 쓰는 방식을 채택할 수 있을 것 같다. 

 

그럼...twenty thousand...🔥