NestJS는 효율적이고 확장가능한 NodeJS Server-Side 어플리케이션을 만들기 위한 프레임워크이다. 내부적으로 ExpressJS를 사용하며, 초기 설정을 통해서 Fastify를 사용할 수 있다.

NodeJS 및 Server Side JS를 위한 수많은 우수한 Library와 Helper, Tools가 있지만, 아키텍처 문제를 효과적으로 해결한 라이브러리는 전무하다. 이를 위해서 NestJS 팀은
1.테스트가 용이하며,2.확장 가능및 느슨한 결합,3. 유지 관리에 용이한조건의 웹 서버 라이브러리로서 NestJS를 개발했다. 아키텍처는 Angular로부터 많은 영감을 받았다.
CLI를 통해서 설치한다.
$ npm i -g @nestjs/cli $ nest new nest_practice
nest new nest_practice 명령어를 통해서 새로운 Nest App을 구축하면, node_module, src등과 eslint, tsconfig, prettier등 환경 설정과 같은 파일들이 생성된다. 먼저 src 내부 디렉토리 구조를 살펴보자.
src ├ app.controller.ts ├ app.controller.spec.ts ├ app.module.ts ├ app.service.ts ⎣ main.ts
app.controller.ts
하나의 경로(root,/)를 지닌 기본 컨트롤러app.controller.spect.ts
컨트롤러에 대한유닛테스트app.module.ts
Nest 어플리케이션의 루트 모듈, 모든 Nest모듈은 이 모듈에연결되어있어야 한다.app.service.ts
하나의 메소드를 가진 기본 서비스main.ts
Nest App instance를 생성하는 함수NestFactory를 사용하는, Nest 어플리케이션의 Entry 파일
Nest는 Express를 기반으로하고 있기 때문에 기본 Express 서버코드와 비교해보며 알아보는 것이 도움이 될 수도 있다. 아래 코드는 express에서 controller와 router를 분리해서 사용하는 예시다.
//controller.js
export function sayHello (req, res) {
res.send('Hello World!');
}
// router.js
const router = express.Router();
router.get('/', sayHello);
export default router;
// app.js
app.use('/', router);
//http://localhost:3000/
Hello World!
Nest에서 Controller는 Express에서의 Router라고 생각하면된다.
(Service는 바로 다음에 쓸거다.)
// src/app.controller.ts
import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';
@Controller()
export class AppController {
constructor(private readonly appService: AppService){}
@Get()
sayHello(): string {
return this.appService.sayhello();
}
}
@Controller()는 express의 app.use('/', router)에서 '/'와 같은 역할을 한다. @Controller('say') 이렇게 인자로 string을 넘겨주면 express에서 app.use('/say', router)로 작성한 코드와 동일한 기능을 한다.
AppController 코드를 해석해보면, 루트경로로 GET요청이 들어오면
appService 안의 sayHello 함수를 실행하고 결과를 반환해라
와 동일하게 작동한다. 추가적으로 @Get(), @Post(), @Delete() 등 다른 HTTP 요청 메소드도 동일하게 처리할 수 있는 데코레이터가 있다.
Nest에서 Service는 express에서의 controller라고 생각하면 된다. Nest의 Controller와 비지니스 로직을 분리하기 위해 Service가 존재한다.
import { Injectable } from '@nestjs/common';
@Injectable()
export class AppService {
sayHello(): string {
return 'Hello Nest!';
}
}
위와 같이 메소드를 정의하고 AppModule에서 provider로 등록을 하면 Controller에서 사용할 수 있다.
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
@Module({
imports: [],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}