프라이D
프라이Develog(❁´◡`❁)
프라이D
전체 방문자
오늘
어제
  • ALL (378)
    • TDD, Cleancode with JavaScr.. (5)
    • 프로젝트 (32)
      • work (3)
      • 직접 만드는 기술 블로그 (2)
      • 데일리 옥션 (19)
      • 모락모락 (8)
    • Computer Science (1)
    • Algorithm & 자료구조 (94)
      • 알고리즘 w.JavaScript (53)
      • 자료구조 (5)
      • (인프런) 자바스크립트 알고리즘 문제풀이 (34)
    • JavaScript (45)
      • JavaScript (41)
      • 모던 자바스크립트 Deep Dive (4)
    • WEB (13)
    • 회고 (12)
    • TIL (109)
    • WIL (7)
    • Stacks (20)
      • React.js (6)
      • Next.js (1)
      • Redux (3)
      • Node.js (2)
      • GIT (2)
      • SAP (1)
    • 15일 메이킹 프로젝트 (15)
    • 이전 기록 (14)
    • ETC. (5)
    • ---------------2021 (6)
      • 내일배움단-웹개발 5주 (2)
      • 정보처리기사 (4)

블로그 메뉴

  • 홈
  • 태그
  • 미디어로그
  • 위치로그
  • 방명록

공지사항

인기 글

태그

  • 내일배움카드
  • 자바스크립트
  • 자바스크립트알고리즘
  • nomadcoders
  • 알고리즘
  • 국비지원
  • Til
  • 비트마스크
  • 코드스테이츠
  • 내일배움단
  • JavaScript
  • 코딩프로젝트
  • 스파르타코딩클럽
  • 모던자바스크립트딥다이브
  • nomadcoder
  • MySQL
  • vanilaJS
  • 투포인터알고리즘
  • 자바스크립트비트마스크
  • 2023 인프콘 후기

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
프라이D

프라이Develog(❁´◡`❁)

Stacks

[Node.js] Streams 에 대해서 알아봐요.

2024. 1. 28. 22:58

Streams 란

  • 데이터를 작은 조각(chunk) 로 나누어서 처리하는 방식
  • 전체 데이터를 읽거나 쓰지 않고, 메모리에 저장도 하지 않는다.
  • 따라서 큰 데이터를 효율적으로 다룰 수 있고, 메모리 절약 및 더 빠른 I/O 작업 처리가 가능해진다.
  • Streams 또한 Event Emitter 의 인스턴스
  • 따라서 Event 를 emit 하고 그에 대한 리스너 & 핸들러에 의해 이벤트 루프를 통해 핸들링된다.

4가지 종류의 Streams

Readable

  • 말 그대로 데이터를 읽을 수 있는 stream
  • http request, fs read streams 가 있다.
  • 발생시키는 주요 이벤트로는 data, end

Wrieable

  • 말 그대로 데이터를 쓸 수 있는 stream
  • http response, fs write streams
  • drain, finish 와 같은 이벤트가 있다.

Duplex

  • Read & write 가 동시에 가능한 stream
  • net web socket 모듈이 예시

Transform

  • Duplex && 데이터 변환
  • 예시로는 zlip

간단한 코드 예시

1. fs.readFile 을 사용해 파일을 한 번에 읽어오기

// 전체 파일을 모두 읽어와야 하므로 느린 동작 & 메모리에 이 데이터를 저장해야함. (data 변수)
server.on('request', (req, res) => {
  fs.readFile('test-file.txt', (err, data) => {
    if (err) console.log(err);

    res.end(data);
  });
});
  • 서버에 요청이 들어오면, fs 모듈을 통해 txt 파일을 읽어온다.
  • 이 작업은 요청에 의해서 비동기 적으로 실행되지만, 만약  읽어오는 파일의 크기가 크다면, 이를 다 읽어올 때까지 기다렸다가 콜백이 실행되기 때문에, 파일 크기가 적을 때에나 적합한 작업이다.

2. readable & writable stream 을 사용해보자

server.on('request', (req, res) => {
    // redable stream 생성
    const readable = fs.createReadStream('test-file.txt');
    
    // 파일 읽기가 시작되면, 작은 데이터 조각 (chunk) 로 읽혀짐
    readable.on('data', (chunk) => {
      // http response 응답 객체 (res) 에 write 를 호출해 chunk 를 클라이언트에 전달
      res.write(chunk);
    });
    
    // 파일 읽기가 완료되면, http 응답을 완료한다.
    readable.on('end', () => {
      res.end();
    });
    
    readable.on('error', (err) => {
      console.log(err);

      res.statusCode(500);
      res.end('File not found');
    });
});
  • 위 방식에서는 backpressure 현상이 발생할 수 있다.
  • 즉, 데이터 생성 속도 >> 데이터 소비 속도, 네트워크가 느린 경우 네트워크 버퍼가 금방 차 시스템 메모리를 차지하고 이로 인해 성능 저하가 발생할 수 있음.
  • 이럴 땐 데이터의 흐름을 관리해주는 방법이 필요함. 

3. pipe 메서드 사용하기

server.on('request', (req, res) => {
  const readable = fs.createReadStream('test-file.txt');
  readable.pipe(res);
})
  • pipe 메소드는 redable 스트립과 writable 스트림(res 응답객체) 을 자동으로 연결해준다.
  • 위 과정에서 redable 스트림의 읽기 속도를 제어해 데이터 흐름을 관리해줌.

 

아 뭔가 벌써 어려운데.. 일단 계속 해보겠음...

저작자표시 (새창열림)

'Stacks' 카테고리의 다른 글

[Electron.js] electron 의 rebuild 란?  (0) 2024.02.18
[Node.js] Node의 require module 은 어떻게 동작하는가?  (0) 2024.02.04
[Electron.js] 일렉트론에 대해서 알아보자!  (0) 2024.01.21
[Node.js] Node란 무엇이냐..이벤트 루프란..?  (1) 2024.01.14
    'Stacks' 카테고리의 다른 글
    • [Electron.js] electron 의 rebuild 란?
    • [Node.js] Node의 require module 은 어떻게 동작하는가?
    • [Electron.js] 일렉트론에 대해서 알아보자!
    • [Node.js] Node란 무엇이냐..이벤트 루프란..?
    프라이D
    프라이D
    틀린내용 정정 및 개선사항은 언제든지 댓글 달아주세요 :D

    티스토리툴바