Framework/NestJS

NestJS 톺아보기 : NestJS 개요 및 아키텍처

Joonfluence 2025. 5. 15. 09:16

앞으로 일주일 간 NestJS와 공부한 내용을 정리하여 올리려고 합니다.
*해당 글은 AI를 활용하여 정리하였음을 서두에 밝힙니다.

NestJS 개요와 아키텍처

1. NestJS란 무엇인가?

NestJS는 Node.js 환경에서 동작하는 진보적(Progressive)이고, 효율적이며, 확장성 있는 서버사이드 애플리케이션 프레임워크입니다. TypeScript를 기본으로 지원하며, 객체지향 프로그래밍(OOP), 함수형 프로그래밍(FP), 함수반응형 프로그래밍(FRP) 등 다양한 패러다임을 포용합니다. NestJS는 Angular에서 영감을 받은 구조와 데코레이터 기반의 프로그래밍 모델을 제공하여, 대규모 애플리케이션 개발에 적합한 아키텍처를 갖추고 있습니다.

주요 특징

  • 모듈화(Modularity): 기능 단위로 코드를 분리, 유지보수와 확장성에 유리
  • 의존성 주입(Dependency Injection): 객체 간 결합도를 낮추고 테스트 용이성 향상
  • 데코레이터 기반: @Module, @Injectable, @Controller 등으로 역할 명확화
  • 다양한 HTTP 플랫폼 지원: Express, Fastify 등
  • TypeScript 완전 지원: 정적 타입, 코드 자동완성, 리팩토링 용이
  • 테스트 친화적: 단위/통합 테스트를 쉽게 작성 가능
  • 마이크로서비스, GraphQL, WebSocket 등 다양한 아키텍처 지원

2. NestJS의 아키텍처

NestJS의 아키텍처는 모듈(Module), 컨트롤러(Controller), 서비스(Service/Provider), 미들웨어(Middleware), 가드(Guard), 인터셉터(Interceptor), 파이프(Pipe) 등으로 구성됩니다. 이 구조는 Spring Framework와 유사한 점이 많아, Spring 개발자라면 빠르게 적응할 수 있습니다.

2.1 모듈(Module)

  • NestJS의 모든 애플리케이션은 최소 하나 이상의 모듈로 구성됩니다.
  • @Module() 데코레이터를 사용해 정의하며, 관련된 컨트롤러, 서비스, 프로바이더를 그룹화합니다.
  • 모듈은 독립적으로 개발, 테스트, 배포가 가능하며, 재사용성과 유지보수성이 뛰어납니다.
  • 비유: Spring의 @Configuration + @ComponentScan과 유사

2.2 컨트롤러(Controller)

  • HTTP 요청을 처리하고, 클라이언트에 응답을 반환하는 역할
  • @Controller() 데코레이터로 정의하며, 라우팅 데코레이터(@Get, @Post 등)로 각 엔드포인트를 지정
  • 비즈니스 로직은 서비스에 위임하고, 컨트롤러는 요청/응답 흐름만 담당
  • 비유: Spring의 @RestController, @RequestMapping과 유사

2.3 서비스(Service, Provider)

  • 비즈니스 로직, 데이터 처리, 외부 API 연동 등 핵심 기능 담당
  • @Injectable() 데코레이터로 정의하며, DI 컨테이너에 의해 주입됨
  • 서비스는 싱글턴으로 관리되며, 여러 컨트롤러/서비스에서 재사용 가능
  • 비유: Spring의 @Service, @Component와 유사

2.4 의존성 주입(Dependency Injection)

  • NestJS는 자체 DI 컨테이너를 내장하고 있어, 객체 간 결합도를 낮추고 테스트 용이성을 극대화
  • 생성자 주입 방식이 기본이며, 커스텀 프로바이더, 팩토리 프로바이더 등 다양한 주입 패턴 지원
  • 비유: Spring의 DI와 매우 유사

2.5 미들웨어(Middleware)

  • 요청(Request)과 컨트롤러 사이에서 동작하는 함수/클래스
  • 인증, 로깅, 요청 변환 등 공통 처리 로직 구현에 사용
  • Express/Fastify의 미들웨어와 동일한 개념
  • 비유: Spring의 Filter와 유사

2.6 가드(Guard)

  • 인증/인가(Authorization) 로직을 담당
  • 요청이 컨트롤러에 도달하기 전에 실행되어, 접근 권한을 제어
  • @CanActivate 인터페이스 구현
  • 비유: Spring Security의 @PreAuthorize, @Secured와 유사

2.7 인터셉터(Interceptor)

  • 요청/응답을 가로채어 추가 로직(로깅, 트랜스포밍, 캐싱 등) 수행
  • AOP(관점 지향 프로그래밍)와 유사한 역할
  • 비유: Spring의 AOP, HandlerInterceptor와 유사

2.8 파이프(Pipe)

  • 요청 데이터의 유효성 검사, 변환(Validation, Transformation) 담당
  • DTO와 class-validator를 활용한 강력한 검증 로직 구현 가능
  • 비유: Spring의 Validator, Converter와 유사

2.9 예외 필터(Exception Filter)

  • 전역/커스텀 예외 처리 로직 구현
  • @Catch() 데코레이터로 정의, 일관된 에러 응답 제공
  • 비유: Spring의 @ControllerAdvice, @ExceptionHandler와 유사

3. NestJS의 실행 흐름

  1. main.ts에서 애플리케이션 부트스트랩
  2. 루트 모듈(AppModule)에서 하위 모듈, 컨트롤러, 서비스 등록
  3. HTTP 요청이 들어오면, 미들웨어 → 가드 → 인터셉터 → 파이프 → 컨트롤러 → 서비스 순으로 처리
  4. 컨트롤러가 서비스 호출, 결과를 응답으로 반환
  5. 예외 발생 시, 예외 필터가 처리

4. Spring과 NestJS의 비교

항목 Spring NestJS
언어 Java/Kotlin TypeScript/JavaScript
DI 컨테이너 있음 있음
모듈화 있음 있음
데코레이터/어노테이션 어노테이션 데코레이터
미들웨어/필터 Filter, Interceptor Middleware, Interceptor
AOP 지원 Interceptor로 유사 지원
테스트 JUnit, Mockito 등 Jest, Supertest 등
비동기 처리 CompletableFuture 등 Promise, async/await
마이크로서비스 Spring Cloud NestJS Microservices
  • 유사점: DI, 모듈화, 데코레이터/어노테이션 기반, 미들웨어/필터, 테스트 친화성 등
  • 차이점: 언어, 런타임 환경, 비동기 처리 방식, 일부 아키텍처 패턴

5. NestJS의 확장성 및 활용 분야

  • REST API: Express/Fastify 기반의 RESTful API 서버 구축
  • GraphQL: Apollo 기반 GraphQL API 지원
  • WebSocket: 실시간 데이터 처리
  • 마이크로서비스: 다양한 트랜스포트(TCP, Redis, NATS 등) 지원
  • CLI: nest-cli를 통한 프로젝트 생성, 코드 생성, 테스트, 빌드 자동화
  • 테스팅: Jest 기반의 단위/통합 테스트 환경 제공
  • 엔터프라이즈급 애플리케이션: 대규모 서비스, BFF, 모놀리식/마이크로서비스 아키텍처 모두 지원

6. NestJS 프로젝트 구조 예시

src/
  ├── app.controller.ts      // 루트 컨트롤러
  ├── app.module.ts          // 루트 모듈
  ├── app.service.ts         // 루트 서비스
  ├── main.ts                // 엔트리포인트
  └── [feature]/             // 도메인/기능별 폴더
        ├── feature.module.ts
        ├── feature.controller.ts
        └── feature.service.ts
  • 각 기능별로 모듈/컨트롤러/서비스를 분리하여 유지보수성과 확장성을 극대화

7. NestJS의 주요 철학

  • 테스트 용이성(Testability): DI, 모듈화, 데코레이터 기반 구조로 테스트 코드 작성이 쉽다.
  • 확장성(Scalability): 모듈 단위 확장, 마이크로서비스, 다양한 트랜스포트 지원
  • 유지보수성(Maintainability): 명확한 책임 분리, 일관된 코드 구조
  • 생산성(Productivity): nest-cli, 강력한 타입 지원, 풍부한 공식/서드파티 모듈

8. 공식 문서 및 참고 자료

NestJS는 Spring 개발자에게 매우 친숙한 구조와 개념을 제공하면서도, Node.js/TypeScript의 장점을 극대화한 프레임워크입니다. NestJS의 전체적인 구조와 철학, 그리고 Spring과의 비교를 통해 큰 그림을 잡은 후, 각 구성요소별로 실습과 함께 학습하면 빠르게 실무에 적용할 수 있습니다.

반응형