Node.js 백엔드 개발에 혁신을 가져온 NestJS는 확장 가능하고 유지보수하기 쉬운 서버 애플리케이션을 만들기 위한 강력한 프레임워크입니다. 이 글에서는 NestJS를 설치하고 첫 번째 프로젝트를 성공적으로 구성하는 방법을 단계별로 알아보겠습니다.
사전 요구사항
NestJS 프로젝트를 시작하기 전에 다음 도구들이 설치되어 있어야 합니다:
- Node.js (v16 이상 권장)
- npm (v8 이상) 또는 yarn
Node.js와 npm이 설치되어 있는지 확인하려면 터미널에서 다음 명령어를 실행하세요:
node --version
npm --version
NestJS CLI 설치하기
NestJS CLI(Command Line Interface)는 새 프로젝트 생성, 모듈 추가, 컨트롤러 생성 등 개발 프로세스를 가속화하는 도구입니다. 전역으로 설치하려면 다음 명령어를 실행하세요:
npm install -g @nestjs/cli
또는 Yarn을 사용한다면:
yarn global add @nestjs/cli
설치가 완료되면 nest 명령어를 사용할 수 있습니다. 버전을 확인하여 성공적으로 설치되었는지 확인해 보세요:
nest --version
첫 번째 NestJS 프로젝트 생성하기
NestJS CLI를 사용하여 새 프로젝트를 생성하는 것은 매우 간단합니다. 다음 명령어를 실행하세요:
nest new my-nest-project
명령어를 실행하면 패키지 관리자를 선택하라는 메시지가 표시됩니다:
- npm
- yarn
- pnpm
선호하는 패키지 관리자를 선택하면 CLI가 프로젝트 구조를 생성하고 필요한 모든 의존성을 설치합니다. 이 과정은 몇 분 정도 소요될 수 있습니다.
만약 TypeScript를 사용하지 않고 JavaScript로 프로젝트를 생성하고 싶다면:
nest new my-nest-project --language javascript
하지만 TypeScript는 NestJS의 핵심 철학인 타입 안전성과 객체 지향 프로그래밍을 완전히 활용할 수 있게 해주므로 강력히 권장됩니다.
프로젝트 구조 살펴보기
NestJS 프로젝트가 성공적으로 생성되면 다음과 같은 기본 디렉토리 구조가 만들어집니다:
my-nest-project/
├── node_modules/
├── src/
│ ├── app.controller.spec.ts
│ ├── app.controller.ts
│ ├── app.module.ts
│ ├── app.service.ts
│ └── main.ts
├── test/
│ ├── app.e2e-spec.ts
│ └── jest-e2e.json
├── .eslintrc.js
├── .gitignore
├── .prettierrc
├── nest-cli.json
├── package.json
├── package-lock.json (또는 yarn.lock)
├── tsconfig.build.json
├── tsconfig.json
└── README.md
이 구조를 간략히 살펴보겠습니다:
- src/: 애플리케이션 소스 코드가 포함된 메인 디렉토리
- main.ts: 애플리케이션의 엔트리 포인트, NestFactory를 사용하여 앱을 생성하고 실행
- app.module.ts: 루트 모듈, 애플리케이션의 모든 구성 요소를 조직
- app.controller.ts: 기본 컨트롤러 샘플
- app.service.ts: 기본 서비스 로직 샘플
- app.controller.spec.ts: 컨트롤러에 대한 단위 테스트
- test/: e2e(end-to-end) 테스트 파일
- nest-cli.json: NestJS CLI 설정 파일
- tsconfig.json & tsconfig.build.json: TypeScript 컴파일러 설정
- .eslintrc.js & .prettierrc: 코드 스타일 및 린팅 규칙
애플리케이션 실행하기
프로젝트로 이동하여 개발 모드에서 애플리케이션을 실행해 보겠습니다:
cd my-nest-project
npm run start:dev
또는 Yarn을 사용한다면:
cd my-nest-project
yarn start:dev
start:dev 명령은 파일 변경을 감지하여 자동으로 애플리케이션을 다시 시작하는 핫 리로드 기능이 활성화된 개발 모드로 애플리케이션을 시작합니다.
기본적으로 애플리케이션은 http://localhost:3000에서 실행됩니다. 브라우저에서 이 URL을 열면 "Hello World!"라는 메시지가 표시됩니다. 이것은 기본 컨트롤러(app.controller.ts)에 의해 제공되는 응답입니다.
간단한 REST API 엔드포인트 추가하기
첫 번째 NestJS 프로젝트가 성공적으로 실행되었으니, 간단한 REST API 엔드포인트를 추가해 보겠습니다.
먼저, src 디렉토리에 items 디렉토리를 만들고 그 안에 새로운 컨트롤러와 서비스를 생성해 보겠습니다. NestJS CLI를 사용하면 이러한 작업이 매우 쉬워집니다:
nest generate controller items
nest generate service items
짧게 g 명령을 사용하는 것도 가능합니다:
nest g controller items
nest g service items
이 명령어들은 다음 파일들을 생성합니다:
- src/items/items.controller.ts (및 spec 파일)
- src/items/items.service.ts (및 spec 파일)
또한, 자동으로 app.module.ts에 이러한 구성 요소를 등록합니다.
이제 생성된 파일들을 수정하여 간단한 아이템 API를 만들어 보겠습니다.
먼저, Item 인터페이스를 정의하기 위해 src/items/item.interface.ts 파일을 생성합니다:
// src/items/item.interface.ts
export interface Item {
id: number;
name: string;
description: string;
completed: boolean;
}
다음으로, 서비스 파일을 수정하여 아이템 관리 로직을 구현합니다:
// src/items/items.service.ts
import { Injectable } from '@nestjs/common';
import { Item } from './item.interface';
@Injectable()
export class ItemsService {
private readonly items: Item[] = [];
findAll(): Item[] {
return this.items;
}
findOne(id: number): Item {
return this.items.find(item => item.id === id);
}
create(item: Item): Item {
this.items.push(item);
return item;
}
delete(id: number): void {
const index = this.items.findIndex(item => item.id === id);
if (index !== -1) {
this.items.splice(index, 1);
}
}
}
마지막으로, 컨트롤러를 수정하여 클라이언트 요청을 처리하는 엔드포인트를 정의합니다:
// src/items/items.controller.ts
import { Controller, Get, Post, Body, Param, Delete } from '@nestjs/common';
import { ItemsService } from './items.service';
import { Item } from './item.interface';
@Controller('items')
export class ItemsController {
constructor(private readonly itemsService: ItemsService) {}
@Get()
findAll(): Item[] {
return this.itemsService.findAll();
}
@Get(':id')
findOne(@Param('id') id: string): Item {
return this.itemsService.findOne(+id);
}
@Post()
create(@Body() item: Item): Item {
return this.itemsService.create(item);
}
@Delete(':id')
delete(@Param('id') id: string): void {
return this.itemsService.delete(+id);
}
}
이제 애플리케이션을 실행하면 (npm run start:dev 또는 yarn start:dev), 다음과 같은 REST API 엔드포인트를 사용할 수 있습니다:
- GET /items: 모든 아이템 조회
- GET /items/:id: ID로 특정 아이템 조회
- POST /items: 새로운 아이템 생성
- DELETE /items/:id: ID로 특정 아이템 삭제
이러한 엔드포인트를 테스트하기 위해 Postman이나 cURL과 같은 도구를 사용할 수 있습니다. 예를 들어, 새 아이템을 생성하기 위해 다음과 같은 POST 요청을 보낼 수 있습니다:
curl -X POST http://localhost:3000/items \
-H "Content-Type: application/json" \
-d '{"id": 1, "name": "첫 번째 아이템", "description": "이것은 첫 번째 아이템입니다.", "completed": false}'
그리고 모든 아이템을 조회하기 위해:
curl http://localhost:3000/items
마무리
축하합니다! NestJS를 성공적으로 설치하고 첫 번째 프로젝트를 설정했으며 간단한 REST API를 구현했습니다. 이제 NestJS의 기초를 이해하셨으니, 더 복잡한 애플리케이션을 구축할 준비가 되었습니다.
NestJS는 모듈화, 테스트 가능성, 확장성 등 많은 장점을 제공하며, TypeScript와의 완벽한 통합을 통해 개발자 경험을 크게 향상시킵니다. 다음 단계로는 데이터베이스 연결, 인증 시스템 구현, WebSocket 서비스 추가 등을 시도해 볼 수 있습니다.
이 튜토리얼이 도움이 되셨기를 바랍니다! 질문이나 문제가 있으면 댓글로 남겨주세요.
'NestJS' 카테고리의 다른 글
5. NestJS 모듈: 애플리케이션 구조화와 모듈간 의존성 관리 (0) | 2025.03.30 |
---|---|
4. NestJS 프로바이더와 서비스: 비즈니스 로직 분리하기 (0) | 2025.03.30 |
3. NestJS 컨트롤러: RESTful API 엔드포인트 구축하기 (0) | 2025.03.30 |
1. NestJS 소개: 철학, 아키텍처, Express와의 차이점 (0) | 2025.03.30 |
NestJS 소개: 현대적인 백엔드 개발을 위한 프레임워크 (2) | 2025.03.28 |