현대 웹 개발에서 RESTful API는 데이터와 서비스를 클라이언트와 서버 간에 효과적으로 공유하는 데 필수적입니다. Nest.js는 Node.js 기반의 웹 애플리케이션 프레임워크로, 확장성과 유지보수성을 고려하여 설계되었습니다. 이 글에서는
Nest.js를 사용하여 RESTful API를 구축하는 방법에 대해 자세히 알아보겠습니다. 또한, API의 기본을 이해하기 위해 컨트롤러와 서비스의 구현 방법에 대해서도 살펴보겠습니다.
1. Nest.js 소개
Nest.js는 TypeScript로 작성된 프레임워크로, Angular에서 영감을 얻어 모듈화된 구조를 갖추고 있습니다. Nest.js의 주요 장점 중 하나는 의존성 주입(Dependency Injection)을 통해 코드의 재사용성과 테스트 용이성을 높일 수 있다는 점입니다.
이를 통해 대규모 애플리케이션을 체계적으로 설계하고 관리할 수 있습니다.
2. Nest.js 설치 및 초기 설정
Nest.js를 설치하기 위해 Node.js가 필요합니다. Node.js가 설치된 후, Nest CLI를 통해 빠르게 프로젝트를 생성할 수 있습니다. CLI 도구를 설치하려면, 다음 명령어를 실행합니다:
npm install -g @nestjs/cli
Nest CLI를 설치한 후, 새로운 Nest.js 프로젝트를 생성하는 명령어는 다음과 같습니다:
nest new my-nest-app
생성된 프로젝트 디렉토리로 이동하고 다음 명령어로 개발 서버를 실행합니다:
cd my-nest-app
npm run start
3. RESTful API의 개념
REST(Representational State Transfer)는 클라이언트와 서버 간의 데이터 교환을 위한 아키텍처 스타일입니다. RESTful API는 주로 HTTP 프로토콜을 사용하여 CRUD(Create, Read, Update, Delete) 작업을 수행합니다.
RESTful API의 주요 특징은 상태를 유지하지 않으며, 모든 요청에 대해 클라이언트가 필요한 정보를 제공해야 한다는 점입니다.
4. Nest.js에서 RESTful API 만들기
이제 실제로 RESTful API를 구축해봅시다. 여기서는 간단한 “투두(Todo)” 리스트 애플리케이션을 예로 들겠습니다. 이 애플리케이션은 사용자가 투두 항목을 추가하고, 조회하고, 수정하고, 삭제할 수 있는 API를 제공합니다.
4.1. Todo 모듈 생성
먼저, Todo 모듈을 생성합니다. 터미널에서 다음 명령어를 입력하여 Todo 모듈을 생성합니다:
nest generate module todo
4.2. Todo 서비스 생성
Todo 서비스를 생성하여 비즈니스 로직을 처리합니다. 다음 명령어를 입력합니다:
nest generate service todo
서비스 파일은 todo.service.ts
라는 이름으로 생성됩니다. 다음은 TodoService의 기본 코드입니다:
import { Injectable } from '@nestjs/common';
import { Todo } from './todo.entity';
@Injectable()
export class TodoService {
private todos: Todo[] = [];
findAll(): Todo[] {
return this.todos;
}
create(todo: Todo): Todo {
this.todos.push(todo);
return todo;
}
// Todo 항목 수정 및 삭제 메서드 추가
}
4.3. Todo 컨트롤러 생성
이제 컨트롤러를 생성하여 사용자 요청을 처리합니다. 다음 명령어를 입력합니다:
nest generate controller todo
컨트롤러 파일은 todo.controller.ts
라는 이름으로 생성됩니다. 이 파일에 RESTful API의 엔드포인트를 정의합니다:
import { Controller, Get, Post, Body } from '@nestjs/common';
import { TodoService } from './todo.service';
import { Todo } from './todo.entity';
@Controller('todos')
export class TodoController {
constructor(private readonly todoService: TodoService) {}
@Get()
findAll(): Todo[] {
return this.todoService.findAll();
}
@Post()
create(@Body() todo: Todo): Todo {
return this.todoService.create(todo);
}
// 추가적인 엔드포인트 구현
}
4.4. Todo 엔티티 생성
이제 Todo의 구조를 정의하는 엔티티를 생성합니다. todo.entity.ts
라는 파일을 생성하고 아래와 같이 작성합니다:
export class Todo {
id: number;
title: string;
completed: boolean;
}
4.5. 모듈 통합
마지막으로 todo.module.ts
파일에 서비스와 컨트롤러를 통합합니다:
import { Module } from '@nestjs/common';
import { TodoController } from './todo.controller';
import { TodoService } from './todo.service';
@Module({
controllers: [TodoController],
providers: [TodoService],
})
export class TodoModule {}
5. 애플리케이션 실행 및 테스트
이제 모든 구현을 완료했습니다. 터미널에서 애플리케이션을 실행하면, 기본적으로 http://localhost:3000/todos
에서 API에 접근할 수 있습니다.
Postman이나 Curl 등의 도구를 사용하여 API의 엔드포인트를 테스트해볼 수 있습니다.
5.1. Todo 항목 추가하기
POST 요청을 통해 투두 항목을 추가할 수 있습니다.
예를 들어, 아래와 같은 JSON 형식으로 요청을 보낼 수 있습니다:
{
"id": 1,
"title": "첫 번째 투두",
"completed": false
}
5.2. Todo 항목 조회하기
GET 요청을 통해 모든 투두 항목을 조회할 수 있습니다.
http://localhost:3000/todos
로 GET 요청을 보내면, 추가한 투두 항목 전체 목록을 확인할 수 있습니다.
6. 결론
이번 글에서는 Nest.js를 활용하여 RESTful API를 구축하는 방법에 대해 알아보았습니다. Nest.js는 강력하고 유연한 구조를 제공하여 대규모 애플리케이션 개발에 적합합니다.
컨트롤러와 서비스의 패턴을 통해 비즈니스 로직과 HTTP 요청 처리를 분리하여 코드의 가독성과 유지보수성을 높일 수 있습니다.
더욱 다양한 사용 사례와 고급 기능에 대해 공부하면서 Nest.js의 매력을 더 깊이 발견할 수 있기를 바랍니다.