Home Nest.js
Post
X

Nest.js

Nest.js

Node.js는 로직 구성이 자유로워 협업이나 유지 보수 시 구조 파악부터 해야 한다는 단점이 있습니다.
이러한 문제를 해결하기 위해 등장한 것이 바로 NestJS입니다.

NestJS는 TypeScript 기반의 Node.js 서버 프레임워크로,
Express(또는 Fastify)를 내부적으로 사용하면서 모듈화된 구조, 의존성 주입(Dependency Injection),
데코레이터(Decorator) 등을 제공하여 안정적이고 유지보수 가능한 백엔드 아키텍처를 구현할 수 있습니다.

모듈화된 구조와 의존성 주입(Dependency Injection) 패턴을 사용하여 애플리케이션을 관리합니다.


NestJS의 특징

  • 모듈화(Modularization) : 기능별로 코드를 모듈 단위로 분리
  • 의존성 주입(Dependency Injection) : 클래스 간 결합도 최소화
  • 데코레이터(Decorator) : 코드에 메타데이터를 부여해 직관적 구조 표현
  • TypeScript 완전 지원 : 정적 타입 검사를 통한 안정적 개발 환경
  • 테스트 용이성 : 단위 테스트 및 모킹(Mock) 구조에 유리

의존성 주입 (DI, Dependency Injection)

DI (Dependency Injection, 의존성 주입)는 객체 간의 의존 관계를 코드 내부에서 직접 생성하지 않고 외부에서 주입받아 사용하는 방식입니다.

NestJS는 의존성 주입을 사용하여 객체 간의 결합도를 낮추고, 테스트, 유지보수, 확장성을 높일 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
// 의존성 주입 없이 사용하는 경우
// UserController가 UserService의 구체 구현에 의존하기 때문에 테스트나 교체가 어려움
class UserService {
  getUsers() {
    return ["user1", "user2"];
  }
}

class UserController {
  private userService = new UserService(); // 직접 생성 (강한 결합)
}

// NestJS의 DI 방식
// NestJS의 DI 컨테이너가 UserService 인스턴스를 생성하고 재사용(Singleton) 합니다.
@Controller("users")
export class UserController {
  constructor(private readonly userService: UserService) {} // 의존성 주입

  @Get()
  getUsers() {
    return this.userService.getUsers();
  }
}

데코레이터 (Decorator)

Decorator는 클래스, 메서드, 속성, 매개변수 등에 메타데이터를 추가하는 문법입니다.

NestJS는 Decorator를 활용하여 개발자가 직관적으로 코드 구조를 정의할 수 있도록 도와줍니다.


클래스 데코레이터

클래스에 적용되어 특정 기능을 부여하는 데코레이터입니다.


@Module()

모듈을 정의하는 데 사용됩니다. 모듈은 관련된 컴포넌트(Controller, Service 등)를 하나로 묶습니다.

1
2
3
4
5
6
7
8
9
import { Module } from "@nestjs/common";
import { UserController } from "./user.controller";
import { UserService } from "./user.service";

@Module({
  controllers: [UserController],
  providers: [UserService],
})
export class UserModule {}
  • imports : 현재 모듈에서 사용할 다른 모듈
  • controllers : 현재 모듈에서 사용할 컨트롤러 목록
  • providers : 서비스 및 기타 의존성 객체
  • exports : 다른 모듈에 제공할 서비스 또는 모듈

@Controller()

HTTP 요청을 처리하는 클래스로, 클라이언트와의 인터페이스 역할을 합니다.

라우팅 (Routing)을 담당하며, Service와 상호작용하여 비즈니스 로직을 실행한 후 응답을 반환합니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import { Controller, Get, Post, Body, Param } from "@nestjs/common";

@Controller("users")
export class UserController {
  @Get()
  getUsers() {
    return ["user1", "user2"];
  }

  @Post()
  createUser(@Body() body: { name: string }) {
    return { message: `User ${body.name} created` };
  }

  @Get(":id")
  getUserById(@Param("id") id: string) {
    return { id, name: `User ${id}` };
  }
}

@Injectable()

@injectable()는 의존성 주입(DI, Dependency Injection)을 사용할 수 있도록 클래스(서비스, 리포지토리, 헬퍼 등)를 등록하는 역할을 합니다.

Service는 비즈니스 로직을 처리하는 클래스로, Controller와 Service를 분리하여 코드의 재사용성과 테스트 용이성을 높입니다.

  • 기본적인 사용 방법

    @Injectable()을 추가하면 NestJS가 UserServiceDI 컨테이너에서 관리합니다.

    1
    2
    3
    4
    5
    6
    7
    8
    
    import { Injectable } from "@nestjs/common";
    
    @Injectable()
    export class UserService {
      getUsers() {
        return ["user1", "user2"];
      }
    }
    

    NestJS가 UserService 인스턴스를 자동으로 주입합니다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    import { Controller, Get } from "@nestjs/common";
    import { UserService } from "./user.service";
    
    @Controller("users")
    export class UserController {
      constructor(private readonly userService: UserService) {} // DI 적용
    
      @Get()
      getUsers() {
        return this.userService.getUsers();
      }
    }
    

    모듈에서 @Injectable() 클래스 등록합니다.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    import { Module } from "@nestjs/common";
    import { UserController } from "./user.controller";
    import { UserService } from "./user.service";
    
    @Module({
      controllers: [UserController],
      providers: [UserService], // 서비스 등록
      exports: [UserService], // 다른 모듈에서도 사용 가능하게 설정
    })
    export class UserModule {}
    

메서드 데코레이터

메서드에 적용되어 API의 동작을 정의하는 데코레이터입니다.

  • @Get() : GET 요청 처리
  • @Post() : POST 요청 처리
  • @Put() : PUT 요청 처리
  • @Patch() : PATCH 요청 처리
  • @Delete() : DELETE 요청 처리

매개변수 데코레이터

메서드의 특정 매개변수 값을 가져올 때 사용됩니다.

  • @Param() : URL 경로의 :id 값을 가져옴
  • @Query() : /users?role=admin 같은 쿼리 파라미터 값을 가져옴
  • @Body() : POST 요청의 본문 데이터를 가져옴
  • @Headers() : HTTP 요청의 헤더(Header) 정보를 가져옴
  • @Req() : 요청 객체 (request) 전체를 가져옴
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.