본문 바로가기

Programming/Node.js

1. Node.js 핵심 개념 이해 (5) - 서버로서의 노드

node js logo image

 

 

 

 

이번 아티클에서는 노드의 특성, 장단점 등에 대해서 살펴볼 예정입니다. 코드 예제 같은 내용보다는 개념적 내용에 대한 기술에 가까우니, 차근차근 읽어보시기 바랍니다. 

 

우선 앞선 아티클에서 설명한 특성을 다시 상기하겠습니다. 자바스크립트 언어의 특성이 노드에서도 그대로 이어지기 때문에, 기본적으로 노드는 싱글 스레드 - 논블로킹 모델을 사용하게 되고 여기서 기인하는 특성을 갖게 됩니다. 참고로 이 논블로킹 특성은 노드가 libuv 라이브러리를 사용하는데서 오게 됩니다.

 

 

 

 

1. Node.js 핵심 개념 이해 (4) - Single Thread

기본적으로 노드는 싱글 스레드 시스템입니다. 우리가 코드를 동시에 실행할 수 없다는 이야기를 앞의 아티클에서 했었는데, 이것 역시 이 영향에서 비롯됩니다. 일단은 스레드 설명을 위해서

nozeroslope.tistory.com

 

 

노드의 싱글 스레드 - 논블로킹 특성을 기반으로 생각해보면, 몇 가지 특성을 갖게 됩니다. 일단 싱글 스레드이기 때문에 CPU 부하가 큰 작업에는 적합하지 않습니다(주방에서 오래 요리를 하면 감당이 안됩니다. 직원이 한 명이니까요). 주방에서 라면처럼 뚝딱뚝딱 빠르게 조리되는 식품이면 한 명이 빠르게 대응이 가능하겠죠?

 

대신 이 싱글 스레드, 직원 한 명은 접객과 홀 대응이 매우 빠른 녀석이라고 생각합시다(논블로킹). 그럼 I/O 요청이 많은 경우를 능숙하게 대응하는 녀석이 되겠습니다. 결국 개수는 많지만 크기는 작은 데이터를 실시간으로 주고받는데 특화된다는 결론이 나옵니다. - 즉 조리가 아주 쉽고 간편한 음식을, 엄청나게 많은 손님에게 빠르게 내놓는 패스트푸드라고 생각하시면 됩니다. 

 

 

 


 

 

 

물론 노드에서도 멀티 스레딩은 가능합니다. 노드 12 버전에서 워커 스레드(멀티 스레딩 지원 시스템) 기능이 안정화되었기 때문이죠. 하지만 몇 번 언급했다시피 난이도가 싱글 스레드에 비해서 높고, 멀티 스레드를 지원한다 한들 다른 언어(C++, GO, RUST, C)에 비해서는 속도가 낮습니다. 즉, CPU 처리속도가 중요한 이미지, 영상 처리에는 적합하지 않다고 말할 수 있습니다. 반대로 데이터베이스, 디스크작업에 특화되어 있기 때문에 실시간 채팅, 주식, JSON 데이터 제공 API 서버에서 노드를 많이 사용하게 됩니다. 

 

덧붙이자면 노드는 싱글 스레드이기 때문에 에러가 발생하면 스레드가 하나뿐이기 때문에 서버 전체가 멈추기 때문에 관리를 잘 해야 한다는 사실도 기억해 둡시다.

 

참고로 AWS Lambda나 Google Cloud Function과 같은 서버리스 서비스를 사용하게 되면 노드로 CPU를 많이 사용하는 작업을 처리할 수 있게 됩니다. 이는 추후 서버리스 서버 시스템 아티클에서 배워보도록 하겠습니다. 

 

 

 


 

 

 

 

이론적으로 노드는 웹 서버가 내장되어 있습니다. 그래서 (조건에 따라 다르지만)노드로 서버를 개발하게 되면 웹 서버와 톰캣과 같은 WAS(Web Application Server)를 별도로 사용하지 않아도 된다고 말할 수 있죠. 물론, 나중에 서버 규모가 커지게 되면 결국 nginx나 아파치를 사용해야 합니다. 

 

결과적으로 노드는 생산성 자체는 좋지만 Go처럼 비동기에 강점을 갖거나 nginx와 같은 정적 파일 공과 로드 밸런싱에 특화된 웹 서버들에 비해서는 속도가 상대적으로 느립니다. 하지만 상황에 따라 이러한 장단점을 감안하고 사용하면 됩니다. 

 

참고로 JSON을 사용한 데이터 처리에 있어서, 자바스크립트를 사용하기 때문에 더 효율적으로 처리할 수 있다는 장점이 있죠.

 

정리해 보면 쇼핑몰, 블로그처럼 기본 틀에서 내용물(이미지, 텍스트, 영상)만 바뀌는 정적인 서비스에서 노드는 뚜렷한 강점을 갖지는 않습니다. 다만, Nunjucks(넌적스) / Pug(퍼그) EJS 같은 템플릿의 도움을 통해서 다른 언어와 비슷하게 제공도 가능은 합니다. 이 역시 따로 살펴보겠습니다.

 

 

 

장점 
- 멀티 스레드에 비해 적은 컴퓨터 자원을 사용한다.
- I/O 작업이 많은 서버로 적합하다.
- 멀티 스레드에 비해 쉽다.
- 웹 서버가 내장되어 있다.
- 자바스크립트를 사용하고, JSON 형식 호환성이 높다.

단점
- 싱글 스레드이므로 CPU 사용에 한계가 있다.
- 스레드 에러 관리가 필요하다.
- 규모가 큰 서버 관리에는 적합하지 않다.
- 성능이 어중간하다.

 

 

 

 

 


 

 

노드는 자바스크립트 런타임이라고 설명했습니다. 그래서 여러 분야에서도 사용이 진행되었고 이는 서버에만 국한되지 않습니다. 노드를 기반으로 한 다표적 웹 프레임워크는 앵귤러(Angular), 리액트(React), 뷰(Vue) 등이 있습니다. 모바일 개발 도구에는 리액트 네이티브(React Native)가 있습니다. 데스크톱 개발 도구는 일렉트론(Electron)이 대표적입니다. 

 

- 앵귤러는 구글 진영, 리액트는 페이스북 진영에서 프론트엔드 앱 개발 시 주로 사용합니다.

- 페이스북, 인스타그램, 핀터레스트, 테슬라 등이 리액트 네이비트를 사용해 앱을 운영 중입니다.

- 일렉트론으로 만들어진 프로그램은 Atom, Slack, Discord, 비주얼 스튜디오 코드 등이 있습니다.