Node js 동작 원리

Node js 동작 원리

Index

1. Node js 란?

2. Node js 동작 원리

1. Node js란?

Node js 는 구글의 크롬 V8 자바스크립트 엔진을 기반으로 한 고성능 네트워크 서버이다. Single Thread 기반의 Event Loop를 기반으로 하고 있으며 File, Network 등에 대해서 비동기 IO 처리를 하는 서버 미들웨어이다. 또한 Single Thread 이벤트 기반이기 때문에 Multi Thread 프로그래밍에서의 가장 큰 문제점인 자원에 대한 동시접근 문제가 발생하지는 않는다. -> 자원의 접근 순서는 보장할 수 없다.
Node js가 Single Thread 기반이기 때문에 Spring과 같은 Multi Thread 방식을 채택하는 서버 프레임워크보다 Context Switching이 적어 빠르다는 것은 맞지 않는 말이라고 한다.
Node js 또한 I/O처리에서 내부적으로는 libio의 Thread Pool에 의해 동작하기 때문에 Node js 또한 Disk , DB 접근이 많은 작업에 대해서는 유리하지 않으며 오히려 Servlet이 빠르다고 한다. -> Node js는 I/O 작업이 적은 메시징 작업에서 유리하다.
Node js는 JavaScript를 기반으로 하기 때문에 프론트 개발자가 서버까지 개발할 수 있다는 장점과 JSON 사용, npm을 통한 모듈 관리등을 장점으로 하기 때문에 생산성에 대한 부분에서도 상당히 높다.
또한 현재 Http 통신에 있어서 JSON 형식을 사용한 데이터 전송이 많아지고 있는데 Node js를 사용하게 되면 이 부분에 대한 코드의 양도 적어지고 다루기가 쉬워진다.
Node js가 인기 있는 이유는 수준 높은 실력을 필요로 하던 백엔드 개발에 대해 진입장벽을 낮추어 프론트 엔트의 개발자 또한 빠르게 개발할 수 있다는 것이다. 그리고 node js의 모듈중의 하나인 socket.io는 HTML5의 WebSocket의 단점을 보완해 준다.
HTML 5의 웹소켓이 좋은 기술이지만 웹소켓은 브라우져 호환성의 문제가 있다. Socket.io는 웹소켓을 포함해 롱 폴링, 스트림 등의 방식을 모두 추상화 하였기 때문에 브라우져에 상관없이 Socket.io를 통해 푸쉬를 구현할 수 있게 해준다.
Node js는 단점 또한 가지고 있는데 하나의 작업 자체가 시간이 많이 걸리면 전체 시스템의 성능이 아주 급격하게 떨어진다. 그래서 CPU bound가 낮은 작업 위주로 개발이 되어야 한다. -> 만약 많은 CPU bound를 가지는 작업이 생긴다면 이를 분할하여 SetTimeOut() 함수 호출을 통해 이벤트 큐에 분할로 넣어주는 방식으로 처리할 수 있다.
또한 Node js는 비동기 처리를 기본으로 하기 때문에 여기서 오는 Callback 함수의 중첩(Callback hell) 에 대한 문제도 생긴다. -> waterfall과 같은 라이브러리를 사용해 어느정도 해결할 수 있다.

####### 원문 http://bcho.tistory.com/876

2. Node js 동작 원리

Nodejs 동작도

Node Js는 기본적으로 V8엔진을 통해 Single Thread로 동작하게 된다. 하지만 Node js의 특성상 비동기식 I/O를 채택하고 있기 때문에 어떠한 I/O가 발생하게 되면 libio의 ThreadPool에 작업을 전달하게 되고 I/O가 완료되게 되면 EventQueue에 CallBack 함수가 쌓이게 된다.
1
2
3
4
connection.query('insert into table values('2','3')', function(result,err)
{
console.log(result);
});
만약 위와 같이 DB Connection을 통해 DB에 쿼리를 날리는 경우가 발생하면 ‘insert ‘문에 대한 DB IO가 발생하게 된다. Node js는 이 작업에 대해 완료될 때 까지 기다리지 않고 다른 작업을 처리하고 있다가 I/O가 완료되면 callback 함수를 EventQueue에 집어 넣는다. EventLoop는 항상 돌고 있다가 V8 엔진의 호출스택이 모두 종료(모든 작업을 실행하고 남아 있는 작업이 없을 경우) EventQueue에서 작업을 꺼내어 처리하게 된다.
또한 Node js가 ThreadPool을 사용하는 이유중에 하나는 시스템에서 Non blocking을 지원하지 않아 Blocking이 발생하는 함수에 대해 호출이 일어났을 경우 이를 Thread에 할당해 처리한뒤 i/o작업이끝나면 callback을 리턴해주어 non blocking처럼 작동할 수 있도록 한다.
공유하기