오늘은 Nest.js를 사용하여 RESTful API를 구축하는 방법에 대해 자세히 살펴보겠습니다. RESTful API는 클라이언트와 서버 간의 상호작용을 효율적으로 처리하기 위해 설계된 아키텍처 스타일입니다. 데이터의 생성, 검색, 업데이트 및 삭제(CRUD)를 위한 직관적인 방법을 제공합니다.
1. Nest.js란?
Nest.js는 Node.js를 기반으로 한 효율적이고 신뢰할 수 있는 서버 사이드 애플리케이션 프레임워크입니다. TypeScript로 작성되었으며, Angular에서 영향을 많이 받아 모듈화, IoC(제어의 역전), 데코레이터 기반 프로그래밍과 같은 특징을 가지고 있습니다. Nest.js는 복잡한 애플리케이션을 쉽게 구조화하고 관리할 수 있게 도와줍니다.
2. 개발 환경 설정하기
2.1 Node.js 및 Nest CLI 설치
먼저, Node.js가 설치되어 있어야 합니다. Node.js가 설치되어 있지 않다면, [Node.js 공식 사이트](https://nodejs.org)에서 다운로드하여 설치합니다. 그 후, Nest CLI를 설치합니다.
npm install -g @nestjs/cli
2.2 새로운 Nest 프로젝트 생성
이제 Nest CLI를 사용하여 새로운 프로젝트를 생성합니다. 다음 명령어를 입력합니다.
nest new blog-api
프로젝트 디렉토리로 이동합니다.
cd blog-api
3. 게시글을 위한 모듈, 서비스 및 컨트롤러 생성하기
3.1 게시글 모듈 생성
게시글과 관련된 모든 내용을 처리하기 위해 게시글 모듈을 생성합니다.
nest generate module posts
3.2 게시글 서비스 생성
서비스는 비즈니스 로직을 처리하는 부분입니다.
nest generate service posts
3.3 게시글 컨트롤러 생성
컨트롤러는 HTTP 요청을 처리하고 클라이언트에게 응답하는 역할을 합니다.
nest generate controller posts
4. 게시글 생성, 조회, 수정, 삭제 API 구현하기
이제 게시글 API의 각 기능을 구현해보겠습니다. 각 부분은 서비스와 컨트롤러를 결합하여 처리됩니다.
4.1 게시글 모델 정의하기
게시글의 구조를 정의하기 위해 DTO(Data Transfer Object)를 생성합니다. src/posts/dto/create-post.dto.ts 파일을 생성하고 다음 내용을 추가합니다.
export class CreatePostDto {
title: string;
content: string;
}
4.2 게시글 인터페이스 정의하기
게시글 데이터 구조를 정의하기 위해 interfaces 파일을 생성합니다. src/posts/interfaces/post.interface.ts 파일을 생성하고 다음 내용을 추가합니다.
export interface Post {
id: number;
title: string;
content: string;
}
4.3 서비스 코드 구현하기
src/posts/posts.service.ts 파일을 열고, 게시글을 관리하는 코드를 작성합니다.
import { Injectable } from '@nestjs/common';
import { Post } from './interfaces/post.interface';
import { CreatePostDto } from './dto/create-post.dto';
@Injectable()
export class PostsService {
private readonly posts: Post[] = [];
private idCounter = 1;
create(createPostDto: CreatePostDto): Post {
const newPost = {
id: this.idCounter++,
...createPostDto,
};
this.posts.push(newPost);
return newPost;
}
findAll(): Post[] {
return this.posts;
}
findOne(id: number): Post {
return this.posts.find(post => post.id === id);
}
update(id: number, updatePostDto: CreatePostDto): Post {
const post = this.findOne(id);
if (post) {
post.title = updatePostDto.title;
post.content = updatePostDto.content;
}
return post;
}
delete(id: number): void {
const index = this.posts.findIndex(post => post.id === id);
if (index !== -1) {
this.posts.splice(index, 1);
}
}
}
4.4 컨트롤러 코드 구현하기
src/posts/posts.controller.ts 파일을 열고, API 요청을 처리하는 코드를 작성합니다.
import { Controller, Get, Post, Body, Param, Put, Delete } from '@nestjs/common';
import { PostsService } from './posts.service';
import { CreatePostDto } from './dto/create-post.dto';
import { Post as PostInterface } from './interfaces/post.interface';
@Controller('posts')
export class PostsController {
constructor(private readonly postsService: PostsService) {}
@Post()
create(@Body() createPostDto: CreatePostDto): PostInterface {
return this.postsService.create(createPostDto);
}
@Get()
findAll(): PostInterface[] {
return this.postsService.findAll();
}
@Get(':id')
findOne(@Param('id') id: number): PostInterface {
return this.postsService.findOne(id);
}
@Put(':id')
update(@Param('id') id: number, @Body() updatePostDto: CreatePostDto): PostInterface {
return this.postsService.update(id, updatePostDto);
}
@Delete(':id')
delete(@Param('id') id: number): void {
this.postsService.delete(id);
}
}
5. Nest.js 애플리케이션 실행하기
모든 코드가 작성되었으면, 애플리케이션을 실행시켜봅니다. 다음 명령어를 입력하여 서버를 실행합니다.
npm run start
브라우저에서 http://localhost:3000/posts를 열면 게시글 API에 접근할 수 있습니다.
6. API 테스트 사용하기
Postman과 같은 API 테스트 도구를 사용하여 다양한 API 요청을 테스트합니다. CRUD 기능을 가지고 입력한 데이터를 확인해보세요.
7. 마무리
이 글에서는 Nest.js를 사용하여 게시글 생성을 위한 RESTful API를 구축하는 과정을 살펴보았습니다. Nest.js의 모듈, 서비스, 컨트롤러를 이용하여 RESTful API를 효율적으로 구성할 수 있습니다. 이 구조를 기반으로 더 복잡한 비즈니스 로직이나 다양한 기능을 추가할 수 있습니다.
특히 Nest.js의 구조적인 접근 방식은 코드의 유지보수성을 높이며, 특히 대규모 애플리케이션에서 그 진가를 발휘합니다. 추가로, Nest.js는 GraphQL, WebSocket, Microservices 등 다양한 소프트웨어 디자인 패턴을 지원하므로 필요에 따라 확장할 수 있는 유연성이 있습니다.
이제 여러분도 Nest.js로 RESTful API를 구축할 수 있는 기초를 다졌습니다. 앞으로 더 많은 기능과 방법론을 탐구해보시기 바랍니다. 감사합니다!