NestJs에서는 일반적으로 URI설정을 위해 아래와 같이 controller 데코레이터를 이용한다.
@Controller('/users')
export class UesrController {
constructor(private readonly userService:UserService){}
}
versioning을 위해서 아래와 같이 v1을 추가해줄 수도 있지만 모든 컨트롤러에 추가해주어야 하는 불편함이 있다.
@Controller('/v1/users')
export class UesrController {
constructor(private readonly userService:UserService){}
}
따라서 아래와 같이 versioning을 설정하게되면 위와 같이 v1을 주지 않아도 기본적으로 /v1
이 앞에 붙게 된다.
// ./main.ts
const app = await NestFactory.create(AppModule);
app.enableVersioning({
type: VersioningType.URI,
defaultVersion: '1',
});
// or "app.enableVersioning()"
await app.listen(3000);
아래와 같이 controller 데코레이터에서 version을 변경하여 /v2/users
로 변경할 수 있다. 또한 version: ['1', '2']
로 설정함으로써 두가지 버전에 대해서 해당 컨트롤러로 라우팅 되도록 가능하다.
@Controller({paht: '/users', version: '2'})
export class UesrController {
constructor(private readonly userService:UserService){}
}
@Version('2')
데코레이터를 통해 컨트롤러 내부에 메소드별 versioning도 가능하다.
뿐만아니라 VERSION_NATURAL
이라는 값을 통해 versioning되지 않도록 설정도 가능하다.
URI설정 마지막 방법은 계층적 구조를 설정하도록 도와주는 router module이다.
@Module({
controller: [UserAdminController],
})
export class UserAdminModule {}
@Controller({paht: '/users'})
export class UserAdminComtroller {}
위와 같은 UserAdminModule이 있을 때, 아래와 같은 설정을 통해 /admin/users
로 들어온 요청을 해당 컨트롤러로 연결해준다.
@Module({
imports: [
AdminModule,
RouterModule.register([
{
path: 'admin',
module: UserAdminModule,
},
]),
],
})
export class AppModule {}
아래와 같이 children 프로퍼티를 통해 /admin/dashboard/...
, /admin/metrics/...
와 같이 계층적으로 구성할 수 있다.
RouterModule.register([
{
path: 'admin',
module: AdminModule,
children: [
{
path: 'dashboard',
module: DashboardModule,
},
{
path: 'metrics',
module: MetricsModule,
},
],
},
]);
감사합니다!