NestJS로 기본 API 서버 파일 정리

2025. 3. 25. 09:26· Web/NestJS
목차
  1. 📁 NestJS 기본 파일 구조
  2. ✅ app.module.ts - 앱의 루트 모듈
  3. ✅ app.controller.ts - 요청을 받아 처리하는 컨트롤러
  4. ✅ app.service.ts - 로직을 처리하는 서비스
  5. ✅ app.controller.spec.ts - 기본 컨트롤러 테스트
  6. 📌 정리
  7. ✅ app.e2e-spec.ts - E2E 테스트 예제
  8. ✅ jest-e2e.json - E2E 테스트 환경 설정
  9. 📌 E2E 테스트 요약
  10. ✅ .prettierrc - 코드 스타일 포맷 설정
  11. ✅ eslint.config.mjs - 린트 및 Prettier 연동 설정
  12. ✅ nest-cli.json - Nest CLI 설정
  13. ✅ tsconfig.json - TypeScript 전역 설정
  14. ✅ tsconfig.build.json - 빌드 전용 설정
  15. ✅ pnpm-lock.yaml - 의존성 버전 고정
  16. ✅ 마무리
반응형

NestJS는 Node.js 기반의 TypeScript 지원 백엔드 프레임워크로, 구조적이고 확장성 있는 서버 애플리케이션을 만들 수 있게 해줍니다. 이 글에서는 NestJS로 API 서버를 시작할 때 생성되는 핵심 파일들을 하나씩 살펴보며, 각각의 역할과 코드 구조를 자세히 설명합니다.


📁 NestJS 기본 파일 구조

NestJS를 생성하면 기본적으로 다음과 같은 파일들이 포함됩니다:

  • app.module.ts
  • app.controller.ts
  • app.service.ts
  • app.controller.spec.ts

이번 글에서는 이 네 파일의 구조와 기능을 코드 중심으로 살펴봅니다.


✅ app.module.ts - 앱의 루트 모듈

import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';

@Module({
  imports: [],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

@Module() 데코레이터는 NestJS에서 의존성 주입과 모듈화를 관리하는 핵심입니다.

  • controllers: API 요청을 처리할 컨트롤러 등록
  • providers: 서비스나 헬퍼 클래스를 의존성 주입으로 연결

AppModule은 Nest 애플리케이션의 진입점이자 구성의 중심 역할을 합니다.


✅ app.controller.ts - 요청을 받아 처리하는 컨트롤러

import { Controller, Get } from '@nestjs/common';
import { AppService } from './app.service';

@Controller()
export class AppController {
  constructor(private readonly appService: AppService) {}

  @Get()
  getHello(): string {
    return this.appService.getHello();
  }
}

이 컨트롤러는 HTTP 요청을 받아 해당 메서드로 연결합니다.

  • @Controller(): 이 클래스가 컨트롤러임을 명시
  • @Get(): HTTP GET 메서드와 매핑
  • appService.getHello(): 실제 로직은 서비스에 위임

NestJS는 컨트롤러와 서비스의 역할을 명확히 분리합니다.


✅ app.service.ts - 로직을 처리하는 서비스

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

@Injectable()
export class AppService {
  getHello(): string {
    return 'Hello World!';
  }
}
  • @Injectable(): Nest가 이 클래스를 의존성 주입할 수 있게 함
  • getHello(): 간단한 문자열을 반환하는 예시 메서드

이처럼 서비스는 비즈니스 로직을 처리하고, 컨트롤러는 요청/응답만 담당합니다.


✅ app.controller.spec.ts - 기본 컨트롤러 테스트

import { Test, TestingModule } from '@nestjs/testing';
import { AppController } from './app.controller';
import { AppService } from './app.service';

describe('AppController', () => {
  let appController: AppController;

  beforeEach(async () => {
    const app: TestingModule = await Test.createTestingModule({
      controllers: [AppController],
      providers: [AppService],
    }).compile();

    appController = app.get(AppController);
  });

  describe('root', () => {
    it('should return "Hello World!"', () => {
      expect(appController.getHello()).toBe('Hello World!');
    });
  });
});

NestJS에서는 @nestjs/testing 모듈을 활용해 유닛 테스트를 작성할 수 있습니다.

  • Test.createTestingModule: 의존성을 포함한 테스트 모듈 생성
  • expect(...).toBe(...): 반환 값을 검증하는 Jest 문법

📌 정리

파일명 역할
app.module.ts 루트 모듈로 앱 전체 구성
app.controller.ts HTTP 요청 수신 및 라우팅
app.service.ts 핵심 로직 처리
app.controller.spec.ts 컨트롤러 테스트 코드

 

✅ app.e2e-spec.ts - E2E 테스트 예제

import * as request from 'supertest';
import { Test } from '@nestjs/testing';
import { INestApplication } from '@nestjs/common';
import { AppModule } from './../src/app.module';

describe('AppController (e2e)', () => {
  let app: INestApplication;

  beforeAll(async () => {
    const moduleFixture = await Test.createTestingModule({
      imports: [AppModule],
    }).compile();

    app = moduleFixture.createNestApplication();
    await app.init();
  });

  it('/ (GET)', () => {
    return request(app.getHttpServer())
      .get('/')
      .expect(200)
      .expect('Hello World!');
  });
});

이 파일은 E2E(End-to-End) 테스트를 정의합니다. 실제 HTTP 요청을 보내서 API의 전체 흐름을 검증하는 데 사용됩니다.

  • supertest: HTTP 요청을 시뮬레이션하는 라이브러리
  • Test.createTestingModule(): 테스트 전용 Nest 앱 모듈 생성
  • app.getHttpServer(): Nest 앱의 실제 HTTP 서버에 접근
  • expect(...): 응답 코드와 본문을 검증

E2E 테스트는 실제 사용자 요청 시나리오를 자동화하는 데 효과적이며, 특히 통합된 컴포넌트 간의 흐름 테스트에 유용합니다.


✅ jest-e2e.json - E2E 테스트 환경 설정

{
  "moduleFileExtensions": ["js", "json", "ts"],
  "rootDir": ".",
  "testEnvironment": "node",
  "testRegex": ".e2e-spec.ts$",
  "transform": {
    "^.+\\.(t|j)s$": "ts-jest"
  }
}

이 설정 파일은 Jest 테스트 러너가 E2E 테스트를 어떻게 실행할지 정의합니다.

  • moduleFileExtensions: 사용할 파일 확장자
  • rootDir: 프로젝트 루트 디렉토리
  • testEnvironment: 테스트 환경 (Node.js)
  • testRegex: 어떤 파일이 테스트인지 정규식으로 지정 (예: .e2e-spec.ts)
  • transform: TypeScript를 Jest에서 인식하도록 ts-jest 적용

이 설정을 기반으로 jest --config jest-e2e.json 명령어를 통해 E2E 테스트를 실행할 수 있습니다.


📌 E2E 테스트 요약

파일 역할
app.e2e-spec.ts API의 전체 흐름을 시뮬레이션하고 응답을 검증
jest-e2e.json 테스트 환경, 변환기, 대상 파일 등 설정 정의

E2E 테스트는 실제 API를 배포하기 전, 실제와 유사한 환경에서 통합 테스트를 수행할 수 있게 해 줍니다.


✅ .prettierrc - 코드 스타일 포맷 설정

{
  "semi": true,
  "singleQuote": true,
  "tabWidth": 2,
  "printWidth": 100,
  "trailingComma": "all",
  "endOfLine": "auto"
}

Prettier 설정 파일로, 코드 스타일을 자동으로 정리하는 기준을 정의합니다.

  • semi: 세미콜론 사용 여부
  • singleQuote: 작은따옴표 사용
  • tabWidth: 들여쓰기 간격
  • printWidth: 한 줄 최대 길이
  • trailingComma: 마지막 쉼표 유지 여부

✅ eslint.config.mjs - 린트 및 Prettier 연동 설정

// @ts-check
import eslint from '@eslint/js';
import eslintPluginPrettierRecommended from 'eslint-plugin-prettier/recommended';
import globals from 'globals';
import tseslint from 'typescript-eslint';

export default tseslint.config(
  {
    ignores: ['eslint.config.mjs'],
  },
  eslint.configs.recommended,
  ...tseslint.configs.recommendedTypeChecked,
  eslintPluginPrettierRecommended,
  {
    languageOptions: {
      globals: {
        ...globals.node,
        ...globals.jest,
      },
      ecmaVersion: 5,
      sourceType: 'module',
      parserOptions: {
        projectService: true,
        tsconfigRootDir: import.meta.dirname,
      },
    },
  },
  {
    rules: {
      '@typescript-eslint/no-explicit-any': 'off',
      '@typescript-eslint/no-floating-promises': 'warn',
      '@typescript-eslint/no-unsafe-argument': 'warn'
    },
  },
);

이 구성은 TypeScript + ESLint + Prettier가 함께 동작하도록 구성된 고급 설정입니다.

  • typescript-eslint: 타입 기반 린팅
  • eslint-plugin-prettier: 포맷팅을 ESLint 룰로 강제
  • ecmaVersion: 5: ECMAScript 5까지 지원
  • TSConfig와 연동해 정적 분석 수행

✅ nest-cli.json - Nest CLI 설정

{
  "$schema": "https://json.schemastore.org/nest-cli",
  "collection": "@nestjs/schematics",
  "sourceRoot": "src",
  "compilerOptions": {
    "deleteOutDir": true
  }
}

이 설정은 nest-cli에서 Nest 프로젝트를 빌드하거나 generate할 때의 기본 동작을 제어합니다.

  • collection: Nest schematics 기반
  • sourceRoot: 소스 루트는 src/
  • deleteOutDir: 빌드 시 dist 디렉토리 제거

✅ tsconfig.json - TypeScript 전역 설정

{
  "compilerOptions": {
    "module": "commonjs",
    "declaration": true,
    "removeComments": true,
    "emitDecoratorMetadata": true,
    "experimentalDecorators": true,
    "allowSyntheticDefaultImports": true,
    "target": "ES2023",
    "sourceMap": true,
    "outDir": "./dist",
    "baseUrl": "./",
    "incremental": true,
    "skipLibCheck": true,
    "strictNullChecks": true,
    "forceConsistentCasingInFileNames": true,
    "noImplicitAny": false,
    "strictBindCallApply": false,
    "noFallthroughCasesInSwitch": false
  }
}

tsconfig.json은 프로젝트 전반의 TypeScript 컴파일 설정을 담당합니다.

  • emitDecoratorMetadata, experimentalDecorators: NestJS에 필수
  • strictNullChecks: 엄격한 타입 검사
  • target: ES2023으로 최신 JS 출력
  • outDir: dist/ 디렉토리에 컴파일 결과 저장

✅ tsconfig.build.json - 빌드 전용 설정

{
  "extends": "./tsconfig.json",
  "exclude": ["node_modules", "test", "dist", "**/*spec.ts"]
}

이 파일은 빌드 시에만 사용되는 tsconfig로, 테스트 파일 및 불필요한 폴더를 제외합니다.

  • extends: 메인 tsconfig를 기반으로 함
  • exclude: 테스트, 빌드 산출물 제외

✅ pnpm-lock.yaml - 의존성 버전 고정

pnpm-lock.yaml은 의존성 관리에 사용하는 lock 파일로, 다음을 고정합니다:

  • NestJS: @nestjs/common, @nestjs/core → v11.0.12
  • 타입스크립트: v5.8.2
  • 테스트 도구: jest, supertest, ts-jest
  • 코드 스타일링: eslint, prettier, typescript-eslint

pnpm을 사용하면 의존성 설치가 빠르고, 프로젝트 간 중복 없이 효율적입니다.


✅ 마무리

이번 포스팅에서는 NestJS 프로젝트의 설정 파일들을 정리해 보았습니다.

728x90
반응형

'Web > NestJS' 카테고리의 다른 글

VSCode에서 NestJS 디버깅을 위한 launch.json 설정  (0) 2025.03.28
  1. 📁 NestJS 기본 파일 구조
  2. ✅ app.module.ts - 앱의 루트 모듈
  3. ✅ app.controller.ts - 요청을 받아 처리하는 컨트롤러
  4. ✅ app.service.ts - 로직을 처리하는 서비스
  5. ✅ app.controller.spec.ts - 기본 컨트롤러 테스트
  6. 📌 정리
  7. ✅ app.e2e-spec.ts - E2E 테스트 예제
  8. ✅ jest-e2e.json - E2E 테스트 환경 설정
  9. 📌 E2E 테스트 요약
  10. ✅ .prettierrc - 코드 스타일 포맷 설정
  11. ✅ eslint.config.mjs - 린트 및 Prettier 연동 설정
  12. ✅ nest-cli.json - Nest CLI 설정
  13. ✅ tsconfig.json - TypeScript 전역 설정
  14. ✅ tsconfig.build.json - 빌드 전용 설정
  15. ✅ pnpm-lock.yaml - 의존성 버전 고정
  16. ✅ 마무리
'Web/NestJS' 카테고리의 다른 글
  • VSCode에서 NestJS 디버깅을 위한 launch.json 설정
불타는고굼이
불타는고굼이
잡동사니 끄적끄적
불타는 고구미 담벼락잡동사니 끄적끄적
반응형
250x250
불타는고굼이
불타는 고구미 담벼락
불타는고굼이
전체
오늘
어제
  • 공부 및 정리 (235)
    • Language (10)
      • Java (2)
      • Javascript (6)
      • Python (1)
      • C,C++ (1)
    • Web (42)
      • Tomcat (2)
      • Spring (11)
      • Node (4)
      • react (5)
      • NestJS (2)
      • Elastic Search (1)
      • etc (14)
      • error (3)
    • AI (17)
      • AI 동향 (2)
      • LLM관련 (1)
      • RAG (5)
      • LangChain (8)
      • Llamaindex (1)
    • Tools (16)
      • eclipse (1)
      • STS (3)
      • Visual Studio Code (8)
      • git | github (3)
      • Notion (0)
      • etc (1)
    • DB (3)
      • MySQL (2)
      • MSSQL (1)
    • Android (24)
      • Kotlin (24)
      • etc (0)
    • Algorithm & 자료구조 (15)
      • 백준 (4)
      • 프로그래머스 (1)
      • 기초수학 (4)
      • 자료구조 (6)
    • Image Processing (16)
      • 세팅 (1)
      • 예제 (6)
      • Python2Cpp (8)
      • YOLO (1)
    • 취미 (80)
      • photo (5)
      • food (48)
      • travel (6)
      • walk&run (16)
      • ETC (5)
    • ETC (7)
      • 제로베이스 (3)
      • 멀티캠퍼스 (1)
      • 패스트캠퍼스 INNERCIRCLE (3)

블로그 메뉴

  • 홈
  • 태그

공지사항

인기 글

태그

  • #홍대팝업스토어
  • #나가노마켓
  • #농담곰
  • #고미푸딩
  • #하루런 #harurun #하남미사경정공원 #임시완 #러닝대회후기 #5km마라톤 #하루야채 #커플런 #마라톤참가후기 #건강마라톤
  • 제로베이스
  • #경주여행 #황리단길카페 #경주카페추천 #향미사 #경주가볼만한곳 #첨성대 #대릉원 #경주핫플 #경주감성카페 #황리단길맛집 #경주말거리 #경주핫스팟
  • #팝플리
  • Spring
  • #홍대나가노
  • #elasticsearch설치 #dockerelasticsearch #검색엔진 #로컬서버구축 #elasticstack #검색솔루션 #elasticsearch보안
  • #나가노팝업
  • #홍대캐릭터샵
  • #경주맛집 #황리단길맛집 #향화정 #경주한옥맛집 #경주육회물회 #꼬막비빔밥 #해물파전맛집 #경주가볼만한곳 #경주맛집추천 #경주현지맛집 #경주여행코스 #경주로컬맛집 #한식전문점 #블로그후기 #먹스타그램 #맛집기록 #경주한옥식당 #황리단길한식
  • #속초맛집 #속초문어국밥 #문어국밥 #문어비빔국수 #속초해장국 #강원도맛집 #속초여행맛집 #속초로컬맛집 #문어요리 #속초밥집
  • #ai프로젝트 #dify #llm아키텍처 #ai서비스기획 #노코드ai #ai멘토링 #ai입문 #딥러닝 #머신러닝 #pm특강 #프로젝트관리 #초보ai개발자 #ai교육후기 #ai캠프후기 #ai기반서비스 #생성형ai #ai툴활용 #데이터기반서비스 #ai직무전환 #it비전공자 </p>
  • #일본캐릭터
  • #레트로카페
  • #속초중앙시장 #속초시장맛집 #속초오징어순대 #속초튀김 #속초닭강정 #중앙닭강정 #속초떡볶이 #강원도시장 #속초간식투어 #속초여행코스
  • 개발자 #백엔드공부 #백엔드스쿨
  • 백엔드
  • #보광정 #수육런 #남산러닝 #러닝이벤트 #단백질런 #러닝후기 #수육맛집 #러닝인증 #남산순환로 #러너들의맛집
  • java
  • #부트캠프후기 #개발자성장기 #코딩프로젝트 #프로그래밍교육 #1차프로젝트완료 #팀워크 #신입개발자일상 #개발자블로그
  • #치이카와굿즈
  • #나가노굿즈
  • #선유도맛집 #선유도역맛집 #선유도돈까스 #선유도회식 #내일식당 #내일다이닝 #대파안심돈까스 #돈까스맛집 #서울맛집추천 #영등포맛집 #혼밥추천 #회식장소추천 #맛집블로그 #블로그후기 #먹스타그램 #푸드로그 #맛집탐방
  • #홍대맛집
  • #선유도역맛집 #돈웍 #서울고기맛집 #1인고기세트 #목살구이 #된장찌개맛집 #영등포구맛집 #혼밥맛집 #삼겹전문점 #덮밥맛집 #서울혼밥추천
  • #프레퍼스 #다이어트식사 #헬스식단 #샐러드맛집 #다이어트맛집 #다이어트플레이트 #프레퍼스후기 #운동식단 #건강한한끼 #맛있는다이어트

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.0
불타는고굼이
NestJS로 기본 API 서버 파일 정리
상단으로

티스토리툴바

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.