프로그래밍/Nest.js

Nest.js 컨트롤러: 웹 애플리케이션의 중추적 역할

shimdh 2025. 3. 17. 09:14
728x90

Nest.js는 현대적인 웹 애플리케이션을 구축하기 위한 강력한 프레임워크로, 그 아키텍처는 모듈화와 구성 요소 간의 명확한 역할 분담으로 이루어져 있습니다. 이 중에서 컨트롤러는 클라이언트의 요청을 처리하고, 적절한 응답을 반환하는 중요한 역할을 합니다. 이번 포스트에서는 Nest.js의 컨트롤러에 대해 깊이 있게 살펴보겠습니다.

1. 컨트롤러란 무엇인가?

컨트롤러는 사용자 요청을 수신하고 이를 처리하여 결과를 반환하는 컴포넌트를 말합니다. HTTP 요청이 들어오면 해당 요청에 맞는 컨트롤러 메서드가 실행되어 비즈니스 로직 또는 데이터베이스 작업 등을 수행하게 됩니다. 이 과정에서 컨트롤러는 요청의 유효성을 검사하고, 필요한 경우 적절한 오류 메시지를 반환하는 등의 역할도 수행합니다. 따라서 컨트롤러는 단순한 데이터 전달자가 아니라, 애플리케이션의 흐름을 관리하는 중요한 구성 요소입니다.

2. 컨트롤러의 구조

컨트롤러는 일반적으로 다음과 같은 구조를 가집니다:

  • 경로(Endpoint): 클라이언트가 접근할 수 있는 URL로, 각 경로는 특정한 기능이나 리소스를 나타냅니다.
  • HTTP 메서드: GET, POST, PUT, DELETE 등 다양한 메서드를 통해 클라이언트의 요청을 처리합니다.
  • 메서드: 실제 요청 처리를 담당하는 함수로, 각 메서드는 특정한 비즈니스 로직을 수행합니다.

예를 들어, 사용자의 정보를 가져오는 UserController를 정의해볼 수 있습니다.

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

@Controller('users')
export class UserController {

  @Get()
  getAllUsers() {
    return '모든 사용자 정보';
  }
}

위 예제에서 @Controller('users') 데코레이터를 통해 /users 경로에 대한 모든 HTTP 요청은 UserController가 처리하도록 설정됩니다. 그리고 @Get() 데코레이터가 붙은 getAllUsers() 메서드는 GET 방식의 /users 요청에 대해 "모든 사용자 정보"라는 문자열을 반환합니다. 이처럼 컨트롤러는 클라이언트의 요청을 적절히 처리하여 응답을 생성하는 중요한 역할을 합니다.

3. 비즈니스 로직과 서비스 분리

Nest.js에서는 비즈니스 로직과 데이터 처리를 서비스 클래스로 분리하는 것이 중요합니다. 이렇게 하면 코드가 더 깔끔해지고 유지보수가 쉬워집니다. 서비스 클래스를 통해 비즈니스 로직을 캡슐화함으로써, 컨트롤러는 요청 처리에만 집중할 수 있게 됩니다. 이는 코드의 가독성을 높이고, 테스트를 용이하게 하며, 나중에 기능을 확장할 때도 유리합니다.

예를 들어:

import { Injectable } from '@nestjs/common';

@Injectable()
export class UserService {
  private users = ['사용자1', '사용자2'];

  findAll() {
    return this.users;
  }
}

import { Controller, Get } from '@nestjs/common';
import { UserService } from './user.service';

@Controller('users')
export class UserController {

  constructor(private readonly userService: UserService) {}

  @Get()
  getAllUsers() {
    return this.userService.findAll();
  }
}

여기서는 UserService 클래스에서 사용자 데이터를 관리하고 있으며, UserController에서는 그 서비스를 호출하여 데이터를 가져옵니다. 이 구조는 각 구성 요소의 책임을 명확히 하여 코드의 유지보수성을 높입니다.

4. 다양한 HTTP 메서드 활용

컨트롤러는 다양한 HTTP 메서드를 사용할 수 있습니다:

  • GET: 데이터 조회 (예: 모든 사용자 목록)
  • POST: 새로운 데이터 생성 (예: 새 사용자 추가)
  • PUT/PATCH: 기존 데이터 수정 (예: 특정 사용자의 정보 업데이트)
  • DELETE: 데이터 삭제 (예: 특정 사용자 삭제)

아래 예시는 POST 메서드를 사용하는 방법입니다:

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

@Controller('users')
export class UserController {

   @Post()
   createUser(@Body() userData) {
     // 여기에서 userData를 기반으로 새로운 사용자를 생성하는 로직 구현
     return '새로운 사용자 생성됨';
   }
}

위 코드는 클라이언트가 /users 경로에 POST 요청을 보내면 새로운 사용자가 생성되는 기능을 보여줍니다. 이처럼 다양한 HTTP 메서드를 활용하여 클라이언트의 다양한 요청을 처리할 수 있는 유연성을 제공합니다.

결론

Nest.js의 컨트롤러는 웹 애플리케이션 내에서 중요한 역할을 하며, 효율적인 라우팅 및 응답 처리를 가능하게 합니다. 올바른 아키텍처 설계를 통해 개발자는 코드 재사용성과 유지보수성을 높일 수 있으며, 이는 전체 애플리케이션 성능 향상에도 기여합니다. 컨트롤러의 역할을 이해하고 적절히 활용함으로써, 개발자는 더욱 견고하고 확장 가능한 웹 애플리케이션을 구축할 수 있습니다.

728x90