[NestJS] Controller로 Request를 받아보자!

개요

HTTP를 통해 Controller에 전달되는 요청은 종류가 다양하다.

HTTP 메서드도 여러가지 있지만, 데이터 전달 방식도 여러가지다.

 

- Route Parameter 방식: localhost:3000/users/1

- Query 방식: localhost:3000/users?name=김만보&gender=male

- Body 방식: localhost:3000/users (데이터는 body에 담겨서 전달됨)

- 등등.

 

이 포스트에서는 NestJS에서 흔하게 쓰는 기초적인 방식 3가지 정도를 적어보려고 한다.

- Route Parameter

- Query

- Body

 

Body 방식의 경우, JSON 텍스트 방식만 다루려고 한다. (Multipart나 Graphql은 나중에...)

 

Route Parameter

Request: GET localhost:3000/users/1

@Controller('users')
export class UserController {
  constructor(private readonly userService: UserService) {}
  
  @Get(':id')
  findUserById(@Param('id') user_id: string): Promise<UserEntity> {
    return await this.userService.findUserById(user_id);
  }
}

위의 요청에서 유저 아이디는 1이고, 아이디는 unique 하다고 가정했다.

@Param 어노테이션을 통해서 @Get()에 지정한 Route Parameter를 읽어오고 user_id 변수에 넣어주었다.

 

Query

Request: GET localhost:3000/users?name=김만보&gender=male

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

위의 요청은 name과 gender를 기준으로 유저들을 찾는다고 가정하였다.

@Query 어노테이션을 통해서 URL 쿼리를 읽어올 수 있다.

 

Body

Request: POST localhost:3000/users

data: { "name": "김만보", "gender": "male" }

@Controller('users')
export class UserController {
  constructor(private readonly userService: UserService) {}
  
  @Post()
  createUser(@Body() body) {
    return await this.userService.createUser(body.name, body.gender);
  }
}

이번에는 POST 요청의 Body에서 이름과 성별을 받아 유저를 생성한다고 가정하였다.

@Body 어노테이션을 통해 Body의 내용을 가져올 수 있는데, 사실 이건 그렇게 많이 쓰는 방식은 아니다.

미리 설명해두자면 보통은 DTO 클래스를 생성해서 다음과 같이 사용한다.

@Post()
createUser(@Body() createUserDto: CreateUserDto) {
  return await this.userService.createUser(body.name, body.gender);
}

DTO를 사용하면 데이터를 Validation 하기 좋고, 객체로서 데이터를 관리할 수 있다.

이건 다른 포스트에서 정리해보려고 한다.

 

마무리

일단 가장 기본이라고 생각되는 Request 데이터 처리 방식 3가지 정도를 정리해보았다.

개발을 하다보면 필요에 따라서 여러가지 방식을 섞기도 하고, 이것저것 추가되기도 한다.

 

나중에 좀 복잡한 케이스를 정리한 포스트도 적어보고자 한다.

 

각 코드는 돌려본게 아니라 바로바로 작성한 것이라 오타 등이 있을 수 있습니다.

참고용으로만 써주세요.