[NestJS] Modules & Controllers & Providers (2)

[Controller]

클래스에 @Controller() 데코레이터를 붙여서 선언한다.

Request를 핸들링 하고, Response를 돌려주는 역할.

 

일단 유저가 요청하면 Controller로 들어온다고 보면 된다.

 

@Controller() 데코레이터는 route path의 prefix를 string 형태로 받을 수 있다. (Optional)

보통 Controller 단위로 라우팅을 그룹화 하기 때문에, prefix는 대부분 넣어주게 된다.

컨트롤러 하위 라우팅 구성요소에 prefix가 자동으로 붙기 때문에, 코드 중복도 줄여준다.

// user.controller.ts

@Controller('users')
export class UserController {
  constructor(
    private readonly userService: UserService,
  ) {}
  
  @Get()
  findAll(): Promise<UserEntity[]> {
    return this.UserService.findAll();
  }
}

위 코드는 GET 메서드를 통해서 모든 유저를 읽어오는 API를 가정해보았다.

- 모든 유저를 반환하는 API가 있으면 큰일이겠지만! 예시다!

- Promise, UserService는 다음 포스트에서 설명할 것이다. 지금은 무시하자.

 

이번 주제를 설명하면서 모든 예시는 localhost:3000에서 돌린다고 가정하자.

 

UserController의 findAll() 함수는 "GET localhost:3000/users"를 통해 호출될 것이다.

똑같은 동작을 prefix 없이 구현하면 아래와 같이 될 것이다.

@Controller()
export class UserController {
  constructor(
    private readonly userService: UserService,
  ) {}
  
  @Get('users')
  findAll(): Promise<UserEntity[]> {
    return this.UserService.findAll();
  }
}

Restful한 CRUD를 구현한다고 해보자.

최소 POST, GET, UPDATE, DELETE 4개의 메서드에 '/users'가 중복된다. (최소다!)

코드 중복이 왜 나쁜지는 주제에서 벗어나니까 굳이 설명하지 않는다.

이렇게까지 설명하지 않아도 다들 알고 있었겠지만... 혹시 몰랐을 누군가를 위해 설명해보았다.

 

다시 주제로 돌아가서, 위와 같은 코드는 Response에 status code로 200을 반환한다.

기본적으로 대부분의 메서드는 성공시 200을 반환하고, POST는 201을 반환한다.

(반환시 status code를 바꾸고 싶다면 각 함수에 @HttpCode 데코레이터를 사용하자)

 

이전 포스트에서도 말했지만, Controller를 만들었으면 Module의 controllers 속성으로 넣어주어야 한다.

(UserModule을 만들지 않았다고 가정하면, AppModule에 바로 넣게 될 것이다.)

 

지금까지 설명한 것 이외에도 Controller에는 알아야 할 것이 아주 많다.

자주 쓰는 메서드, Body, Query, Route Parameters, Interceptors, Pipes 등등...

하지만 이 포스트는 간단하게 Controller의 개념 정도만 잡는 거니까... 여기까지!

 

Nest-CLI로 컨트롤러 생성하기

$ nest generate controller user

또는

$ nest g co user

 

[NestJS] Modules & Controllers & Providers (3) 에서 이어집니다.