NestJS

2. NestJS 설치 및 첫 번째 프로젝트 구성하기

오늘의하늘은 2025. 3. 30. 15:14

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 서비스 추가 등을 시도해 볼 수 있습니다.


이 튜토리얼이 도움이 되셨기를 바랍니다! 질문이나 문제가 있으면 댓글로 남겨주세요.


 

반응형