Node.js에서 비동기의 개념
Node.js 란?
Node.js는 브라우저 밖에서 실행할 수 있는 Javascript 실행환경이다. 과거 Javascript는 브라우저에서만 사용 되었지만 현재는 다양한 개발 분야에서 사용되고 있다.
Node.js의 특징
1.크롬에서 사용되는 V8 엔진을 사용한다.
2.단일 쓰레드 이벤트 루프 기반이며 I/O를 비동기식 처리한다.
3.방대한 모듈 시스템을 갖추고 있다.
동기와 비동기의 차이점은 무엇일까?
동기(synchronous: 동시에 일어나는)
동기는 말 그대로 동시에 일어난다는 뜻이다. 요청과 그 결과가 동시에 일어난다는 약속인데 요청을 하면 시간이 얼마나 걸리던지 요청한 자리에서 결과가 주어져야 한다. 동기방식은 설계가 매우 간단하고 직관적이다. 하지만 결과가 주어질 때까지 아무것도 못하고 대기해야 한다는 단점이 있다.
- 요청한 결과가 한자리에서 동시에 일어남
- A노드와 B노드 사이의 작업 처리 단위(transaction)을 동시에 맞추겠다.
비동기(Asynchronous: 동시에 일어나지 않는)
비동기는 동시에 일어나지 않는다는 의미이다. 요청한 결과는 동시에 일어나지 않을거라는 약속이다. 비동기 방식은 동기보다 복잡하고 결과가 주어지는데 시간이 걸릴 수 있지만 그 시간 동안 다른 작업을 할 수 있기에 자원을 효율적으로 사용할 수 있다는 장점이 있다.
- 요청한 그 자리에서 결과가 주어지지 않음
- 노드 사이의 작업 처리 단위를 동시에 맞추지 않아도 된다.
동기와 비동기는 한 마디로
동기와 비동기는 어떤 작업 혹은 그와 연관된 작업을 처리하고자 하는 시각의 차이이다. 동기는 추구하는 행위(목적)이 동시에 이루어지고, 비동기는 추구하는 행위(목적)이 다를 수도 있고, 동시에 이루어지지도 않는다.
Node.js에서 비동기
Node.js는 비동기 IO를 지원하며 Single-Thread 기반으로 동작하는 서버이다. Node서버는 비동기 방식으로 요청을 처리하므로 요청을 처리하면서 다음 요청을 받을 수 있다. 또한 병렬처리를 Thread로 처리하지 않으므로 Multi-Thread가 갖는 근원적인 문제에서 자유롭다.
Node.js의 비동기 처리는 이벤트 방식으로 풀어낸다. 클라이언트의 요청을 비동기로 처리하기 위하여 이벤트가 발생하며 서버 내부에 메세지 형태로 전달된다. 서버 내부에서는 이 메세지를 Event Loop가 처리한다. Event Loop가 처리하는 동안 제어권은 다음 요청으로 넘어가고 처리가 완료되면 Callback을 호출하여 처리완료를 호출측에 알려준다.
Event Loop는 요청을 처리하기 위하여 내부적으로 약간의 Thread와 프로세스를 사용한다. 이는 Non-Blocking IO 또는 내부 처리를 위한 목적으로만 사용되지 요청 처리 자체를 Thread로 하지는 않는다. 따라서 Node 서버는 Multi-Thread 방식의 서버에 비하여 Thread 수와 오버헤드가 훨씬 적다.
이벤트를 처리하는 Event Loop는 Single-Thread로 이루어져 있다. 즉 요청 처리는 하나의 Thread안에서 처리된다는 의미이다. 그래서 이벤트 호출 측에는 비동기로 처리된지만 처리작업 자체가 오래 걸린다면 전체 서버 처리에 영향을 준다. 이는 Node.js의 치명적인 약점이라고 볼 수 있다.