(NestJS) Nest JS - Controller

최건·2025년 4월 29일

참고 문서

https://docs.nestjs.com/controllers

컨트롤러란?

  • 컨트롤러는 들어오는 요청을 처리하고 클라이언트에게 응답을 다시 보내는 역할을 한다.
  • 즉, 클라이언트 → 서버로 들어오는 요청을 처리하고, → 다시 응답을 돌려주는 곳이다.
  • 기본 컨트롤러를 정의하는 데 필요한 @Controller() 데코레이터를 사용한다.

Controller 예시 코드


import { Controller, Get } from '@nestjs/common';

@Controller('cats')
export class CatsController {
  @Get()
  findAll(): string {
    return 'This action returns all cats';
  }
}

라우팅이란?

  • 어떤 URL 요청이 어떤 Controller 메서드에 매핑될지를 결정한다.
  • @Controller('cats') → /cats 경로를 prefix로 사용한다.
  • prefix: 앞에 붙이는 고정 경로
  • 메서드 데코레이터(@Get('breed'))로 상세 경로를 추가할 수 있다.

import { Controller, Get } from '@nestjs/common';

@Controller('cats')
export class CatsController {
  @Get('breed')
  findBreed() {
    return '고양이 품종 반환';
  }
}

Node Js와 비교하기

const express = require('express');
const app = express();
const router = express.Router();

router.get('/breed', (req, res) => {
  res.send('고양이 품종 반환');
});

app.use('/cats', router);  // <-- 여기서 /cats prefix

요청 객체 사용하기

  • NestJS는 기본적으로 Express의 Request 객체를 사용한다.
  • 요청 내용(Request)을 직접 보고 싶으면 @Req()로 주입하면 된다.
@Get()
findAll(@Req() request: Request): string {
  console.log(request.query); // 쿼리파라미터 확인
  return 'all cats';
}

하지만 Nest에서는 @Body(), @Query(), @Param() 등 전용 데코레이터를 쓰는 걸 권장합니다.

Node Js와 비교

@Body() <-> req.body
@Query() <-> req.query
@Param() <-> req.params
@Headers() <-> req.headers

Status Code 사용

import { Controller, Post, HttpCode } from '@nestjs/common';

@Controller('cats')
export class CatsController {
  @Post()
  @HttpCode(204)  // 응답 상태코드를 204로 설정
  create() {
    return 'No Content';
  }
}
  • @HttpCode(204)를 메서드 위에 데코레이터로 간단히 설정하면 된다

Node Js

const express = require('express');
const app = express();

app.post('/cats', (req, res) => {
  res.status(204).send('No Content');
});
  • res.status(204).send()처럼 직접 status() 메서드 호출해야 한다.

리다이렉션

import { Controller, Get, Redirect } from '@nestjs/common';

@Controller('cats')
export class CatsController {
  @Get()
  @Redirect('https://nestjs.com', 301)  // 301 상태 코드와 URL 설정
  redirectToDocs() {
    // 아무것도 안 리턴해도 됨 (Redirect 자동 처리)
  }
}
  • redirectToDocs() 메서드가 실행된 후에 리다이렉션이 발생한다.
  • 동적으로 리다이렉트를 처리하고 싶으면 다음과 같이 설정하면 된다.
@Get()
@Redirect('https://nestjs.com', 301)
redirectToDocs(@Query('version') version: string) {
  if (version === '5') {
    return { url: 'https://docs.nestjs.com/v5/', statusCode: 302 };
  }
}
  • return값으로 { url: '...', statusCode: ... }를 넘기면 동적으로 URL/코드를 바꿀 수도 있다.

서브도메인 라우팅

  • 특정 서브도메인(admin.example.com 등)으로 들어온 요청만 받게 설정할 수 있다.
@Controller({ host: 'admin.example.com' })

Express Response 직접 다루는 방법

  • @Res()로 Express의 응답 객체를 직접 조작할 수 있다.
@Post()
create(@Res() res: Response) {
  res.status(HttpStatus.CREATED).send();
}
  • 단, Res()를 쓰면 NestJS 기본 기능 (Interceptor, Exception Filter 등)을 사용할 수 없다.
  • 가능하면 Nest 방식(표준방식)을 권장함
  • 둘 다 쓰고 싶으면 passthrough: true를 사용한다.
@Get()
findAll(@Res({ passthrough: true }) res: Response) {
  res.status(HttpStatus.OK);
  return [];
}
profile
개발이 즐거운 백엔드 개발자

0개의 댓글