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 {}