NestJS
in Web
본 글은 네이버 부스트캠프를 위해 학습한 내용을 노션에서 이전한 게시글입니다.
1. NestJS란
- Node.js에 기반을 둔 웹 API 프레임워크
- Express 또는 Fastify 프레임워크를 래핑하여 동작
1.1. 특징
- nodejs 서버 애플리케이션을 구축하기 위한 프레임워크
- 서버 애플리케이션 개발시 필요한 많은 부분들을 기본적으로 제공
- Express 기반으로 만들어짐
- TypeScript를 사용함
- 프로그래밍 언어는 타입스크립트를 기본으로 채택하고 있어서 타입스크립트가 가진 타입시스템의 장점을 누릴 수 있음
- JavaScript로도 코딩이 가능함
- 다음 요소를 포함함
- OOP : 객체지향 프로그래밍
- IoC(Inversion of Control, 제어 역전)
- DI(Dependency Injection, 의존성 주입)
- AOP(Aspect Oriented Programming, 관점 지향 프로그래밍)
- FP : Functional 프로그래밍
- FRP : Functional React 프로그래밍
- OOP : 객체지향 프로그래밍
- 외부 모듈을 자유롭게 이용할 수 있음
- unit 테스트와 e2e 테스트를 할 수 있는 툴을 제공
1.2. 탄생 배경
- 최근 Node.js로 인해 JavaScript를 이용한 풀스택(클라이언트+서버) 개발이 활발해짐
- JavaScript라는 한가지 언어로 개발을 하기 때문에 생산성을 향상시키고 빠른 개발이 가능해짐
- 그러나 Node.js의 높은 자유도로 인해 Architecture 구성이 어렵고 효과적이지 못함
- 이를 해결하기 위해 Angular의 아키텍쳐 사상을 기반으로 Nest가 만들어짐
- 모듈/컴포넌트 기반의 프로그램을 작성함으로써 재사용성을 높여줌
1.3. 장점
- Java의 Spring과 같이 규칙을 제공함
- 이로 인해 개발자들이 아키텍처의 구성에 대해 고민해야 할 부분이 많이 줄어듦
- 기본적으로 제공하는 라우팅, 보안 등의 기능이 많이 탑재되어 있어 편리함
- 외부모듈을 통한 확장이 얼마든지 가능
- Java+Spring 사용자의 경우 아키텍처 구조가 비슷해서 쉽게 배울 수 있음
- Angular 사용자의 경우 기본적인 사용법이 동일해서 쉽게 배울 수 있음
1.4. 추세
- 국내에서도 점점 인기를 얻고 있음
- 모두싸인과 당근마켓 등 여러 회사에서 적용되어 사용자가 늘고 있음
2. NestJS 구조
2.1. Module
- NestJS는 여러 모듈들의 집합
- 반드시 하나 이상의 모듈이 있어야 함
- 기본 모듈은 AppModule
- 기능별로 모듈을 생성하여 개발할 수 있음
- 생성된 각 모듈을 Root Module에 inmports 시켜주어야 함
- CLI로 모듈을 생성하면 자동으로 Root Module에 import됨
- export를 통해 외부에서 module을 사용할 수 있음
2.2. Controller와 Provider
- controller는 client의 요청에 대한 라우팅을 처리
- provider인 AppService에게 비즈니스 처리 요청을 보냄
- 서비스에서 받은 결과를 client에 응답으로 보냄
- providers는 service들의 모음(?)
- controller의 요청을 받은 서비스는 비즈니스 로직을 처리한 후 controoller에게 return
3. NestJS 사용
3.1. NestJS 설치 및 프로젝트 생성
3.1.1. NestJS 설치
npm i -g @nestjs/cli
3.1.2. NestJS 프로젝트 생성
nest new project-name
3.1.3. NestJS 프로젝트 구조
- dist : typescript 코드를 컴파일해서 빌드한 .js 파일이 저장되는 폴더
- node_modules : package.json에 정의된 패키지 모듈이 설치되는 폴더
- src : typescript 코드가 저장되는 사용자 소스 폴더
- test : test 소스가 저장되는 폴더
3.1.4. 프로젝트 소스(src) 폴더 구조
- app.controller.spec.ts
- test용 소스 - controller를 테스트함
- app.controller.ts
- controller 소스 - client의 request를 처리하고, response를 보냄
- app.module.ts
- module 소스 - 모듈을 정의(controller와 service 정의)
- app.service.ts
- service 소스 - controller가 요청한 비즈니스 로직을 처리
- main.ts : 프로젝트 시작점(Entry Point)
4. 유용한 기능
4.1. 소스 자동 생성기
# 모듈 자동 생성
nest g module 모듈명
# 컨트롤러 자동 생성
nest g controller 컨트롤러명
# 서비스 자동 생성
nest g service 서비스명
4.2. .env 사용
[Documentation | NestJS - A progressive Node.js framework](https://docs.nestjs.com/techniques/configuration) |