JavaScript/Node.js

비동기 프로그래밍

검정비니 2018. 7. 31. 17:50
728x90
반응형

비동기 프로그래밍



일반적으로 파일 I/O나 네트워크 I/O는 메모리 I/O보다 현저히 느리다. 예를 들어 파일 4개의 입출력을 하나씩 처리한다면, 처리 시간은 길어지고 CPU의 사용 효율성은 떨어지게 된다. 이를 개선하고자 비동기 프로그래밍을 사용하는데, 순차적으로 I/O를 처리하는 것이 아니라 I/O 처리 요청만 운영체제에 전달하고 CPU는 다른 연산을 수행한다. I/O 처리가 완료되면 운영체제에서 I/O 처리를 완료했다는 메시지를 전달받아 이후 작업을 처리하는 방식이다.


참고로, 비동기 프로그래밍은 I/O 처리 요청 순서와 별개로 처리를 완료하는 순서는 제각각이다. 따라서 개발자는 보장되지 않는 I/O 완료 처리를 고려해 프로그래밍을 해야 한다.


Node.js는 모든 함수와 모듈이 비동기 프로그래밍을 기본으로 한다. 동기 방식 함수들이 약간 있지만 제한적이기 때문에 비동기 프로그래밍에 익숙해질 필요가 있다.


또한, 콜백 함수를 이용해서 비동기 프로그래밍을 할 때에, 예외 처리를 신경써서 해야만 한다. 콜백이 동작할 때에, 콜백 함수를 위한 스레드가 생성되면서 멀티 스레딩 방식으로 동작을 하게 된다. 기본적으로, try-catch 문은 같은 스레드 내에서의 예외만 처리가 가능하기 때문에 콜백 함수에 의해 생긴 스레드 내에서 발생한 예외는 적절한 위치에 try-catch문을 사용하지 않으면 예외를 처리하지 못하게 된다. 이 점을 주의해야 한다.


이러한 다른 스레드에서 발생하고 처리하지 못한 모든 예외들을 처리하는 방식으로는 'uncaughtException' 이벤트의 활용이 있다. Node.js는 모든 스레드에서 예외 처리를 할 수 있도록 uncaughtException 이벤트를 제공한다. 다음 예제를 통해서 그 사용법에 대해서 알아보도록 하자.


i.e.

function func(callback) {

process.nextTick(callback, "callback!!");

}


try {

func( (param) => {

a.a = 0; //"ReferenceError: a is not defined" 발생

});

} catch (e) {

console.log("exception!");

}


process.on("uncaughtException", (error) => { //모든 스레드에서 발생하는 예외 처리

console.log('uncaughtException occurred!!');

});


위의 코드를 실행 시키게 되면 "uncaughtException occurred!!"가 출력될 것이다. 콜백 함수가 동작하면서 새로 생긴 스레드에서 발생한 ReferenceError를 try-catch 문이 잡지 못하자, process.on 을 통해 uncaughtException 이벤트를 사용해서 제어하게 되면서 'uncaughtException occurred!!' 메세지가 출력된 것이다.

반응형