Node.js 교과서 : 3. 노드 기본 기능 익히기(33-35)

전지연·2025년 10월 23일

GDGoC_2025

목록 보기
4/16
post-thumbnail

pipe와 스트림 메모리 효율 확인

pipe로 txt 파일 생성

  • { highWaterMart : 16 } : 16바이트씩 읽도록 설정
  • createWriteStream : 16바이트씩 끊어진 chunk를 writeme.txt에 작성

압축 파일을 만들기

zlib 사용 - gs 형식의 압축 파일 생성

매우 큰 파일 만들기

  • createWriteStream로 용량이 큰 파일을 만들 수 있음
  • 기본 크기 1기가

메모리 체크(buffer 방식)

  • big.txt의 내용을 big2.txt에 복붙
  • console.log : 콘솔에 출력된 before과 buffer 가 1기가 정도 차이가 나야 한다

메모리 체크(stream 방식)

  • console.log : 콘솔에 출력된 before과 stream이 1기가까지 차이가 나지는 않는다
  • buffer 보다 좀 더 효율적으로 메모리 소모

기타 fs메서드(파일 및 폴더 생성)

  • fs.access() : 'constants.~~'에서 ~~에 들어간 이름을 가진 폴더를 찾는다
    (폴더 없으면 에러)
  • 위의 코드에서는 catch 사용 => 에러 시 폴더 생성
  • then 사용 => 폴더가 새로 생성되면 빈 파일을 자동으로 만들게 설계

기타 fs메서드(파일 및 폴더 생성, 삭제

기타 fs메서드

(폴더 내용 확인 및 삭제)

  • dir명령어 : readdir, unlink, rmdir
  • 폴더 안 내부 파일과 폴더명 확인 : readdir
  • 파일 삭제 : unlink
  • 폴더 삭제 : rmdir

기타 fs메서드

(파일 복사)

  • fs.copyFile('readme.txt', 'writeme.txt')
    : readme의 내용이 writeme로 복사
  • fs.watch('./target.txt', (eventType, filename) => { ... });
    : 내용물이 수정 혹은 삭제될 경우 => 뒤의 콜백 함수가 실행
  • fs.existsSync(fs.access와 비슷)
    : 파일이나 폴더가 존재하는지 확인
  • fs.stat( ... )
    : 찾는 게 폴더인지 파일인지 바로가기인지 뭔지 확인 가능

필요한 거 있으면 공식 문서에서 찾아서 사용한다.

스레드풀과 커스텀 이벤트

스레드풀

fs, crypto, zlib 모듈의 메서드는 백그라운드에서 동시에 실행

const crypto = require('crypto');

const pass = 'pass';
const salt = 'salt';
const start = Date.now();

crypto.pbkdf2(pass, salt, 1_000_000, 128, 'sha512', () => {
    console.log('1', Date.now() - start);
});   
  • 'sha512'알고리즘을 백만번(1_000_000) 적용
  • 'Date.now() - start'를 통해 시작과 끝 시간이 표시된다

이제 이 crypto를 8번 반복하면 다음과 같다.

이 코드를 여러 번 실행시켜보면

1-4, 5-8 묶어서 실행됨을 알 수 있다.
=> 코어 4개씩 동시에 돌린다

사용하는 코어 개수를 조절하고자 하면 콘솔에

SET UV_THREADPOOL_SIZE=(개수)

명령어를 사용한다.

이벤트

이벤트 등록 -> 나중에 호출해서 콜백 함수를 실행할 수 있다

이벤트를 로드하여 사용하는 방식은 다음과 같다.

const EventEmitter = require('events');

const myEvent = new EventEmitter();

이벤트 사용 방식은 다음과 같다.

myEvent.addListener('event', () => {
	console.log('이벤트1');
});
myEvent.on('event2', () => {
  console.log('이벤트2');
});  
myEvent.on('event2', () => {    //event2에 on을 여러 개 생성 가능
  console.log('이벤트2 추가');
});
myEvent.once('event3', () => {   // 한 번만 실행됨
  console.log('이벤트3');
});
  • addListener(event, listener) : 이벤트 생성 메서드
  • on(event, listener) : addListener과 동일, 이벤트 생성 메서드(같은 이벤트 콜백 여러개 가능)
  • once(event, listener) : 한 번만 실행되고 다음은 실행되지 않음
myEvent.emit('event1');    //이벤트 호출

myEvent.emit('event3');    // on 이벤트 호출
myEvent.emit('event3');    // 실행 안됨(once라서)

myEvent.removeAllListeners('event1');
myEvent.removeListener('event2');
myEvent.listenerCount('event3');
  • emit(event) : 이벤트 호출
  • removeAllListeners(event4) : event4에 엮여있는 콜백 함수를 모조리 삭제
  • removeListener(event5) : 콜백 함수 삭제, 어떤 콜백 함수인지 지정 필요
  • listenerCount(event5) : 콜백 함수가 몇 개 등록되어 있는지

에러 처리하기

기본적으로 try - catch 사용

try - catch가 필요없는 경우도 있음

에러 발생해도 프로세스 멈춤 없음

promise 사용

promise의 에러는 따로 처리 x

  • 에러가 발생했다고 프로세스가 멈추진 않음
  • catch를 쓰지 않은 경우 경고창이 좀 길게 출력된다
    (노드 버전이 올라가면 강제종료 될 수 있다는 경고)

에러 한번에 처리

process 객체에 event를 달음('uncaughtException')

단순히 에러를 기록해주는 용도

복구 작업용으로 사용하는 것은 부적합 : 복구 코드가 동작하는 것을 node가 보장해주지 않음
=> 빨리 알림을 받아서 코드를 수정하는 것이 좋음

프로세스 종료하기

func.jsindex.js

0개의 댓글