포스트

노드 학습 7일차

스레드풀과 커스텀 이벤트

스레드풀

기본 설정 기준 스레드풀에서 스레드는 4개씩 동작합니다. 가지고 있는 컴퓨터의 코어가 6개, 8개라 하여도 4개씩 수행됩니다.
보다 효율적으로 사용하기 위해서는 다음의 명령어로 수정할 수 있습니다.

UNIX 운영 체제 기준

UV_THREADPOOL_SIZE = {SIZE}

윈도우 운영 체제 기준

SET UV_THREADPOOL_SIZE = {SIZE}

커스텀 이벤트

events 모듈을 사용하여 커스텀 이벤트를 만들 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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.addListener('event1',()=>{
    console.log('addEventListener 에도 동일하게 콜백이 추가 되는지 확인하기 위한 이벤트 추가');
})

myEvent.once('event3',()=>{ // 한번만 실행되는 이벤트 트리거
    console.log('이벤트 3. 한번만 실행됨');
})

myEvent.emit('event1');
myEvent.emit('event2');

myEvent.emit('event3'); // 최초 1회 실행
myEvent.emit('event3'); // 실행 되지 않음

myEvent.on('event4',()=>{
    console.log('이벤트 4');
})

myEvent.on('event4',()=>{
    console.log('removeAllListeners와 removeListener 를 비교하기 위해 이벤트 리스너 2개 등록');
})

myEvent.removeAllListeners('event4'); // event4 이벤트 전체 삭제

myEvent.emit('event4');

const callback1 = (stream) =>{
    console.log('이벤트5');
}

const callback2 = (stream) =>{
    console.log('removeListener 테스트용');
}

myEvent.on('event5',callback1)
myEvent.on('event5',callback2)


myEvent.removeListener('event5',callback1); // callback1 은 삭제되고 callback2 만 남음

myEvent.emit('event5');

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

에러 핸들링

에러 발생 시 노드의 스레드를 중지 시키기 때문에 반드시 해야합니다.
그렇기 때문에 에러를 발생시킬 수 있는 곳에서는 try-catch를 통한 에러 핸들링을 해야합니다.
단 콜백 기반에서 전달해주는 에러와 프로미스의 catch는 서버를 중단시키지 않는 에러이기 때문에 적절한 핸들링 작업은 필요하지만 무분별하게 try-catch를 사용할 필요는 없습니다.
마지막 수단으로 process 객체 자체에서 에러를 핸들링하는 방법도 있습니다.

1
2
3
4
5
6
7
8
9
10
11
process.on('uncaughtException',(err)=>{
    console.error('예상치 못한 에러',err);
})

setInterval(() => {
    throw new Error('서버 대폭팔!');
}, 1000);

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

하지만 이 방법은 문제를 해결할 수 있는 수단이 되지 않기 때문에 에러를 기록하는 용도로 사용하는 것이 좋습니다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.