남느 2025. 4. 23. 21:28

컨트롤러의 역할

컨트롤러는 어떤 요청을 어떻게 처리하는지 관리하는 역할을 합니다.

컨트롤러 생성 방법

nest g controller 컨트롤러명
nest g co 컨트롤러명 # 약어 사용
nest g co 컨트롤러명 --no-spec # 테스트 파일 생성을 원하지 않을 때

컨트롤러 모듈 등록 방법

컨트롤러를 모듈에 등록해야 컨트롤러가 작동합니다.

@Module({
  controllers: [AppController],
})
export class AppModule {}

라우팅

요청 경로를 처리하기 위한 방법을 라우팅이라 합니다.

컨트롤러 자체의 경로와 메소드별 경로를 지정할 수 있습니다.

// 컨트롤러 수준의 라우팅
// http://url/index 패턴과 일치하면 해당 컨트롤러로 진입후 메서드를 찾습니다.
@Controller('index')
export class AppController {
  constructor(private readonly appService: AppService) {}
  
  //메서드 수준의 라우팅
  // http://url/index/hello
  // 'hello'라고 적어도 동일합니다
  @Get('/hello') 
  getHello() {
    return 'Hello!';
  }
  
  @Get() // http://url/index
  getIndex() {
  	return 'Index page';
  }
}

 

HTTP 메서드

NestJS는 모든 HTTP 메서드에 대한 데코레이터를 제공합니다.

데코레이터 기능
@Get(’라우팅') GET 메서드의 라우팅 설정
@Post(’라우팅') POST 메서드의 라우팅 설정
@Delete(’라우팅') DELETE 메서드의 라우팅 설정
@Put(’라우팅’) PUT 메서드의 라우팅 설정
@Patch(’라우팅’) PATCH 메서드의 라우팅 설정
@Options(’라우팅') OPTIONS 메서드의 라우팅 설정
@Head(’라우팅’) HEAD 메서드의 라우팅 설정
@All(’라우팅’) HTTP 메서드를 모두 처리

Request 객체

데코레이터를 사용해 HTTP 요청 시 전달되는 요청 객체를 다룰 수 있습니다.

데코레이터 기능
@Req(), @Request() request 객체
@Res(), @Response() response 객체
@Next() 다음 미들웨어 사용(NestJS에서 쓸 일 없을 것 같아요)
@Session() request  객체의 session 속성
@Param(key?: string) request  객체의 param 속성
@Body(key?: string) request  객체의 body 속성 (주로 Post, Put, Patch 메서드)
@Query(key?: string) request  객체의 query 속성
@Headers(name?: string) request  객체의 headers 속성
@Ip() request 객체의 ip 속성

경로, 쿼리 매개변수

@Query(), @Param() 데코레이터 사용 예시입니다.

@Get(':id')
find(
  @Param() params,
  @Param('id') id,
  @Query() queries,
  @Query('title') title,
) {
  // @Param() 데코레이터에 문자열을 전달하지 않으면 모든 param 객체를 전달 받습니다.
  // @Param() 데코레이터에 문자열을 전달하면 인자와 일치하는 param 객체의 값을 string으로 전달 받습니다.
  const isParamEqual = params.id === id;
  
  // @Query() 데코레이터에 문자열을 전달하지 않으면 모든 query 객체를 전달 받습니다.
  // @Query() 데코레이터에 문자열을 전달하면 인자와 일치하는 query 객체의 값을 string으로 전달 받습니다.
  const isQueryEqual = queries.title === title;
}

선택적 매개변수 사용법

'라우팅/매개변수' 형식으로 선택적 매개변수를 사용할 수 있습니다.

localhost:3000/id/password

NestJS 10 이하

NestJS 10 버전까지는 Express 4를 사용합니다.

Express 4는 물음표를 사용해 선택적 매개변수를 사용할 수 있습니다.

@Get('/:id?/:password?')
getUsers(@Param('id') id, @Param('password') password) {
  console.log(id);
  console.log(password);
  return `${id}, ${password}`;
}

NestJS 11 이상

NestJS 11 버전부터는 Express 5를 사용합니다.

Express 5는 중괄호 { }를 사용해 선택적 매개변수를 사용할 수 있습니다.

@Get('{/:id}{/:password}')
getUsers(@Param('id') id, @Param('password') password) {
  console.log(id);
  console.log(password);
  return `${id}, ${password}`;
}

리디렉션

응답을 특정 URL로 리디렉션 하려면 @Redirect() 데코레이터 혹은 url을 반환하면 됩니다.

둘 다 반환하는 경우 url 반환이 우선순위가 더 높습니다.

@Get('docs')
@Redirect('https://docs.nestjs.com', 302) // 우선순위가 낮습니다.
getDocs(@Query('version') version) {
  if (version && version === '5') {
    return { url: 'https://docs.nestjs.com/v5/' }; // 우선순위가 높습니다.
  }
}