본문 바로가기

ComputerScience/NodeJs

node - 3.7 이벤트 이해하기 ~ 3.8 예외처리

728x90
 

더북(TheBook): Node.js 교과서 개정 2판

 

thebook.io

* 위 내용을 정리하였음

3.7 이벤트 이해하기

- 스트림을 공부할때 on('data', 콜백), on('end', 콜백)을 사용했다. 이는 data, end이벤트가 발생할 때 콜백 함수를 호출하도록 이벤트를 등록한 것이다. createReadStream의 경우 내부적으로 알아서 data, end 이벤트를 호출한다.

- 이번에는 직접 이벤트를 만들고 호출, 삭제해본다.

const EventEmitter = require('events');

const myEvent = new EventEmitter();
myEvent.addListener('event1', () => {
  console.log('이벤트 1');
});
myEvent.on('event2', () => {
  console.log('이벤트 2');
});
myEvent.on('event2', () => {
  console.log('이벤트 2 추가');
});
myEvent.once('event3', () => {
  console.log('이벤트 3');
}); // 한 번만 실행됨

myEvent.emit('event1'); // 이벤트 호출
myEvent.emit('event2'); // 이벤트 호출

myEvent.emit('event3');
myEvent.emit('event3'); // 실행 안 됨

myEvent.on('event4', () => {
  console.log('이벤트 4');
});
myEvent.removeAllListeners('event4');
myEvent.emit('event4'); // 실행 안 됨

const listener = () => {
  console.log('이벤트 5');
};
myEvent.on('event5', listener);
myEvent.removeListener('event5', listener);
myEvent.emit('event5'); // 실행 안 됨

console.log(myEvent.listenerCount('event2'));

- on(이벤트명, 콜백) : 이벤트 이름과 이벤트 발생 시의 콜백을 연결한다.

- addListener(이벤트명, 콜백) : on 이랑 동일

- emit(이벤트명) : 이벤트 호출, 미리등록한 이벤트 콜백이 실행됨

- once(이벤트명, 콜백) : 딱 한번만 실행되는 이벤트 이다. 여러번 호출하더라도 딱 한번만 실행된다.

- removeAllListeners(이벤트 명) : 이벤트에 연결된 모든 이벤트 리스너를 제거한다.

- removeListener(이벤트명, 리스너) : 이벤트에 연결된 리스너를 하나씩 제거

- off(이벤트명, 콜백) : removeListener와 동일

- listerCount(이벤트명) : 이벤트 명에 리스너(콜백)가 몇개 연결되어 있는지 확인

3.8 예외 처리하기

- 노드의 메인 스레드는 하나뿐이므로 에러로 인한 프로세스 종료를 방지해야 한다.

- 즉 에러가 발생하더라도 로그는 기록하되 작업은 계속 진행 되어야 한다.

setInterval(() => {
  console.log('시작');
  try {
    throw new Error('서버를 고장내주마!');
  } catch (err) {
    console.error(err);
  }
}, 1000);

- setInterval로 계속 반복하게 하여 에러가 발생했을때 프로세스가 멈추는지 확인해보자.

- 에러가 발생해도 catch문에서 기록을 남기고 프로세스는 작업을 계속한다.

const fs = require('fs');

setInterval(() => {
  fs.unlink('./abcdefg.js', (err) => {
    if (err) {
      console.error(err);
    }
  });
}, 1000);

- 프로미스의 에러는 catch를 하지 않아도 알아서 처리하지만 웬만하면 붙여주자.

process.on('uncaughtException', (err) => {
  console.error('예기치 못한 에러', err);
});

setInterval(() => {
  throw new Error('서버를 고장내주마!');
}, 1000);

setTimeout(() => {
  console.log('실행됩니다');
}, 2000);

- 프로세스에 예상치 못한 에러가 발생했을때 이벤트를 등록해두면 setInterval에서 발생한 에러를 로그에 남기고 프로세스는 유지된다.

- 이 방법은 최후의 수단으로, 로깅 목적으로 사용하자.

 

*맥, 리눅스에서 프로세스 종료하기

lsof - i tcp:포트

- 3000번 포트에 이미 다른 프로세스가 연결되어있다면? 터미널에서 위의 명령을 수행한 결과 프로세스 아이디가 12345일때,

kill -9 프로세스 아이디

- 를 하면 해당 3000번에 연결된 프로세스를 종료할 수 있다.

728x90
반응형