TIL_200917(fs & streams & buffers)

Si Choi·2020년 9월 17일
0

유튜브의 The Net Ninja의 Node.js Crash Course를 수강하면서 Node.js의 File System 및 Stream & Buffers를 학습한 내용을 정리해보았습니다.


1. 코스의 학습 목표

  • Node 설치 및 JS로 활용하는 방법 학습 ✅
  • 컴퓨터에서 File을 Read & Write 하는 방법 학습 ✅
  • 웹사이트를 구현할 때 Node.js로 어떻게 서버를 구축하는 지 학습
  • Express app / website 구현하기
  • MongoDB(NoSQL Database) 활용해보기
  • HTML views를 구현하면서 Template Engines 활용해보기
  • 심플한 블로그 사이트 구현해보기

2. File System 기본 개념 정리

Node.js는 기본적으로 내장 모듈들을 가지고 있으며 그중 하나가 File System입니다.

File System은 다음과 같이 활용할 수 있습니다.

1) Reading File

//1. Reading Files without option
const fs = require("fs");

fs.readFile("./docs/blog.md", (err, data) => {
  console.log(data);
});
/*expected output
<Buffer 48 65 6c 6c 6f 20 57 6f 72 6c 64 0a>
*/
  • fs.readFile 메서드는 (파일 경로, 파일 경로에 대한 옵션, 콜백 함수를 인자값으로 받음
  • fs.readFile은 위 예시와 같이 옵션이 없는 경우 파일을 Raw Buffer 형태로 해당 File의 값들을 Read 할 수 있음
//2-1. Reading Files with option(type string)
const fs = require("fs");

fs.readFile("./docs/blog.md", 'utf-8' (err, data) => {
  console.log(data);
});
/*expected output
"Hello World"
*/

//2-2. Reading files with option(type obj)
const fs = require("fs");

let options = {
  encoding: "utf8", // UTF-8이라는 인코딩 방식으로 엽니다
  flag: "r", // 읽기 위해 엽니다
};
fs.readFile("./docs/blog.md", options, (err, data) => {
  console.log(data);
});
  • option은 type String이나 Object로 입력할 수 있음
  • option을 object로 구성할 때 encoding과 flag는 공식 문서를 참조

2) Writing File

//1. Write File
fs.writeFile("./docs/blog1.txt", "hello again", () => {
  console.log("fie was written");
});
  • fs.writeFile 메서드는 인자값으로 "파일 경로", "입력할 텍스트" 및 "콜백" 함수를 입력 받음
  • fs.writeFile 메서드는 ./docs/blog1.txt 파일이 존재할 경우 파일 전체를 "hello again"으로 Overwrite 함
  • ./docs/blog1.txt 파일이 존재하지 않을 경우 "hello again"이 적힌 ./docs/blog1.txt 파일을 생성(단 해당 파일 경로에 폴더가 존재해야 함)

3) Make & Remove Directory

//1. Make Directories
if (!fs.existsSync("./assets")) {
  fs.mkdir("./assets", (err) => {
    if (err) {
      console.log(err);
    }
    console.log("folder created");
  });
} 

// 2. Remove Directories 
if(fs.existsSync("./assets")) {
  fs.rmdir("./assets", (err) => {
    if (err) {
      console.log(err);
    }
    console.log("folder deleted");
  });
}
  • fs.existsSync 메서드는 ./assets 폴더가 존재하는 지 확인함
  • fs.mkdir 메서드는 생성할 폴더(경로)와 콜백 함수를 인자값으로 받으며./assets 폴더를 생성 함
  • fs.rmdir 메서드는 제거할 폴더(경로)와 콜백 함수를 인자값으로 받으며./assets 폴더를 제거 함

4) Delete File

//1. Delete File
if (fs.existsSync("./docs/deleteme.txt")) {
  fs.unlink("./docs/deleteme.txt", (err) => {
    if (err) {
      console.log(err);
    } else {
      console.log("file deleted");
    }
  });
}
  • fs.unlink 메서드는 삭제할 파일(경로)과 콜백 함수를 인자값으로 받으며, 해당 파일을 제거 함

2. Stream & Buffer

1) Stream & Buffer 기본 개념 정리

  • Stream은 대용량의 데이터를 Buffer에 담아 브라우저로 전송하는 형태임
  • Buffer가 일종의 화물 컨테이너라고 생각하면 됨
  • 전체 데이터가 전달될 때까지 기다리지 않고 실시간으로 데이터를 쪼개서 스트리밍을 받는 원리임(유튜브, 넷플릭스 등이 활용)

2) Stream & Buffer 예시

//1. createReadStream & createWriteStream 활용
const fs = require("fs");

const readStream = fs.createReadStream("./docs/blog3.txt", {
  encoding: "utf8",
});
const writeStream = fs.createWriteStream("./docs/blog4.txt");

readStream.on("data", (chunk) => {
  console.log("--------------New Chunk-------------");
  console.log(chunk);
  writeStream.write("\nNew CHUNK \n");
  writeStream.write(chunk);
});
  • fs.createReadStream은 데이터를 가져올 파일의 경로와 옵션 등을 인자로 받음
  • onevent listener라고 생각하면 되며, 특정 용량의 버퍼(chunk)를 받을 때마다 콜백 함수를 실행할 수 있음
  • fs.createWriteStream은 데이터를 Write할 스트림을 생성하며, 스트리밍을 통해 데이터를 받을 파일의 경로와 옵션을 인자값으로 받음
  • writeStream.write을 통해 readStream의 Chunk 데이터들이 차례대로 writeStream에 전달되어 적힘.
profile
함께 성장하는 개발자가 되겠습니다!

0개의 댓글