Home Nest.js
Post
X

Nest.js

Nest.js

Node.js는 로직 구성이 자유로워서 협업이나 유지 보수에서 아키텍처부터 파악해야한다는 단점이 존재합니다.

이러한 단점 보완하기 위해 나온 것이 NestJS입니다.

NestJS는 Node.js에서 사용하는 프레임워크로, Express와 같은 기존 Node.js 프레임워크의 기능을 확장하여 보다 체계적이고 모듈화된 구조를 제공합니다.

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

또한, TypeScript로 작성되어 강력한 타입 검사와 코드 자동 완성 기능을 제공합니다.

개발 단계에서 버그를 사전에 방지하고, 코드 재사용 및 유지 보수성을 높여줍니다.

즉, NestJS는 아키텍처 구조에 일관성을 부여하여 프로젝트 간 인력의 이동이 비교적 자유롭고, 효율적인 협업 구조에서 프로젝트를 개발할 수 있습니다.


의존성 주입 (DI, Dependency Injection)

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

NestJS는 의존성 주입을 사용하여 객체 간의 결합도를 낮추고, 코드의 테스트 가능성과 유지보수성을 향상시킵니다.


데코레이터 (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()

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

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

  • 기본적인 사용 방법

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

    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 라이센스를 따릅니다.