Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
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
Tags
more
Archives
Today
Total
관리 메뉴

wintertreey 님의 블로그

이벤트, 예외처리 본문

Node

이벤트, 예외처리

wintertreey 2024. 8. 11. 16:24

Event 모듈

Node.js 에선 Event를 매우 많이 사용하고, 이 때문에 다른 비슷한 기술들보다 훨씬 빠른 속도를 자랑합니다.

Node.js 기반으로 만들어진 서버가 가동되면, 변수들을 initialize 하고, 함수를 선언하고 이벤트가 일어날때까지 기다립니다.

이벤트 위주 (Event-Driven) 어플리케이션에서는, 이벤트를 대기하는 메인 루프가 있습니다.
그리고 이벤트가 감지되었을시 Callback함수를 호출합니다.

 

 

이벤트가 콜백과 비슷해 보일 수 도 있습니다.

차이점은, 콜백함수는 비동기식 함수에서 결과를 반환할때 호출되지만,
이벤트핸들링은 옵저버 패턴에 의해 작동됩니다.

 

이벤트를 대기하는 (EventListeners)  함수들이 옵저버 역할을 합니다.

옵저버들이 이벤트를 기다리다가, 이벤트가 실행되면 이벤트를 처리하는 함수가 실행됩니다.

 

Node.js에서는 이벤트 모듈과 EventEmitter 클래스가 내장되어 있는데, 이를 사용하여 이벤트와 이벤트 핸들러를 연동시킬 수 있습니다.

이벤트 모듈을 사용하려면 require() 메소드를 이용하여 로드하고, 그 객체를 통해 EventEmitter 클래스를 로드하여 사용하는 것이 일반적입니다.


 

EventEmitter 객체를 사용해 이벤트와 이벤트 핸들러를 연결해 동기적으로 호출한다.

 

//이벤트 처리: events 모듈을 사용
// EventEmitter 객체를 사용하여 이벤트와 이벤트 핸들러를 연결해 동기적으로 호출

import { EventEmitter } from "events";

const myEvent = new EventEmitter(); //이벤트 객체 생성

myEvent.addListener('event1', () => {
    console.log('이벤트1');
});
myEvent.on('event2', () => { //addListener()와 같은의미
    console.log('이벤트2'); 
});
myEvent.on('event2', () => { 
    console.log('이벤트2 추가'); 
});
myEvent.once('event3', () => { //1회만 수행
    console.log('이벤트3 추가'); 
});

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

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

const listener = () => {
    console.log('이벤트5');
}
myEvent.on('event5', listener); //이벤트연결
myEvent.emit('event5');
myEvent.off('event5', listener); //이벤트해제
myEvent.emit('event5');

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

console.log('--- 매개 변수 전달 --------------');
class MyEmitter extends EventEmitter{};

const myEmitter = new MyEmitter();
myEmitter.on("ev", () => {
    console.log("이벤트 처리");
})
myEmitter.emit("ev");

const myEmitter2 = new MyEmitter();
myEmitter.on("ev", (a, b) => {
    console.log("이벤트 처리: ", a, b);
})
myEmitter2.emit("ev", "쉬고", "갑시다");

 

 출력물을 참고하여 각 이벤트들의 특성을 파악하자.

 

 


구구단을 통해 이벤트 처리를 연습해보자.

import { EventEmitter } from "events";
import readline from 'readline';

const myEvent = new EventEmitter(); //이벤트 객체 생성

//키보드 입력을 위한 readline 인터페이스 생성
// input 스트림에서 데이터를 읽고, output 스트림으로 데이터를 쓸 수 있게 함.
const inout = readline.createInterface({
    input:process.stdin,
    output:process.stdout,
})

const printGugu = (dan) => {
    console.log(`\n구구단 ${dan} 출력`);
    for (let index = 1; index <= 9; index++) {
        console.log(`${dan} x ${index} = ${dan * index}`);
    }
};

myEvent.on('gugu', (dan) => {
    printGugu(dan);
    inout.close();
})

//question(query, callback)
inout.question('출력할 단 입력:', (input) => {
    const dan = parseInt(input, 10);

    if(!isNaN(dan)) {//숫자가 들어온경우
        myEvent.emit('gugu', dan);
    }else{
        console.log('단은 숫자로 입력하시오');
        inout.close();
    }
});

 

 


예외처리

node에서 에러처리는 매우 중요하다.
node는 1개의 스레드만 사용할 수 있기 때문에 소중히 다뤄야한다.


try ... catch 구문을 활용하면된다. 

import readline from 'readline';

const inout = readline.createInterface({
    input:process.stdin,
    output:process.stdout,
})

const divide = (a, b) => {
    if(b === 0){
        throw new Error('0으로 나눌 수 없음');
    }
    return a / b;
}

//question(query, callback)
inout.question('첫번째 숫자 입력:', (num1) => {
    inout.question('두번째 숫자 입력:', (num2) => {
        try {
            const a = parseFloat(num1);
            const b = parseFloat(num2);

            if(isNaN(a) || isNaN(b)){
                throw new Error('숫자를 입력하시오');
            }
            const result = divide(a, b);
            console.log(`${a}를/을 ${b}로 나눈 결과는 ${result}`);
        } catch (error) {
            console.error('오류발생: ', error.message);
        }finally{
            inout.close();
        }
    });
});

 

 


https://inpa.tistory.com/entry/NODE-%F0%9F%93%9A-require-%EB%AA%A8%EB%93%88

 

[NODE] 📚 Event 모듈 (이벤트 제어)

Event 모듈 Node.js 에선 Event를 매우 많이 사용하고, 이 때문에 다른 비슷한 기술들보다 훨씬 빠른 속도를 자랑합니다. Node.js 기반으로 만들어진 서버가 가동되면, 변수들을 initialize 하고, 함수를 선

inpa.tistory.com

 

'Node' 카테고리의 다른 글

회원 CRUD, splice()  (0) 2024.08.13
경로세팅, 라우팅, cors에러  (0) 2024.08.11
웹서버 모듈: http, figlet, express, nodemon  (1) 2024.08.11
동기 비동기  (0) 2024.08.11
Node.js 개념  (0) 2024.08.08