일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- nodejs
- 토이프로젝트
- AWS
- 서버구축
- Algorithm
- 리액트
- BFS
- spring
- 동적프로그래밍
- 자료구조
- sort
- 정렬
- 백준
- 알고리즘
- react
- 백준알고리즘
- 다익스트라 알고리즘
- java
- 완전탐색
- url parsing
- 라우터
- 탐욕법
- mysql
- ELB
- 스터디
- EventListener
- Router
- 브루트포스
- EC2
- Spring Boot
- Today
- Total
공부하는 블로그
Node.js | Introduction 본문
Node.js
Node.js는 Chrome V8 엔진으로 빌드된 이벤트 기반 JavaScript 런타임으로 대부분의 JavaScript가 웹 브라우저에서 실행되는 것과는 달리 서버측에서 실행된다. Non-blocking I/O와 단일 스레드 이벤트 루프를 통한 높은 처리성능을 가지고 있다. 내장 HTTP 서버 라이브러리를 포함하고 있어 웹 서버에서 아파치 등의 별도의 소프트웨어 없이 동작하는 것이 가능하며 이를 통해 웹 서버의 동작에 있어 더 많은 통제를 가능하게 한다.
* Chrome V8 : 웹 브라우저를 만드는데 기반을 제공하는 오픈 소스 자바스크립트 엔진
Non-blocking I/O & Single-Thread
서버는 중앙집중형태로 클라이언트의 요청을 받아 병목현상이 발생하기 쉬우며 처리 성능에 항상 주목해야한다. 클라이언트의 요청이 많은 경우 발생하는 병목구간을 분석해보면 대부분 프로그램 로직보다는 입출력(I/O)에서 발생하게 된다. 이와 같이 서버에서 I/O를 처리하다가 지연이 발생하면 다른 요청들은 처리되지 못하고 계속 대기하는 현상이 발생한다. 그래서 대부분의 기업형 서버 플랫폼들은 이 문제를 해결하기 위해 사용자의 요청을 쓰레드(Thread)로 처리하고 있다.
* Thread : 서버 CPU 자원을 시분할 형태로 나누어 가짐으로써 독립실행이 가능하며 다른 요청을 동시에 받을 수 있게 한다.
그러나 Multi-Thread 방식은 클라이언트의 요청마다 쓰레드를 발생시켜 동시 접속자 수가 많을 수록 많은 쓰레드가 발생하게 되어 메모리 자원을 많이 소모하게 된다. 서버의 자원은 제한되어 있으므로 일정 수 이상의 쓰레드는 발생시킬 수 없고 이를 해결하기 위해 서버를 업그레이드 하거나 분산처리를 해주어야 한다.
동기 방식의 처리는 하나의 요청이 처리되는 동안 다른 요청이 처리되지 못하며 요청이 완료되어야만 다음 처리가 가능한 방식이다. 따라서 동기 방식은 I/O 처리를 Blocking하게 되고 이 문제를 Thread로 처리하거나 비동기 방식으로 처리할 수 있다. 비동기 방식은 하나의 요청 처리가 완료되기 전에 제어권을 다음 요청으로 넘긴다. 따라서 비동기방식은 I/O 처리가 Blocking 되지 않으며 다음 요청을 처리할 수 있다. Node.js는 바로 이와 같은 방식으로 병렬처리를 한다.
Node.js는 비동기 I/O를 지원하며 Single-Thread를 기반으로 동작하는 서버이다. Node 서버는 비동기 방식으로 요청을 처리하므로 요청을 처리하는 동시에 다음 요청을 받을 수 있다. 또한 병렬처리를 Thread로 처리하지 않으므로 Multi-Thread가 갖는 메모리 문제에서 자유롭다.
※ Synchronous vs Asynchronous
동기적 처리의 경우에는 코드를 진행함에 있어서 이전의 처리가 모두 끝나야 다음 처리로 넘어간다.
비동기적 처리의 경우에는 코드를 진행함에 있어서 이전의 처리가 모두 끝나지 않아도 다음 처리로 넘어가며 Callback 함수로 처리 결과를 받을 수 있다.
Event Loop
Node.js의 비동기 처리는 이벤트 방식으로 풀어낸다. 클라이언트의 요청을 비동기로 처리하기 위해서 이벤트가 발생하며 서버 내부에 메세지 형태로 전달된다. 서버 내부에서는 이 메세지를 이벤트 루프(Event Loop)가 처리한다. 이벤트 루프가 처리하는 동안 제어권은 다음요청으로 넘어가고 처리가 완료되면 CallBack을 호출하여 처리완료를 호출측에 알려준다. 즉, 이벤트 루프는 이벤트를 기다렸다가 전송해주는 프로그램이다.
※ Node.js의 약점?
Single-Thread로 이루어져 있으므로 처리작업 자체가 오래걸린다면 전체 서버 처리에 영향을 주게 된다. 따라서 처리 작업이 CPU를 많이 소모한다든지 대용량 파일을 처리하는 작업이라면 Node.js에 부적합하다.
'Node.js' 카테고리의 다른 글
Node.js | GET & POST 요청에 응답하기 (0) | 2019.12.17 |
---|---|
Node.js | URL parsing - 요청에 응답하기 (1) | 2019.12.17 |
Node.js | HTTP 웹서버 구축 & File System (0) | 2019.12.17 |
Node.js | Module & Node Package Manager(NPM) / PM2 (0) | 2019.12.16 |
Node.js | Node.js 설치 (0) | 2019.12.12 |