모든 플랫폼(Platform)은 철학 을 가지고 태어난다. node.js도 마찬가지라고 생각한다. 우리는 새로운 언어(Language)를 배울 때 단순히 Syntax와 원리에만 집중하여 학습한다. 좀 더 deep하고 핵심을 꿰뚫어야 해당 플랫폼을 올바르게 이해할 수 있다고 생각이 들어 Desing Pattern을 공부하기로 결정하였다.

Node.js

장점과 단점

  1. 장점
    1. 성능
      1. 싱글 스레드 기반 비동기 I/O 처리로 매우 빠른 고성능 서비이다.
      2. CPU intensive하지 않고, 많은 Connection을 동시에 처리해야 하는 상황에서 Nodejs의 성능이 좋다.
      3. 프로세스를 Restart 시간이 1초 미만이기 때문에 프로세스가 종료되거나 죽더라도(kill) 빠르게 다시 시작할 수 있고, 빠른 배포나 업그레이드 작업이 가능하다.
    2. 생산성 관점
      1. JS는 자바와 같은 프로그래밍 언어보다 생산성이 좋다. 동일한 서버 코드를 짜는데 걸리는 시간이 적다.
      2. 낮은 Learning Curve
      3. 프로트엔드와 백엔드 개발자가 같은 JS언어를 사용해서 개발을 할 수 있기 때문에 의사소통 비용이 줄어든다.
      4. 싱글 스레드기 때문에 스레드 간의 동기화 처리 등의 복잡한 과정을 생략할 수 있다.
    3. 개발과 운영도구
      1. Apache, Tomcat 등 별로의 소프트웨어 없이 Http 서버 라이브러리를 포함하여 웹 서버 동작이 가능하다.
      2. socket.io API만 이용하여 싱글 스레드 기반 멀티 플랙싱을 기반으로 대용량 사용자에 대한 푸쉬 처리를 가능하게 한다.(WAS는 쓰레드 수만큼만 동시 Connection처리를 할 수 있다.)
  2. 단점
    1. 싱글 스레드 모델이기 때문에, 하나의 작업에 대한 처리 시간이 많이 소요되면 전체 시스템의 성능이 급격하게 떨어진다.
    2. 코드의 가독성이 자바 언어에 비해 낮아 유지 보수가 어려워질 수 있다.(중첩 callback)
    3. 멀티 코어 머신에서 CPU 사용을 최적화 할 수 없다. 그렇기 때문에 설계 시, 클러스터 모듈 등을 이용해서 하나의 서버에서 여러 Node.js 프로세스를 사용하는 모델을 가져야 한다.
    4. Session 등을 공유할 경우 Redis와 같은 추가 인프라가 필요하다.

1. 📌Node.js의 철학

1.1 경량 코어

Node.js 코어 자체는 몇 가지 원칙을 가지고 있다. 그 중 하나는 코어를 최소의 기능 세트로 하고, 나머지를 사용자의 몫으로 해서, 핵심 모듈의 바깥 영역 모듈들을 생태계에 맡기는 것이다. 이렇게 핵심 기능 세트를 최소한으로 유지하면, 유지 보수 측면에서 편리할 뿐만 아니라, 전체 생태계 발전에 긍정적인 문화적 영향을 가져올 수 있다.

1.2 경량 모듈

모듈 개념은 프로그램 코드를 구성하는 기본 수단으로 사용한다. 이것은 어플리케이션과 패키지라고 하는 재사용 가능한 라이브러리를 만들기 위한 조립용 블록이다. 그래서 Node.js는 코드 크기뿐만 아니라 범위적인 면에서면 작은 모듈을 설계 하는 것이 특징이다.

"작은 것이 아름답다"

"각 프로그램이 각기 한 가지 역할을 하도록 만든다"

더 작고 집중된 모듈을 사용하면 작은 코드 조각이라 해도 모두가 공유하거나 재사용할 수 있다. 이것은 DRY(Don`t Repeat Yourself, 같은 것을 반복하지 말라!) 원칙에 대한 새로운 차원의 적용이다.

1.3 작은 외부 인터페이스

Node.js의 모듈은 크기와 범위만 작을 뿐만 아니라 대개 최소한의 기능을 노출하는 특성을 가진다. Node.js에서 모듈을 정의하는 가장 일반적인 패턴은 함수나, 생성자와 같이 하나의 핵심 기능을 표현하 동시에, 더 많은 고급 기능이나 보조 기능은 노출된 함수나 생성자의 속성이 되도록 한다. 이를 통해 사용자는 중요한 내용부수적인 내용을 구분 할 수 있다.

명백한 단일 **진입점(main함수)**을 제공한다는 단순한 사실 때문에 다른 기능은 존재하지 않는다.

1.4 간결함과 실용주의

"단순함이야말로 궁극의 정교함이다."

저명한 컴퓨터 과학자인 리차드 가브리엘은 모델(Model)을 묘사할 때 "불완전한 것이 더 낫다"라는 말을 했다고 한다. 이는 부족하지만 단순한 기능이 소프트웨어에 있어서 더 좋은 디자인이라는 것을 의미한다. 그의 에세이 [The Rise of "Worse is Better"]에서 이렇게 말하고 있다.