게시글을 읽으시기 전에,
제 블로그의 정보가 정확하지 않을 수도 있다는 점
명심해 주세요. 혹시 틀린 부분을 발견하신다면 댓글로 알려주시면
적절한 조치를 취하도록 하겠습니다.
Node.js란 무엇인가?
Node.js는 확장성 있는 네트워크 애플리케이션을 만들 수 있도록 설계된 javascript 런타임 환경으로, 주로 서버사이드 애플리케이션 개발에 사용된다. Node.js는 브라우저 외부 환경에서 자바스크립트 개발에 사용된다. Node.js는 파일 시스탬(fs), HTTP 등 수많은 Built-in API를 제공한다.
참고로 Node.js는 C와 C++로 이루어져 있으나, javaScript로 코딩하면 알아서 내부적으로 변역해 실행하기 때문에 C와 C++을 전혀 몰라도 상관없다.
그럼 Node.js가 무엇인지 대략적으로 알아보았으니 Node.js의 특징을 알아보도록 하자. 이 포스팅에서는 Node.js의 특징을 배경지식 없이도 이해할 수 있게 작성할 수 있도록 노력했기 때문에, 각각의 특징을 서술한글이 긴점 참고하자.
Node.js의 특징
none-bloking I/O
Node.js는 blocking방식 대신 none-blocking I/O방식을 사용하여 높은 확장성을 가진다. 그렇다면 none-blocking I/O를 사용하는 것은 왜 더 높은 확장성을 가질까?
간단히 말하자면, 동기/비동기의 차이라고 할 수 있다. blocking방식은 기본적으로 작업들을 동기적으로 다룬다. 즉, 한 작업이 끝나기 까지 기다렸다가, 다음작업을 처리하는 방식이다. 반면, none-blocking방식은 작업들을 비동기적으로 다룬다. 동기와 반대로, 작업이 끝날 때까지 기다리지 않고 다른 작업들을 수행하다가, 작업이 완료되면 그 값을 받아온다.
즉, 정리하면 none-blocking I/O방식을 사용한다면 blocking방식보다 프로세스를 더 효율적으로, 확장성을 가지게 관리할 수 있는 것이다.
싱글 스레드와 이벤트 기반
스레드는, 기본적으로 하나의 프로세스 안에서 이루어지는 작업의 최소 단위이다. 쉽게 이해하자면 실행되는 각 작업의 흐름이라고 생각하면 될 것 같다. 예를 하나 들자면, 내가 이 포스트를 크롬 브라우저에서(프로세스) Tistory에서 작성하고 있고(1 스레드), 유튜브로 음악을 듣고 있다면(1 스레드), 총 2 스레드가 실행되고 있는 것이다.
그럼 스레드가 무엇인지 간단히 알았으니, Node.js가 싱글 스레드를 사용하는 이유를 알아보자.
기본적으로 서버사이드 애플리케이션에 사용되는 런타임들은 스레드 방식 둘 중 하나를 택한다. 멀티 스레드와 싱글 스레드다. 멀티 스레드는 말 그대로 동시에 여러 가지 스레드를 병행해(동시에) 실행하는 방식이다. 반대로 싱글 스레드는 순차적으로 스레드들을 실행한다.
여기까지 읽는다면 이런 생각을 할 수도 있다. '그렇다면, 멀티 스레드가 훨씬 효율적인 것 아닌가? 그냥 멀티 스레드 쓰면 되겠네'. 하지만 그렇지 않다. 모든 건 장단점이 있는 법이다.
멀티 스레드는 CPU의 사용량을 극대화시키기 위하여 프로그램 두 개 이상을 동시에 실행하는 방식이다. 이러한 작업은 컨덱스 스위칭이라는 것을 통해 이루어지는데, 쉽게 말하면 A스레드와 B스레드가 있다면 유저가 눈치 못챌정도의 시간으로 A와 B를 번갈아가면서 실행하는것이다. 즉, A와 B는 번갈아가면서 실행되지만, 유저가 눈치를 못챌정도의 짧은 시간이기 때문에 유저의 눈에는 동시에 실행되는 것으로 보이는 것이다. 이경우 경제성이나 사용자와 통신 중 오류가 발생하더라도 다른 스래드를 생성하는 등의 동작이 가능하지만, 오히려 스레드 생성 시간이 느려지며, 멀티스레드 사용 시 메모리 중 heap(사용자가 동적으로 할당한 구역)을 공유하기 때문에 동기화를 안 할 시 엉뚱한 값을 읽어오는 등 여러 오류가 생길 수 있다. 또한, 운영체제의 도움도 필요로 하며, 구현 난이도도 매우 높고 자원도 많이 소비해 초보자가 만들기엔 어렵다. 반면, 싱글 스래드는 다르다. 하나의 main스레드로 작동하기 때문에 컨덱스 스위칭 작업을 안 해도 되며, 자원 관리를 신경 안 써도 될 만큼이라는 것, 프로그래밍의 난이도가 쉽다는 점등이 장점이다. 하지만 에러처리를 못해 에러가 나면 스레드가 멈춘다는 것과, 여러 개의 CPU를 활용하지 못한다는 것이 단점이다.
Node.js는 기본적으로 단일 스레드 구조이다. Node는 단일 스레드에서 javaScript 런타임을 구성한다. 하지만, Node는 비동기 처리를 처리하기 위해 libuv 라이브러리를 사용하기는 하지만, 결론적으로 javaScript 실행 스레드는 싱글 스레드이기 때문에, 싱글 스레드라고 정의된다. 또한 javaScript의 비동기를 제어하기 위한 EventLoop라는 메커니즘을 사용한다.
자, 그럼 이벤트 기반은 무엇일까? 이 말은 간단하게 이벤트가 발생하면 미리 등록된 작업을 실행하는 구조라고 생각하면 된다. 이벤트 루프를 돌 때, 이벤트가 감지되면, 미리 등록된 콜백 함수나 이벤트 핸들러가 실행되는 방식이다. 이를 통해 싱글 스레드로도 많은 작업을 동시에 처리할 수 있다.
NPM(Node Package Manager)을 사용한 방대한 양의 모듈 제공
Node.js는 기본적으로 방대한 양의 모듈을 제공한다. express, sequelize 등 우리가 개발을 할 때 쉽고 빠르게 개발할 수 있도록 반대한 양의 모듈을 제공한다. 그 모듈은 IDE내의 터미널로 다운로드할수 있으며, 다운로드 받을 수 있는 모듈들은 여기서 확인할 수 있다.
Node.js 사용 범위
Node.js를 사용하기 적절한 프로젝트
- 간단한 로직을 가진 프로젝트
- 빠른 개발을 요구하는 프로젝트
- 입출력이 많은 서비스(다량의 클라이언트가 사용하는 서비스)
- 비동기 방식이 필요한 서비스(ex. 스트리밍, 채팅등)
Node.js를 사용하기 적절하지 않은 프로젝트
- 복잡한 계산을 필요로 하는 경우
- 로직 복잡도가 높은 경우
- 단일 작업이 오래 걸리는 프로젝트
글을 마치며
이번 글에서는 Node.js의 기본적인 개념과 특징들을 알아보았다. 다음글에서는 특징 파트에서 언급되었던 "Event Loop"와 Node.js의 작동원리에 대해 탐구해보고자 한다.
참고 자료 및 출처
'BackEnd > Node.js & Express' 카테고리의 다른 글
V8 JavaScript Engine의 동작 구조 (2) | 2023.08.28 |
---|