TIL - 20260218

juni·2026년 2월 18일

TIL

목록 보기
271/316

0218 NestJS 기초 (1/N): 왜 NestJS인가? 핵심 구조의 이해


✅ 1. NestJS란 무엇인가?

  • NestJS는 효율적이고, 안정적이며, 확장성 높은 서버 사이드 애플리케이션을 구축하기 위한 Node.js 프레임워크입니다.

  • 내부적으로는 Express.js (또는 Fastify) 위에서 동작하며, TypeScript를 완벽하게 지원합니다.

  • 핵심 철학:

    1. Angular에서 영감을 받은 아키텍처: 모듈(Module), 컨트롤러(Controller), 서비스(Provider) 등 잘 구조화된 아키텍처를 제공하여, 대규모 애플리케이션을 체계적으로 구성할 수 있도록 돕습니다.
    2. OOP, FP, FRP의 결합: 객체 지향 프로그래밍(OOP), 함수형 프로그래밍(FP), 함수형 반응형 프로그래밍(FRP)의 장점을 결합하여 유연한 개발을 지원합니다.
    3. TypeScript 기반: 정적 타입을 통해 코드의 안정성을 높이고, 개발 단계에서 오류를 미리 발견할 수 있게 합니다.
  • 왜 NestJS를 사용하는가?: 순수한 Node.js나 Express.js는 자유도가 매우 높지만, 정해진 구조가 없어 개발자마다 코드가 파편화되고 대규모 프로젝트 관리가 어려워지는 단점이 있습니다. NestJS는 Spring이나 Angular처럼 의견이 있는(Opinionated) 프레임워크로서, 잘 정의된 아키텍처를 제공하여 이러한 문제를 해결하고 개발 생산성을 극대화합니다.


✅ 2. NestJS 프로젝트 시작하기 (@nestjs/cli)

  • NestJS CLI는 NestJS 프로젝트의 생성, 코드 생성(Scaffolding), 관리 등을 도와주는 강력한 명령줄 도구입니다.
  1. CLI 설치:

    npm i -g @nestjs/cli
  2. 새 프로젝트 생성:

    nest new my-project
    • 이 명령어를 실행하면, my-project라는 디렉토리가 생성되고, 필요한 모든 의존성 설치와 함께 기본적인 프로젝트 구조가 자동으로 만들어집니다.
  3. 개발 서버 실행:

    cd my-project
    npm run start:dev
    • start:dev 스크립트는 파일 변경을 감지하여 자동으로 서버를 재시작해주는 Hot-Reloading 기능을 제공합니다.

✅ 3. NestJS의 3대 핵심 구성 요소

  • NestJS 애플리케이션은 크게 컨트롤러, 프로바이더, 모듈이라는 세 가지 핵심 요소로 구성됩니다.

➕ 3-1. 컨트롤러 (Controller)

  • 역할: 들어오는 HTTP 요청(Request)을 받고, 그 결과를 클라이언트에게 응답(Response)하는 역할을 합니다. Spring의 @RestController와 매우 유사합니다.

  • 데코레이터: @Controller(), @Get(), @Post(), @Param(), @Body() 등 직관적인 데코레이터를 사용하여 라우팅과 요청 데이터 처리를 정의합니다.

  • 책임: 컨트롤러는 요청을 받고 응답을 보내는 "교통정리" 역할에만 집중해야 하며, 복잡한 비즈니스 로직은 프로바이더(서비스)에 위임해야 합니다.

    // src/app.controller.ts
    import { Controller, Get } from '@nestjs/common';
    import { AppService } from './app.service';
    
    @Controller() // 이 클래스가 컨트롤러임을 선언
    export class AppController {
      constructor(private readonly appService: AppService) {}
    
      @Get() // GET / 요청을 이 메서드와 매핑
      getHello(): string {
        return this.appService.getHello();
      }
    }

➕ 3-2. 프로바이더 (Provider)

  • 역할: 서비스(Service), 리포지토리(Repository), 팩토리(Factory) 등 컨트롤러가 아닌 대부분의 클래스를 프로바이더라고 합니다. 이 중 서비스가 가장 대표적이며, 핵심 비즈니스 로직을 처리하는 역할을 합니다.

  • @Injectable() 데코레이터: 이 데코레이터가 붙은 클래스는 NestJS의 DI(의존성 주입) 컨테이너에 의해 관리될 수 있음을 나타냅니다.

  • 의존성 주입 (DI): NestJS는 생성자(constructor)를 통해 프로바이더(e.g., AppService)를 다른 클래스(e.g., AppController)에 자동으로 주입해줍니다. 이를 통해 컴포넌트 간의 결합도를 낮추고 테스트 용이성을 높입니다.

    // src/app.service.ts
    import { Injectable } from '@nestjs/common';
    
    @Injectable() // 이 클래스가 프로바이더임을 선언
    export class AppService {
      getHello(): string {
        return 'Hello World!';
      }
    }

➕ 3-3. 모듈 (Module)

  • 역할: 관련된 컨트롤러와 프로바이더들을 하나의 그룹으로 묶는 역할을 합니다. 모듈은 애플리케이션의 구조를 정리하는 데 사용됩니다.

  • @Module() 데코레이터: 모듈을 정의하는 데 사용되며, 다음과 같은 주요 속성을 가집니다.

    • providers: 이 모듈에서 사용될 프로바이더(서비스)들의 배열.
    • controllers: 이 모듈에서 사용될 컨트롤러들의 배열.
    • imports: 다른 모듈에서 export된 프로바이더를 사용하고 싶을 때, 해당 모듈을 가져옵니다.
    • exports: 이 모듈에 포함된 프로바이더 중, 다른 모듈에서 사용할 수 있도록 외부로 공개할 것들을 지정합니다.
    // src/app.module.ts
    import { Module } from '@nestjs/common';
    import { AppController } from './app.controller';
    import { AppService } from './app.service';
    
    @Module({
      imports: [],
      controllers: [AppController], // AppController를 이 모듈에 등록
      providers: [AppService],     // AppService를 이 모듈에 등록
    })
    export class AppModule {}

📌 요약

  • NestJSTypeScript를 기반으로 하며, 구조화된 아키텍처를 제공하는 강력한 Node.js 서버 프레임워크입니다.
  • 애플리케이션은 크게 세 가지 요소로 구성됩니다.
    • 컨트롤러: HTTP 요청을 처리하고 응답을 보냅니다.
    • 프로바이더 (서비스): 핵심 비즈니스 로직을 수행하며, 의존성 주입(DI)을 통해 컨트롤러에 제공됩니다.
    • 모듈: 관련된 컨트롤러와 프로바이더를 하나의 기능 단위로 묶어 애플리케이션의 구조를 체계적으로 관리합니다.
  • 이러한 구조는 Spring과 매우 유사하여, Java/Spring 개발자가 Node.js 생태계에 쉽게 적응할 수 있도록 돕습니다.

0개의 댓글