File System 모듈
: 파일의 내용을 읽거나 기록하는 등 파일을 관리할 때 사용하는 모듈
FS 모듈 가져오기
모듈 이름에는 큰따옴표(” ”), 작은 따옴표(’ ’) 모두 사용할 수 있다.
const fs = require("fs");
fs 모듈을 가져온 후에는
fs.함수명
으로 모듈의 함수를 사용한다.
기능
현재 디렉터리 읽기
- 동기 처리로 디렉터리 읽기 - readdirSync 함수옵션은 encoding이다. (encoding : 반환값을 어떤 형태로 가져올 것인지 지정, 기본값이 utf8로 되어 있어 사람이 읽을 수 있는 텍스트 형태로 가져옴)
fs.readdirSync(경로[, 옵션])
- 비동기 처리로 디렉터리 읽기 - readdir 함수
- 옵션 : encoding(기본값 UTF8), withFile Types(기본값 false)
- 옵션을 {withFileTypes:true}로 지정하면 반환값이 문자열로 된 배열이 아니라 디렉터리 항목으로 된 배열을 반환함
- 콜백 : err와 files 매개변수를 사용한다.
- 예시
const fs = require("fs"); fs.readdir("./", (err, files) => { // 경로와 콜백을 인자로 사용 if(err) { // 콜백에서 넘겨받은 err와 files를 인자로 받아서 처리 console.error(err); } console.log(files); }):
- 옵션 : encoding(기본값 UTF8), withFile Types(기본값 false)
fs.readdir(경로[, 옵션], 콜백)
파일 읽기
- 동기 처리로 파일 읽기 - readFiltSync 함수
- 파일 내용을 버퍼(자료를 잠시 저장해두는 임시 메모리 영역) 또는 문자열 형태로 반환
fs.readFileSync(경로[, 옵션])
- 비동기 처리로 파일 읽기 - readFile 함수
fs.readFile(경로[, 옵션], 콜백)
파일에 기록하기
- 동기 처리로 파일에 쓰기 - writeFileSync 함수
fs.writeFileSync(파일, 내용[, 옵션])
- 비동기 처리로 파일에 쓰기 - writeFile
fs.writeFile(파일, 내용[, 옵션], 콜백)
- 파일 존재 여부 체크하기 -existsSync 함수
fs.existsSync(파일)
- 기존 파일에 내용 추가
- flag 옵션 사용
fs.writeFileSync("파일", 내용, {flag: "옵션"});
- appendFileSync, appendFile 함수
fs.appendFileSync(파일, 내용[, 옵션]); fs.appendFile(파일, 내용[, 옵션], 콜백);
파일 삭제하기
- 동기 처리로 파일 삭제하기 - unlinkSync 함수
- 비동기 처리로 파일 삭제하기 - unlink 함수
fs.unlinkSync("파일);
fs.unlink("파일", 콜백);
디렉터리 만들기
fs.mkdirSync(경로[, 옵션]);
fs.mkdir(경로[, 옵션], 콜백);
- 옵션
- recursive (기본값 false)
- 여러 계층의 디렉터리를 지정했을 때 중간에 존재하지 않는 경로까지 포함해서 디렉터리를 만들 수 있다.
- mode (기본값 0o777 - 읽기, 쓰기, 실행 권한)
- 디렉터리의 권한을 지정
- recursive (기본값 false)
디렉터리 삭제
- 빈 디렉터리 삭제
fs.rmdirSync(경로, 내용[, 옵션]);
fs.rmdir(경로[, 옵션], 콜백);
- 옵션
- maxRetries (기본값 0)
- 오류가 발생해서 디렉터리를 삭제하지 못했을 때 재시도할 횟수를 지정한다.
- retryDelay (기본값 100)
- maxRetries에서 재시도 횟수를 지정했을 경우 대기 시간(밀리초)을 정할 수 있음
- maxRetries (기본값 0)
- 파일 삭제 및 내용이 있는 디렉터리 삭제
fs.rmSync(경로, 내용[, 옵션]);
fs.rm(경로[, 옵션], 콜백);
- 옵션
- force (기본값 false)
- true로 지정하면 파일이나 디렉터리를 강제로 삭제
- 삭제할 파일이나 디렉터리가 없어도 오류 발생 X
- maxRetries (기본값 0)
- 오류가 발생해서 디렉터리를 삭제하지 못했을 때 재시도할 횟수
- retryDelay (기본값 100)
- maxRetries에서 재시도 횟수를 지정했을 경우 대기 시간(밀리초)을 정할 수 있음
- recursive (기본값 false)
- 경로가 여러 단계라면 단계별로 삭제 작업을 실행함
- force (기본값 false)
버퍼와 스트림
버퍼
: 임시 데이터를 저장하는 물리적인 메모리 공간
파일을 읽어올 때 전체 내용을 한꺼번에 가져오는 것이 아닌 한번에 버퍼 하나의 크기 만큼만 파일을 읽어오고 버퍼가 가득 차면, 그 내용을 전달해 준다고 생각하면 쉽다!
(내용을 조금씩 쪼개서 버퍼로 보내고, 버퍼가 채워지면 데이터를 보냄)
버퍼에는 이진값으로 내용이 저장되어 있는데 readFile 함수에서 utf8 옵션을 사용하거나 data에 toString 함수를 적용하면 버퍼의 내용을 우리가 읽을 수 있는 문자열 형태로 바꿀 수 있다.
=⇒ 데이터를 메모리에 저장하고 직접 다룰 때 사용
스트림
: 한 곳에서 다른 곳으로 데이터가 이동하는 것 ⇒ 데이터의 흐름
ㄴ 버퍼를 이용해서 데이터를 처리하거나 전달함
우리가 ott를 통해 영화 한편을 볼 때 영화 한편을 모두 다운 받은 후 재생하는 것이 아니라(영화 파일의 크기가 클테니) 파일을 조금씩 나눠서 내려받으면서 화면에 재생된다는 사실
그래서 다운 받은 거 화면에 재생되는 동안 그 뒷 내용을 계속해서 다운 중이라는 것!
화면을 보는 동안 다른 파일이 버퍼에 다운로드 되고 버퍼가 가득 차면 다시 화면이 재생된다는 말!
→ 이런 서비스를 스트리밍 서비스라고 한다.
=⇒ 데이터를 효율적으로 읽고 쓸 때 사용
- 리더블 스트림
- 데이터를 읽기 위한 스트림
- 서버에서 용량이 큰 데이터를 가져올 때 주로 사용
- 청크(데이터를 읽어오는 작은 단위)단위로 데이터를 읽어옴
- 이벤트 처리
on("이벤트", 콜백)
fs.createReadStream(경로, 내용[, 옵션])
- 라이터블 스트림
- 데이터를 기록하는 스트림
fs.createWriteStream(경로, 내용[, 옵션])
- 파이프 pipe
- 2개의 스트림을 연결
fs.readStream.pipe(writeStream [, 옵션])
- 원래 읽은 데이터를 다른 곳에 기록하려면
const fs = require("fs");
const readStream = fs.createReadStream("./readMe.txt", "utf8");
const writeStream = fs.createWriteStream("./wrtieMe.txt");
readStream.on("data", (chunk) => {
writeStream.write(chunk);
}
- pipe를 사용하면
const fs = require("fs");
const readStream = fs.createReadStream("./readMe.txt", "utf8");
const writeStream = fs.createWriteStream("./wrtieMe.txt");
readStream.pipe(wirteStream);
-
- pipe 함수를 사용하면 서버에서 자료를 읽어 와서 클라이언트에 기록해야 할 때 데이터를 효율적으로 전송하고 처리할 수 있다.
'🥸 웹앱개발 이모저모 > Node.js' 카테고리의 다른 글
Node.js | 패키지 관리, npm (0) | 2024.03.11 |
---|---|
Node.js | node.js란?, node.js 설치하기 (0) | 2024.03.11 |
Node.js | 백엔드 개발이란? (0) | 2024.03.11 |