-
[Node.js] Node.js 란 무엇인가?Framework | Test/Node.js 2022. 2. 26. 16:18
※본 포스팅은 개인 학습을 목적으로 작성된 것이므로 정확하지 않은 정보가 포함되어 있을 수 있음을 참고 부탁드립니다.
Node.js 란?
Node.js는 서버사이드 자바스크립트이며 구글의 자바스크립트 엔진인 V8을 기반으로 구성된 일종의 소프트웨어 시스템이다.
👉 Node.js를 공부하기 전에는 Spring과 같은 프레임워크와 비슷하구나 라고 생각했었는데, 자바스크립트 런타임(프로그램을 실행할 수 있는 환경) 정도로 정리되는 것 같다.
그러면 Node.js에서는 어떤 프레임워크를 사용할까?
👉 Express, Koa, Hapi와 같은 프레임워크가 있는데 그 중 Express가 가장 유명하다. 내가 프로젝트를 하면서 적용했던 이유도 가장 유명해서인데, 또 다른 블로그에 따르면 코드의 양이 줄고 추후 유지보수가 쉽다는 장점이 있다고 한다.
Node.js 의 등장 배경과 컨셉에 대하여 정리가 잘되어 있는 글이 있어서 가져왔다.
가장 널리 쓰이는 JSP나 PHP와 같은 언어로 웹 애플리케이션을 개발한다고 한다면 이 웹 애플리케이션은 일반적으로 아파치와 같은 웹 서버에서 동작하게 될 것입니다. 이때 어떤 클라이언트가 웹 서버에 연결을 요청하게 된다면, 일정한 메모리 공간을 사용하여 새로운 쓰레드를 생성합니다. 이런 형태로 웹 애플리케이션을 개발하여 서비스를 제공하는 경우에는 더 많은 사용자를 지원하기 위해 사업자는 더 많은 서버를 추가할 수 밖에 없었습니다. 이는 단순히 서버 구매 비용뿐만 아니라 이를 운영하는 비용이나 운영에 따라 발생하는 트래픽 비용, 인건비 등 여러 비용을 더하는 문제를 발생시킵니다. 게다가 여러 대의 서버를 사용하더라도 사용자 입장에서는 마치 하나의 서버에 접속하는 것과 같은 효과를 주어야 하기 때문에 모든 서버는 같은 데이터를 동기화해야 한다는 문제를 발생시키기도 합니다.
바로 노드가, 이런 현실적인 문제를 해결하기 위해 등장했습니다.
노드는 서버에서 클라이언트로부터의 요청, 즉 연결을 처리하는 방법을 새로운 컨셉으로 변경하여 이 문제를 해결합니다. 기존에는 각 연결에 대해 새로운 쓰레드를 생성하고 그에 따라 메모리를 할당하여 사용자 요청을 처리했다면, 노드에서는 각 연결이 하나의 이벤트로서 노드 엔진에서 처리됩니다.Node.js 는 언제 사용할까?
이벤트 기반으로 개발이 가능하고 Non-Blocking I/O를 지원하기 때문에 비동기식 프로그래밍이 가능하다.
때문에,
I/O 부하가 심한 대규모 서비스를 개발할 때 사용하는 경우가 많다.
그리고 내장 HTTP 서버 라이브러리를 포함하고 있어서 웹 서버에서 아파치 등의 별도 소프트웨어 없이 동작이 가능하다. 이와 같은 이유로 웹 서버의 동작에 있어서 더 많은 통제에서 벗어나 여러 가지 기능을 가능하게 한다.
Node.js 장점
- 싱글 스레드와 비동기 I/O처리에 기반한 빠른 속도
- 파일 I/O나 네트워크 처리를 Event Driven 방식으로 처리하기 때문에 빠른 처리 가능
*Event Driven: 이벤트 발생 시 정체 없이 그 결과를 전달하는 기능
- CPU의 대기시간을 최소화 할 수 있음
- CPU 부하가 적고, 많은 커넥션의 동시 처리가 필요한 구조에 적합
Node.js 단점
- 싱글 스레드 모델이기 때문에 하나의 작업에 시간이 오래 걸리면 시스템 전체의 성능이 급격히 저하됨
- 이벤트 콜백 중심으로 코드가 중첩(콜백지옥)될 경우 가독성이 떨어짐
- 에러 발생 시 프로세스 자체가 죽어버리므로 주의 필요
- 멀티코어 활용을 위해서 클러스터 모듈을 이용해야 하고, 세션을 공유할 경우 부가 작업 필요
Node.js 키워드
Node.js에 대한 설명을 할 때 아래 키워드를 빼고는 어렵다고 생각한다. 사실 이와 같은 사실을 제대로 모른 상태에서도 프로젝트 완성은 하였으나 막상 어느정도 학습 후에도 설명하려고 하니 쉽지 않다. 한 가지 개념을 알기 위해서 거기에 포함된 용어와 개념을 또 다시 인지하고 있어야 하니까 완벽히 이해하기까지 시간이 걸릴 것 같다.
1)이벤트 기반
- 노드는 V8과 더불어 libuv라는 라이브러리를 사용하는데, 해당 라이브러리는 Node.js의 특성인 이벤트 기반, 논 블로킹 I/O 모델을 구현하고 있다.
- 위에도 언급했지만 이벤트 기반(Event-Driven)이란 이벤트가 발생할 때 미리 지정해둔 작업을 수행하는 방식이다.
👉 이벤트 기반 시스템에서는 특정 이벤트가 발생할 때 무엇을 할지 미리 등록해두고, 이것을 이벤트 리스너에 콜백함수로 등록한다.
- 이후 이벤트가 발생하면 리스너에 등록해둔 콜백함수를 호출하고, 이벤트가 끝난 후 다음 이벤트가 발생할 때까지 대기한다.
2)이벤트 루프
- 여러 이벤트가 동시에 발생했을 때 어떤 순서로 콜백함수를 호출할지 판단한다.
- 노드는 이벤트 종료 시까지 이벤트 처리를 위한 작업을 반복하고, 이를 루프(loop)라고 부른다.
3)논 블로킹 I/O
- 논 블로킹이란 이전 작업이 완료될 때까지 대기하지 않고 다음 작업을 수행하는 것을 의미한다.
- 블로킹/논 블로킹을 제어권과 관련지어 설명할 수 있는데, 논 블로킹은 A함수가 B함수를 호출해도 제어권은 그대로 자신이 가지고 있는다.
4)싱글스레드
자바스크립트 코드는 동시에 실행될 수 없는데, 그 이유는 노드가 싱글 스레드 기반이기 때문이다.
정확하게 말하면 노드는 싱글스레드가 아니다. 노드도 여러개의 스레드를 가지고 있다. 그러나 자바스크립트를 실행하는 스레드가 하나이기 때문에 노드를 싱글스레드라고 한다. 그리고 그 싱글스레드가 바로 이벤트 루프이다.
🔧Node.js의 개념을 설명하려고 해도 그 안에 들어있는 또 다른 개념들이 많아서 쉽지 않은 것 같다.
싱글/멀티스레드, 동기/비동기, 블로킹/논블로킹, 이벤트루프 등 간략히만 정리한 포스팅이고 추후 개념 하나하나 따로 포스팅하며 정리할 예정이다.
References
'Framework | Test > Node.js' 카테고리의 다른 글
[Node.js] 모듈 설치 명령어 정리 (일부) (0) 2021.12.04 [Node.js] 설치 및 환경설정 (Windows) 🔨 (0) 2021.11.15