개발 R.I.P.

6.27 Dev.Feedback (Node.js #2)

편행 2021. 6. 27. 20:36
728x90

Node.js 기본 철학

 

경량 코어

코어에는 최소한의 기능 세트만 가지고 있고, 코어의 바깥 부분에 유저랜드(userland) 혹은 유저스페이스(userspace)라고 부르는 사용 전용 모듈 생태계를 두는 것

 

코어란? 플랫폼 자체의 코어이다. Node.js는 거의 기본적인 기능만 제공한다. 어떤 실험을 진행하라고 과학자들에게 실험실을 제공해준 것이다.

 

이 가장 기본적인 원칙이 Node.js 문화에 엄청난 영향을 주게 됐다.

다른 언어들처럼 플랫폼 자체가 굉장히 엄격하게 관리되면서 느리지만 대신에 안정적인 진화방식을 택하는 대신에 커뮤니티가 사용자 입장에서 여러가지 넓은 해결책들을 실험해볼 수 있는 자유를 준 것이다.

 

어떤 실험들을 할 수 있었을까?

 

코어를 최소한의 기능세트로 관리하는건 유지보수 관점에서 볼 때 편리할 뿐만 아니라 전체 생태계 진화에 있어서 긍정적인 영향을 미칠 수 있다.

 

경량 모듈

모듈이란 애플리케이션과 재사용 가능한 라이브러리를 만들기 위한 구성 요소이다.

 

Node.js에서 가장 널리 통용되는 모듈 원칙 중 하나는 코드의 양뿐만이 아니라 범위의 측면(기능의 조각)에서도 작은 모듈을 디자인하자는 것이다.

 

이 원칙은 Unix 디자인 철학에서 온 것이다.

특히 다음의 두가지 수칙을 참고하고 있다.

 

  • "작은 것이 아름답다"
  • "각 프로그램은 한 가지 역할만 잘 하도록 만들어라"

 

Node.js는 이 개념들을 한 단계 높은 차원으로 끌어올렸는데, 패키지 관리자 (npm, yarn)을 통해서 각 패키지가 자신이 필요로 하는 버전의 종속성 패키지가 충돌의 위험없이 잘 집중화되고 많은 수의 작은 종속성을 가질 수 있도록 해줍니다. 이러한 방식은 다른 플랫폼에서는 비실용적이고 적용이 불가능한 일에 가깝지만, Node.js는 이 방식이 표준이며, 재사용적인 측면을 향상시켜준다.

 

ex) 각 기능의 조각들이 다양한 버전에서 개발되다 보니, 충돌이 일어날 수도 있는데 packagelock.json에서 따로 명시를 해줘서 그것들을 관리해준다

 

ex) 매우 극단적인 사례로 이메일 형식 검사를 위한 정규식이 포함된 2줄짜리 모듈도 존재한다. (https://github.com/sindresorhus/email=regex) 

 

작은 모듈의 장점은 여러가지가 존재한다.

 

  • 이해하기 쉽고 사용하기 쉽다
  • 테스트 및 유지보수가 쉽다
  • 사이즈가 작아서 브라우저에서 사용하기 좋다

더 작고 한가지 기능에 집중화된 모듈을 사용한다는 것은 결국 다른 사람들에게 공유하고 재사용하기 쉽게 해준다. 다른 관점에서 보자면 한 차원 높은 수준의 Don't Repeat Yourself (DRY) 원칙이다.

 

최소한의 인터페이스

모듈이 갖는 장점은 작은사이즈와 한가지 기능의 집중화도 있지만, 최소한의 기능 노출이라는 장점도 존재한다. 최소한의 기능 노출로 모듈이 더 명확하게 사용될 수 있고, 잘못된 사용방식에도 덜 노출되도록 API 생산 효과를 누릴 수 있다.

실제로 대부분의 경우 컴포넌트 사용자는 확장된 기능이나 부가적인 고급 옵션들보다는 제한되고 필요한 기능에만 집중을 합니다. 이걸 통해 유즈 케이스가 줄어들고, 단순하게 구현할 수 있게 만들어준 것이다.

 

외부에서 사용할 때는 Module.exports 에서 쓴 코드만 참고할 수 있다. import

리액트에서 하위 컴포넌트를 상위 컴포넌트에서 사용할 때를 예시로 들어보면 된다.

모듈 export는 클래스가 아닌 함수를 노출시키는데, 그 이유는 클래스에서는 메소드를 따로 추가를 할 수 있게 되고,

그 말인 즉 모듈 자체를 변경하게될 수도 있기 때문이다.

 

간결함과 실용주의

Keep it Simple, Stupid(KISS) 원칙

 

"단순함이야 말로 궁극의 정교함이다." -레오나르도 다빈치-

 

리차드 가브리엘이라는 유명한 컴퓨터 과학자는 부족하지만 간단한 기능이 소프트웨어를 위해서는 더 좋은 디자인 모델이라는 것을 설명하기 위해서 "불완전한 것이 낫다"라는 용어도 만들었다. 그의 책인 "The Rise of Worse is Better"에서 그는 다음과 같이 서술하였다.

 

"디자인은 구현과 인터페이스 모두에서 단순해야한다. 구현이 인터페이스보다 더 단순해야한다는 것은 더 중요하다. 단순함이 디자인에서 가장 중요한 고려사항이다."

 

모든 측면에서 완벽한 소프트웨어보다는 반대로 단순하게 설계하는 것이 좋은 소프트웨어라는 것이 현대의 프로그래밍 사조이다. 왜냐하면 구현을 위해서 적은 노력이 들고, 가벼워서 보급되는 속도가 빠르며, 유지보수가 쉽고 누가 봐도 빠르게 이해가 가능한 것이 중요하기 때문이다. 이러한 개발 방식이 그 플랫폼이나 소프트웨어의 커뮤니티의 기여를 보다 용이하게 해주고 소프트웨어 자체의 성장속도나 기능향상을 돕는다.

 

Git과 Linux도 이러한 사조 아래 등장한 것이다.

 

Node.js는 어떻게 동작하는가? 어떤 방식으로 작동되는가?

 

 

 

 

 

 

 

 

 

 

 

 

 

'개발 R.I.P.' 카테고리의 다른 글

6.29 Dev.Feedback (Promise)  (0) 2021.06.29
6.28 Dev.Feedback (React #6 useEffect)  (0) 2021.06.28
6.26 Dev.Feedback (Node.js)  (0) 2021.06.26
6.25 Dev.Feedback (REST API)  (0) 2021.06.25
6.24 Dev.Feedback (자료구조 / 알고리즘)  (0) 2021.06.24