nest.js는 크게 세 가지의 구조(Module, Controller, Service)로 이루어져 있다.
모듈은 Controller와 Service가 들어있는 상자이다.
리소스 단위로 작성되며, 파일 간의 의존성을 관리하기 위해 존재한다.
보통 리소스 단위로 만들어 해당 서비스에 필요한 모듈을 불러와 사용하는 식으로 이용된다. 쉽게 기능 별로 분리해서 만든다고 생각하면 된다.
유저 기능을 하는 UserModule을 만들어보자.
// user/user.module.ts
import { Module } from '@nestjs/common';
import { UserController } from './user.controller';
import { UserService } from './user.service';
@Module({
controllers: [UserController],
providers: [UserService],
})
export class UserModule {}
이처럼 컨트롤러와 프로바이더를 등록해주면 된다.
모든 module들은 app.module.ts의 imports에 등록 해주어야 한다.
// app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
@Module({
imports: [],
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
app.module.ts의 기본 구조이다.
만일 UserModule이란 모듈을 새로 만들게 된다면 다음과 같이 등록 해주어야 한다.
// app.module.ts
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { UserModule } from './res/user/user.module'; // 모듈 import
@Module({
imports: [UserModule], // 모듈 등록
controllers: [AppController],
providers: [AppService],
})
export class AppModule {}
URL에 따라 다른 서비스를 사용자에게 제공하는 역할을 한다.
들어오는 요청에 따라 해당 service를 호출하여 클라이언트에 반환한다.
@Controller 데코레이터로 class를 데코레이션 하여 정의한다.
@Controller('/boards')
export class BoardsController {
constructor(private boardsService: BoardsService) {}
...
}
위 코드는 /boards 로 접속했을 때 처리하는 컨트롤러를 나타낸 것이다.
또한 생성자(Constructor)를 통해 의존성 주입 작업을 해주어야한다.
constructor(private boardsService: BoardsService) {}
이 부분이 그 작업인데 이에 대해서는 따로 글을 작성해 설명하도록 하겠다.
핸들러는 @Get, @Post, @Delete 등과 같이 데코레이터로 장식 된 컨트롤러 클래스 내의 단순 메서드이다.
@Controller('/boards')
export class BoardsController {
constructor(private boardsService: BoardsService) {}
// get Handler
@Get()
getBoards(): string {
return 'get boards'
}
// post Handler
@post('/upload')
getBoards(): string {
return this.boardsService.postBoards();
}
}
위와 같이 작성하게 되면 /boards로 get요청 시 “get boards” 문자열을 반환하고,
/boards/upload로 post 요청 시 postService 내의 postBoards() 함수를 호출한다.
사용자에게 제공하는 서비스이다.
Service에 해당 서비스를 작성한 뒤, 모듈에서 provider를 등록해주면 컨트롤러에서 서비스를 제공받아 사용할 수 있게 된다.
서비스는 직접적으로 DB와 소통하는 비즈니스 로직 부분이다.