모든 플랫폼은 자신만의 철학을 가지고 있습니다.
철학의 원칙 중 일부는 기술 자체에서 발생하기도 하고 일부는 생태계에서 발생하고, 일부는 커뮤니티에서의 트렌드이며, 다른 일부는 다른 이데올로기로부터 진화해 온 것입니다.
Node.js에서 이러한 철학 중 일부는 제작자 Ryan Dahl과 코어 모듈에 기여한 사람들 그리고 커뮤니티 내 카리스마 있는 이들이 직접 만든 것이고, 일부는 Javascript문화나 Unix 철학으로부터 영향을 받은 것입니다.
이 규칙들 중 어느 것도 법칙은 아니며, 상황에 맞게 적용해야 할 것입니다.
1. 경량 코어
Node.js 코어 자체는 몇 가지 원칙에 근거한 기반을 가지고 있습니다. 이들 중 한가지는 코어를 최소의 기능 세트로 하고, 나머지를 소위 사용자의 몫(사용자 영역)으로 해서, 핵심 모듈의 바깥 영역 모듈들을 생태계에 맡기는 것입니다.
이 원칙은 Node.js 문화에 엄청난 영향을 미쳤습니다. 핵심 기능 세트를 최소한으로 유지하면, 유지보수 측면에서 편리할 뿐만 아니라 전체 생태계의 발전에 긍정적인 문화적 영향을 가져올 수 있습니다.
2. 경량 모듈
Node.js는 모듈 개념을 프로그램 코드를 구성하는 기본 수단으로 사용합니다. 어플리케이션과 패키지라고 하는 재사용 가능한 라이브러리를 만들기 위한 조립용 블록입니다.
Node.js에서 가장 널리 퍼진 원칙 중 하나는, 코드 크기뿐만 아니라 범위적인 면에서도 작은 모듈을 설계하는 것입니다.
이 원칙은 Unix 철학에 뿌리를 두는데, 특히 다음과 같은 두가지 계율이 있습니다.
▶ 작은 것이 아름답다.
▶ 각 프로그램이 각기 한 가지 역할을 잘 하도록 만든다.
Node.js는 이러한 개념을 완전히 새로운 차원으로 끌어올렸습니다. 공식 패키지 관리자인 npm의 도움으로 Node.js는 설치된 각 패키지가 각기 고유한 별도의 일련의 의존성을 가지도록 함으로써, 프로그램 충돌 없이 많은 패키지들을 의존할 수 있습니다.
사실, Node.js의 방식은 어플리케이션을 작고 잘 집중화된 수많은 의존성들로 구성하여 재사용성을 극도로 높입니다. 따라서 100줄 미만의 코드로 이루어지거나, 한 가지 기능만을 가진 패키지를 흔히 볼 수 있습니다.
작은 모듈은 재사용성뿐만 아니라 다음과 같은 장점을 가집니다.
▶ 이해하기 쉽고 사용하기 쉽다.
▶ 테스트 및 유지보수가 훨씬 간단하다.
▶ 브라우저와 완벽한 공유가 가능하다.
더 작고 집중된 모듈을 사용하면 작은 코드 조각이라 해도 모두가 공유하거나 재사용할 수 있습니다. 이것은 "DRY(Don't Repeat Yourself, 같은 것을 반복하지 말라)" 원칙에 대한 새로운 차원의 적용입니다.
3. 작은 외부 인터페이스
Node.js 모듈은 크기와 범위가 작을 뿐만 아니라 대개 최소한의 기능을 노출하는 특성을 가지고 있습니다. 여기서 가장 큰 이점은 API의 유용성이 향상된다는 것입니다. 즉, API 사용이 보다 명확해지고 잘못된 사용에 덜 노출됩니다. 대부분의 경우 컴포넌트 사용자는 기능을 확장하거나 부가적인 고급 기능의 활용이 필요 없는, 매우 제한되고 집중된 기능에만 관심이 있습니다.
Node.js에서 모듈을 정의하는 가장 일반적인 패턴은 함수나 생성자와 같이 하나의 핵심 기능을 표현하는 동시에, 더 많은 고급 기능이나 보조 기능은 노출된 함수나 생성자의 속성이 되도록 하는 것입니다. 이를 통해 사용자는 중요한 내용과 부수적인 내용을 구분할 수 있습니다. 하나의 함수만 노출시킨 모듈을 찾는 것은 드문 일이 아니며, 명백한 단일 진입점을 제공한다는 단순한 사실 때문에 다른 기능은 존재하지 않습니다.
Node.js 모듈들의 또 다른 특성은 확장 용도보다는 실제 사용하도록 만들어 진다는 것입니다. 모듈의 확장 가능성을 금지시켜 모듈의 내부를 잠그는 것이 유연하지 않을 수도 있지만 실제로는 유스케이스를 줄이고, 구현을 단순화하며, 유지 관리를 용이하게 하고, 가용성을 높이는 장점이 있습니다.
4. 간결함과 실용주의
혹시 "KISS(Keep It Simple, Stupid)" 원칙이나, 다음과 같은 유명한 인용문구를 들어 본적 있습니까?
"단순함이야말로 궁극의 정교함이다." -레오나르도 다빈치
저명한 컴퓨터 과학자인 리차드 가브리엘(Richard P. Gabriel)은 모델을 묘사할 때 "불완전한 것이 더 낫다"라는 용어를 사용했는데, 이는 부족하지만 단순한 기능이 소프트웨어에 있어서 더 좋은 디자인이라는 의미입니다. 그의 에세이[The Rise of "Worse is Better"]에서 그는 다음과 같이 말했습니다.
"디자인은 구현과 인터페이스 모두에서 단순해야 한다. 구현이 인터페이스 보다 단순해야 하는 것이 더 중요하다. 단순함은 설계에서 가장 중요한 고려 사항이다"
단순한 설계는 여러 가지 이유로 완벽한 모든 기능을 가진 소프트웨어에 비해 훌륭한 원칙이 됩니다. 구현하는데 소요되는 노력과 자원을 적게 사용하여 더 빨리 보급할 수 있고 적용과 유지보수 및 이해가 쉽습니다. 이러한 요인들은 커뮤니티의 기여도를 높이고, 소프트웨어 자체가 성장하고 향상될 수 있도록 합니다.
Node.js에서 이 원칙은 매우 실용적인 언어인 JavaScript에 의해 가능합니다. 실제로 복잡한 클래스 계층 구조를 대체하는 간단한 함수(functions), 클로저(closures) 및 객체 리터럴(Object litrerals)을 사용하는 것을 흔히 볼 수 있습니다. 순수한 객체지향 설계는 종종 실제 세계의 불완전함과 복잡성을 고려하지 않고 컴퓨터 시스템의 수학적 용어를 사용하여 실제 세계를 복제하려고 시도합니다. 사실 우리의 소프트웨어는 항상 현실의 근사치이며, 막대한 노력과 많은 코드를 유지하면서 거의 완벽한 소프트웨어를 만들려고 노력하는 것보다는 합리적 수준의 복잡성을 가지고 더 빨리 작업하는 것이 더 큰 성공입니다.
우리는 이 원리가 작용되는 것을 여러 번 보게 될것입니다. 예를 들어, 싱글톤(singleton)이나 데코레이터(decorator)와 같은 상당 수의 전통적인 디자인 패턴은 사소하고 완벽하지 않은 구현이라도 간단히 사용될 수 있으며, 복잡하지 않고 실용적인 접근법(대부분의 경우)이 원칙적이고 완벽한 디자인보다 더 선호된다는 것을 보게 될 것입니다.
참고 :
Node.js 디자인 패턴 p20~p23