최근에 인X 면접을 보고 나서 많은 생각이 들었움...
???: 나는 아직.. 멀었구나... 인생..
(면접 당시 내 속마음)
그 중에서 NestJS로 내가 예전에 프로젝트 한 게 있는데 자기소개서에서 이 프로젝트를 통해서 node.js만의 철학과 nestjs의 철학?을 배웠다고 기재했었다.
사실 좀 얕게(?) 알게 된 철학이라 이 질문마저 제대로 답하지 못했지만.. 집으로 와서 면접 질문들을 다시 복기 하면서 지식을 채우리라 다짐했움
그래서 이번 포스팅은 NestJS와 Express의 차이를 공식 문서 및 각종 아티클들을 내 머릿속 프로세스를 거쳐(아마 거의 다 복붙일 듯) 포스팅 하려고 함 ㅋ
(출처: https://docs.nestjs.com)
일단 먼저 공식 문서를 해석해보자.
네스트는 효율적이고 확장성 있는 node.js 기반 서버 사이드 애플리케이션을 빌딩하기 위한 프레임워크다.
네스트는 발전된 자바스크립트(es6를 말하는건가)를 사용하고
타입스크립트를 지원하며 OOP, FP, FRP에 사용되는 개념?들을 합쳤다.
네스트는 견고한 HTTP 서버 프레임워크인 Express나 추가적으로 원한다면 Fastify를 이용한다.
네스트는 일반적인 노드 프레임워크(express, fastify)를 넘는 추상화 레벨을 제공하지만
또한 API들을 직접적으로 개발자들한테 노출한다.
이러한 점은 개발자들이 자유롭게 자기들 플랫폼에서 서드 파티 모듈을 사용할 수 있도록 한다.
철학
요즘들어서 노드야 고맙다.(?)
자바스크립트는 웹에서 lingua franca(아마 언어쪽에서 대장 같은 존재?인듯 궁금하면 서치 ㄲ)
이러한 점은 앵귤러나 리액트 뷰와 같은 프로젝트들이 성공할 수 있도록 해줬다.
근데 시부레 왜 서버 사이드는 없냐, 아무도 아키텍쳐 문제는 해결안한다.
그래서 내가 했다. 우리는 바로 사용할 수 있는 애플리케이션 아키텍쳐를 제공한다.
근데 이건 너거들이 테스트 하기도 쉽고 또 쉽게 확장 가능하며 OOP마냥 느슨히 결합돼 있다.
또 유지보수도 쉬움ㅋ.
아키텍쳐는 앵귤러에서 영감을 존내게 받았다.
아 오랜만에 또 황석희로 빙의하니까 좀 힘드네.
어쨌든 보면 Express나 Fastify를 써서 하는 건 동일한데 그 위에 지네들이 각종 디자인 패턴이라든지 아키텍쳐 같은 개념으로 랲핑(?)을 해서 제공한다는 말인 거 같다. 결국엔 Express로 개발을 해본 node.js 개발자들은 알지만 사실 애초에 자바스크립트가 동적타입 언어이기도 하고 express는 경량화가 목적이기 때문에 진짜 코드를 남이 보기에 개같이 짤라하면 짤 수 있다.
import express from "express";
const app = express();
const router = express.Router();
app.use("/", router.get("/",(req,res) => {
...
}))
(개같이 짠 코드 예)
그니까 막 이렇게 짜도 상관이 없다는 거다.
그래서 프로젝트 분리를 열심히 하고 MVC 패턴도 도입해서 막 할 수 있지만 프레임워크가 없기 때문에 자유롭다.
그리고 특히나 NestJS는 typescript, DI, IoC, module 같은 개념들을 이용하기 때문에 매우 구조적으로 짤 수 있고 분리화 된 느낌을 많이 받을 수 있다.(아마 이게 느슨하게? 분리돼 있다는 의미인 거 같음)
근데 여기서 질문! 그라모 Express는 Typescript를 못 쓰는겡가?
아니다. 근데 typescript를 쓰려면 또 typescript.config 파일에다가 이것저것 설정하고... typescript로 정적 타입 언어를 쓴들 OOP에 대한 개념이 제대로 머리에 박혀있지 않는 나같은 닝겐들은 그냥 귀찮기만 하다.
그래서 NestJS 플젝 담당자들이 알아서 노가다 해서 나같은 비전공 노력충들이 쓸 수 있도록 만든 거 아니겠능가 ㅋ
아 그리고 웹 프레임워크인 express랑 다르게 예는 웹 애플리케이션뿐만 아니라 다른 애플리케이션(batch 작업을 위한 것 등)을 개발할 수 있다고 한다. 이 부분은 사실 내가 웹만 해봐서 잘 모르겠지만 이분 글에서 친절히 설명해준다.
+그리고 이제 엔터프라이즈급 애플리케이션을 구축할 때 이제 대용량 트래픽을 감당하기 위해서 MSA 구조로 설계를 하게 되는데 그러한 설계 스타일 또한 제공하기에 Node.js 개발자들이 고민할 시간을 덜어준다는 장점이 있음.
Express는 지 마음대로 미들웨어나 필요한 것들을 자기 마음대로 만들어서 구축할 수 있지만 그러한 자유도가 나중에 프로젝트가 커지고 다른 개발자가 들어와서 유지 보수 할 때
"이 뭐..씹 이게 뭐여 ㅋㅋ"
이렇게 될 수 도 있음 ㅋㅋㅋㅋㅋ
그래서 nestjs는 그러한 아키텍처와 같은 프레임워크를 제공했고 또한 데코레이터 패턴으로 그냥 파일 열었을 때 클래스를 보면 무슨 역할을 하는 지 딱 알 수 있음.
결론: Express는 겁나 자유로우나 그 자유도 때문에 아키텍처 문제가 많아서 NestJS는 그러한 아키텍처 문제를 해결하기 위해 나온 Node.js 진영의 스프링과 같은 프레임워크이다.