|
| 1 | +# node.js |
| 2 | + |
| 3 | +## node.js란? |
| 4 | + |
| 5 | +* javascript를 브라우저가 아닌 다른 환경에서 사용할 수 있게 해주는 것 |
| 6 | +* V8 엔진으로 빌드된 javascript의 새로운 **런타임** (기존에는 web browser만 존재) |
| 7 | + |
| 8 | +> **런타임**이란? |
| 9 | +> |
| 10 | +> 프로그램이 실행되고 있는 환경 (어디에서 실행되는지) / 컴파일 과정을 마친 프로그램이 사용자에 의해 실행되어 응용프로그램이 동작되는 순간을 런타임이라 한다. |
| 11 | +> |
| 12 | +> javascript는 인터프리터 언어 |
| 13 | +
|
| 14 | +## 특징 |
| 15 | + |
| 16 | +1. javascript를 사용 |
| 17 | +2. 단일 스레드 이벤트 루프 기반 |
| 18 | +3. Non-blocking I/O (비동기) |
| 19 | +4. 방대한 모듈 생태계 (NPM) |
| 20 | + |
| 21 | +#### 1. javascript를 사용 |
| 22 | + |
| 23 | +아래의 특징은 javascript를 이용해서 나타나는 특징 |
| 24 | + |
| 25 | +#### 2. 단일 스레드 이벤트 루프 기반 |
| 26 | + |
| 27 | +node.js 자체는 멀티 스레드 |
| 28 | + |
| 29 | +javascript 엔진에는 외부 요청에 대한 처리를 하는 단일 호출 스택이 존재하는데, 이 단일 호출 스택과 node.js의 다양한 스레드를 연동하기 위해 사용하는 장치가 **이벤트 루프**이며, 이 이벤트 루프가 단일 스레드 이다. |
| 30 | + |
| 31 | +##### 장점 |
| 32 | + |
| 33 | +* 수 많은 요청에 대해 순차적으로 처리할 필요 없이 워커 스레드에 작업 처리를 위임하고, 작업이 끝나는 순서대로 이벤트를 받아서 응답 => 대규모 네트워크 프로그램을 개발하기에 적합 |
| 34 | +* 요청의 수와 상관 없이 메인 스레드는 하나이기 때문에 메모리 사용량과 시스템 리소스 사용량에 변화가 거의 없다 |
| 35 | +* 서버 부하가 적다 |
| 36 | + |
| 37 | +##### 단점 |
| 38 | + |
| 39 | +* context switching 비용이 크다 |
| 40 | +* 많은 요청을 처리하기엔 적합하지만, 큰 단일 처리가 필요한 요청에는 적합하지 않다. |
| 41 | +* 메인 스레드가 무너지면 전체 프로그램에 문제 발생 |
| 42 | + |
| 43 | +#### 3. Non-blocking I/O (비동기) |
| 44 | + |
| 45 | +워커 스레드는 비동기 방식으로 I/O를 관리한다. |
| 46 | + |
| 47 | +따라서 프로그램의 흐름을 막지 않고 (non-blocking) 동시에 여러 작업을 수행한다. |
| 48 | + |
| 49 | +#### 4. 방대한 모듈 생태계 (NPM) |
| 50 | + |
| 51 | +npm 에 등록된 수 많은 라이브러리, 패키지 사용 가능 |
| 52 | + |
| 53 | +## node.js 어떤 서버에 사용? |
| 54 | + |
| 55 | +* 작고 빈번한 요청을 처리하는 서비스 |
| 56 | + * 단일 스레드이기 때문에 하나의 커다란 요청보다 간단한 요청 처리 |
| 57 | + * 스트리밍, 채팅 등 작고 빈번한 요청의 서비스들 |
| 58 | + * 비동기로 요청을 처리하기 때문에 처리가 끝나면 바로 응답 |
| 59 | +* 로직이 간단한 서비스 |
| 60 | + * node.js는 런타임에 에러가 발생할 수 있기 때문에 복잡도가 높아질수록 위험도가 높아짐 |
| 61 | + * 서버에서 체크 로직이 많으면 callback 지옥에 빠질 수 있음 |
| 62 | + * 예외 처리를 꼭 해줘야함 |
| 63 | +* 빠르게 개발해야 할 때 |
| 64 | + * npm 생태계 |
| 65 | +* 데이터 포맷으로 JSON을 사용할 때 |
| 66 | + * MongoDB / ES 등을 사용한다면 시너지 발생 |
| 67 | + |
| 68 | + |
| 69 | + |
| 70 | + |
| 71 | + |
| 72 | +### 참고 |
| 73 | + |
| 74 | +* https://velog.io/@jjunyjjuny/%EB%B0%B1%EC%97%94%EB%93%9C%EB%8A%94-%EC%B2%98%EC%9D%8C%EC%9D%B4%EB%9D%BC..-2.-Node.js%EB%A1%9C-%EB%B0%B1%EC%97%94%EB%93%9C%EB%A5%BC-%EA%B5%AC%EC%84%B1%ED%95%9C%EB%8B%A4%EB%8A%94-%EA%B2%83%EC%9D%80 |
0 commit comments