본문 바로가기
Node.js

[Node.js] 노드제이에스 - FS 모듈. 버퍼와 스트림

by Seong-Jun 2024. 2. 4.
728x90
반응형
SMALL

Do it! Node.js 프로그래밍 입문 공부단 2일차 입니다.

 

버퍼와 스트림

버퍼와 스트림은 파일을 읽거나 쓸 때 한 덩어리로 처리하지 않고 작은 단위로 나눠서 시간을 절약하는 방법입니다.

 

버퍼

컴퓨터 공학에서 버퍼는 임시 데이터를 저장하는 물리적인 메모리 공간을 가리킵니다. 파일을 읽어 올 때는 전체 내용을 한꺼번에 다 가져오지 않고 한번에 버퍼 하나 크기 만큼만 가져오고, 버퍼가 가득차면 그 내용을 전달해줍니다. 노드의 버퍼에 내용이 이진값으로 저장됩니다.
(노드의 버퍼 크기는 고정되어 있습니다.)

 

스트림

스트림이란 한 곳에서 다른 곳으로 데이터가 이동하는 것, 즉 데이터의 흐름을 가리킵니다. 백엔드 프로그래밍에서 스트림은 서버에서 클라이언트로 혹은 클라이언트에서 서버로 데이터를 보낼 때 사용하는 방식입니다. 스트림은 버퍼를 사용해서 데이터를 처리하거나 전달하게 됩니다.

 

버퍼는 데이터를 메모리에 저장하고 직접 다룰 때 사용하고 스트림은 데이터를 효율적으로 읽고 쓸 때 사용하는 개념입니다.

 

스트림의 장점

파일 전체를 내려받지 않고도 차례로 처리할 수 있어서 시간을 절약할 수 있고, 메모리 사용도 최소할 수 있는 만큼 프로그램의 성능도 향상할 수 있습니다.

 

스트림의 종류

리더블 스트림 데이터를 읽기 위한 스트림입니다. 네트워크로 연결해서 데이터를 읽어 오거나 파일에서 데이터를 읽어 올 때 사용합니다.
라이터블 스트림 데이터를 쓰기 위한 스트림입니다. 
듀플렉스 스트림 읽기와 쓰기 모두 가능한 스트림입니다. 리더블 스트림과 라이터블 스트림을 결합한 형태라서 실시간 양방향 통신에 사용합니다.

 

리더블 스트림

주로 서버에서 용량이 큰 데이터를 가져올 때 많이 사용합니다.

 

fs.createReadStream(경로, 내용[,옵션])

- 데이터를 작은 크기로 나누어서 읽어옵니다.

- 경로 : 리더블 스트림을 읽어 올 파일을 지정합니다.

- 옵션

  - flags: 파일을 읽어 올 때 사용할 플래그를 지정합니다. 기본값은 r입니다.

  - encoding: 기본값은 null입니다.

  - fd: 이 옵션을 사용하면 파일을 여는 작업을 생략합니다. 기본값은 null입니다.

  - mode: 파일 모드를 지정합니다. 기본값은 6o666입니다.

  - autoClose: 읽기가 끝난 후 파일을 자동으로 닫을지 지정합니다. 기본값은 true입니다.

  - start: 파일을 어디서부터 읽을지 지정합니다. 기본값은 0입니다.

  - end: 파일 어디까지 읽을지 지정합니다. 기본값은 infinity입니다. 

const fs = require("fs")
const readStream = fs.createReadStream("./03/test2.txt")
readStream.on("data", (chunk) => {
    console.log("new chunk received")
    console.log(chunk)
})
readStream.on("end", () => {
    console.log("finished reading data")
})
readStream.on("error", (err) => {
    console.log(`err name: ${err.name}`)
})

 

라이터블 스트림

데이터를 기록하는 스트림입니다.

fs.createWriteStream(경로, 내용[,옵션])

- 경로: 라이터블 스트림을 사용해 기록할 파일을 지정합니다.

- 옵션

  - flags: 파일을 기록할 때 사용할 플래그를 지정합니다. 기본값은 w입니다.

  - encoding: 기본값은 null입니다.

  - fd: 이 옵션을 사용하면 파일을 여는 작업을 생략합니다. 기본값은 null입니다.

 - mode: 파일 모드를 지정합니다. 기본값은 6o666입니다.

 - autoClose: 읽기가 끝난 후 파일을 자동으로 닫을지 지정합니다. 기본값은 true입니다.

 - start: 파일을 어디서부터 읽을지 지정합니다. 기본값은 0입니다.

const fs = require("fs")
const readStream = fs.createReadStream("./03/example.txt")
const writeStream = fs.createWriteStream("./03/write.txt")

 readStream.on("data", (chunk) => {
     console.log("new chunk received")
     writeStream.write(chunk)
})

 

2개의 스트림을 연결하는 pipe()

파이프를 사용하면 data 이벤트가 발생했을 때 따로 가져오고 기록하던 것을 한꺼번에 처리할 수 있습니다. 이벤트 처리를 하지 않아도 되고 라이터블 스트림에서 write()를 사용해 기록하지 않아도 됩니다.

const fs = require("fs")
const readStream = fs.createReadStream("./03/example.txt")
const writeStream = fs.createWriteStream("./03/write.txt")

// pipe 함수를 사용하지 않았을 때
// readStream.on("data", (chunk) => {
//     console.log("new chunk received")
//     writeStream.write(chunk)
// })

// pipe 함수를 사용했을 때
readStream.pipe(writeStream)

 

728x90
반응형
LIST

댓글