Node.js의 3가지 특성
Node.js는 자바스크립트 런타임 환경이다. Node.js의 3가지 특성은 다음과 같다.
- 첫째, 이벤트 기반 비동기 I/O 모델이다. Node.js는 이벤트 루프를 기반으로 동작한다. 이벤트 루프는 비동기 I/O 호출을 처리하는데 사용된다. I/O 호출이 완료 될 때까지 이벤트 루프는 계속 실행된다. I/O 호출이 완료되면 이벤트가 트리거되고 콜백 함수가 실행된다.
- 둘째, 싱글 쓰레드이지만 높은 퍼포먼스를 제공한다. Node.js는 이벤트 루프를 사용하여 싱글 쓰레드 모델에서도 높은 퍼포먼스를 달성할 수 있다.
- 셋째, npm이 있다. npm은 Node.js에서 사용되는 패키지 관리자이다. 300,000개가 넘는 패키지를 제공한다. 개발자는 npm을 사용하여 쉽게 third-party 패키지를 사용할 수 있다.
이벤트 기반 : Node.js는 이벤트 루프를 기반으로 동작한다. 비동기 I/O 호출이 완료 될 때까지 이벤트 루프는 계속 실행된다.
논블록킹 : Node.js는 비동기 I/O 모델을 사용하여 입력/출력이 실행되는 동안 다른 작업을 계속 실행할 수 있다.
싱글스레드 : Node.js는 싱글 쓰레드이지만 이벤트 루프와 비동기 I/O 모델 덕분에 높은 성능을 제공한다.
서버로서의 노드
노드는 기본적으로 싱글 스레드, 논블로킹 모델을 사용한다.(자바스크립트 언어의 특성)서버에는 기본적으로 I/O 요청이 많이 발생한다. I/O 처리를 잘하는 노드를 서버로 사용하면 좋다.
노드는 (논블로킹 방식으로 작성했다면) libuv 라이브러리를 사용해 I/O를 혼자서도 감당할 수 있다.하지만 노드는 CPU 부하가 큰 작업에는 적합하지 않다. 개발자가 작성하는 코드는 모두 스레드 하나에서 처리가 된다. 코드가 CPU 연산을 많이 요구하면 스레드 하나가 혼자서 감당하기 어렵다.
💡 해당 특성을 활용하려면 노드를 어디에 사용해야 할까? 개수는 많지만 크기는 작은 데이터를 실시간으로 주고받는 데 적합하다. 네트워크, 데이터베이스, 디스크 작업 같은 I/O에 특화되어 있기 때문이다.
- 실시간 채팅 애플리케이션
- 주식 차트
- JSON 데이터를 제공하는 API 서버
노드 서버로 활용이 힘든 영역이란?
- 노드 12 버전부터 워커 스레드의 기능의 안정화로 멀티 스레드 작업을 할 수 있게 되었지만, 멀티 스레드 프로그래밍을 하는 것은 싱글 스레드에 비해 난이도가 높다. 스레드가 작업을 나눠 처리할 수 있게 직접 나눠주는 것이 상당히 어렵기 때문이다. 멀티 스레드 프로그래밍을 하더라도 C, C++, Rust, Go와 같은 언어에 비해 속도가 많이 느리다.
- 멀티 스레드 기능이 있다고 하더라도 이미지, 비디오 처리, 대규모 데이터 처리와 같이 CPU를 많이 사용하는 작업을 위한 서버로는 권장하지 않는다.
- 노드로 만약에 해야한다면 AWS 람다, 구글 클라우드 펑션스 같은 서비스에서 노드로 CPU를 많이 사용하는 작업을 처리한다는 사실을 고려해볼 필요가 있다.
싱글 스레드로 구현시 주의사항
싱글 스레드방식은 멀티 스레드 방식보다 상대적으로 쉽다.
서버 프로그래밍에 익숙하지 않은 사람도 쉽게 입문할 수 있다는 장점이 있지만,
싱글 스레드 방식으로 서버를 운영할 때는 하나뿐인 스레드가 에러로 인해 멈추지 않도록 잘 관리해야 한다.
에러를 제대로 처리하지 못하면 하나뿐인 스레드가 죽게 되어 서버 전체가 멈추기 때문이다.
노드의 가장 큰 장점은 웹 서버가 내장되어 있어 입문자가 쉽게 접근할 수 있다. 노드 외의 서버를 개발하다 보면 아파치, nginx, IIS처럼 별도의 웹서버를 설치해야 하는 경우가 많다.
톰캣 같은 웹 애플리케이션 서버(WAS)를 추가적으로 설치하게 되는 경우도 있다. 이 경우 프로그래밍 외에도 웹 서버와 WAS 사용법을 익여야 한다.
- 내장된 웹 서버를 사용하면 편리하지만, 서버의 규모가 커지면 nginx와 같은 웹 서버를 노드와 연결해서 분산처리(로드 밸런싱)가 필요하다.
노드의 가장 큰 장점은 자바스크립트 언어로 사용한다는 것이다.
노드의 생산성은 매우 좋지만,
- 노드를 사용하면 하나의 언어로 웹 사이트 개발할 수 있다. 이는 개발의 생산성을 획기적으로 높였고, 생산성이 중요한 기업이 노드를 채택하는 이유가 되었다.
- Go 처럼 비동기에 강점을 보이는 언어 Nginx처럼 정적 파일 제공, 로드 밸런싱에 특화된 웹 서버에 비해서는 속도가 느리다.
그렇긴 해도 극단적인 성능이 필요하지 않다면 이러한 단점은 노드의 생산성으로 어느 정도 극복할 수 있다.
노드에 적합한 사이트란?
웹 사이트 종류에는 쇼핑몰, 블로그 같은 웹 사이트도 많다.
이러한 사이트들은 정적인 콘텐츠를 많이 제공하는데 이러한 사이트들은 보통 기본적인 틀이 있고, 그 안에 내용물(텍스트, 이미지)만 조금씩 달라진다. 노드가 다른 서버에 비해 이러한 콘텐츠를 제공하는데 뚜렷한 장점을 갖지는 않는다.
하지만 그렇다고 적합하지 않지는 않다.
넌적스, 퍼그, EJS 같은 템플릿 엔진을 통해 다른 언어와 비슷하게 콘텐츠를 제공할 수 있다.
- NASA
- 에어비엔비
- 우버
- 넷플릭스
- 링크드인
- 페이팔
- 월마트
- 이베이
- 네이버
- 카카오
- 위메프
- 야놀자
서버 외의 노드
처음에는 노드를 대부분 서버로 사용했지만, 노드는 자바스크립트 런타임이므로 용다가 서버로만 국한되지 않는다.
사용범위가 점점 늘어나서 웹, 모바일, 데스크톱 애플리케이션 개발에도 사용되기 시작했다.
웹 프레임워크
- 앵귤러
- 구글 진영의 프론트엔드 앱을 만들 때 주로 사용
- 리액트
- 페이스북 진영에서 주로 사용하고, 모바일 개발 도구로는 리액트 네이티브를 많이 사용한다.
- 페이스북, 인스타그램, 핀터레스트, 월마트, 테슬라등이 리액트 네이티브를 사용해 모바일 앱을 운영중이다.
- 데스크톱 개발 도구로는 일렉트론이 대표적이며, Atom, Slack, Discord 등이 있다. 그외에 비주얼 스튜디오 코드도 일렉트론 기반이다.
- 뷰