Tech Blog of Pinomaker

전 게시글에서 Controller와 Service를 이용해서 API를 개발 했는 데, 이번에는 DTO, PIPE와 Module에 대해서 알아보자

 

DTO

Dto란 Data Trasfer Object의 약자로, 계층간 데이터를 교환하기 위해 사용하는 로직을 가지지 않는 데이터 객체다.

Client(Brower)에서 Controller로, Service로 계속 계층을 이동할 때는 DTO를 사용한다.

 

전화번호를 생성할 때 계층간 이동에 사용할 DTO를 생성해보자.

 

[/src/phonebook/dto/phonebook.req.dto]

export class CreatePhoneBookDTO{
    name : string
    phone : string
}

 

DTO를 생성하는 방법은 간단하다. 계층 간 이동에 필요한 필드를 생성하면 된다.

생성한 후에는 DTO를 각 Controller와 Service에 적용시키면 끝이다.

... Controller

@Post()
async save(@Body() req: CreatePhoneBookDTO) {
  return this.phonebookService.save(req)
}

... Service

async save(req: CreatePhoneBookDTO) {
    this.phonebookList.push({
      idx: this.phonebookList.length + 1,
      ...req,
    })
}

 

 

PIPE

파이프는 @Injectable 데코레이터가 달린 클래스이며, 예외처리를 할 때 사용 할 수 있다.

출처 : John Ahn님의 Nest JS 따라하기 강좌

 

클라이언트로부터 요청이 오면, 해당 요청의 데이터에 대한 데이터를 처리하며, 문제가 있을 경우, 해당 파이프를 통과하지 못 하고, error를 처리하는 Handler로 넘긴다.

 

PIPE에는 Data TransfromationData Validation이 있다.

 

Data Transfromatin은 입력 받은 데이터를 원하는 형식으로 변환시켜준다. 예를 들어, 문자로 넘어온 값을 숫자로 변환할 수 있다.

 

Data Validation은 유효성을 체크하며, 입력 받은 데이터를 평가하여 유효하면, 데이터를 변경하지 않은 상태로 전달하고, 데이터가 유효하지 않은 경우 예외를 발생 시킨다.

 

일단 두가지 Module를 설치하자.

npm install class-validator class-transformer

 

그리고 Main.ts에 app.useGlobalPipes를 사용하여 파이프 설정을 하고 DTO에 원하는 유효성 검사 데코레이터를 필드에 추가하면 설정은 끝난다.

 

[main.ts]

import { ValidationPipe } from '@nestjs/common'
import { NestFactory } from '@nestjs/core'
import { AppModule } from './app.module'

async function bootstrap() {
  const app = await NestFactory.create(AppModule)
  app.useGlobalPipes(new ValidationPipe())
  await app.listen(3000)
}
bootstrap()

[phonebook.req.dto.ts]

import { IsString } from 'class-validator'

export class CreatePhoneBookDTO {
  @IsString()
  name: string

  @IsString()
  phone: string
}

 

Module

현재는 AppModule에 모든 Service와 Controller를 import 하지만, 기능 단위로 Controller와 Service를 여러개의 모듈로 관리할 수 있다.

 

우리는 phonebookModule를 생성하여, 해당하는 Service와 Controller를 관리해보자

 

먼자 module을  생성한다.

nest g mo

 

생성을 한 파일에 우리는 우리가 작업한 Service와 Module을 import 하자.

Controller는 controllers에 Service는 Provider에 import를 하면 되고, 우리가 생성한 모듈을 이제 AppModule에 import 하면 끝난다.

 

[phonebook.module.ts] -> 수정 전

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

@Module({})
export class PhonebookModule {}

 

[phonebook.module.ts] -> 수정 후

import { Module } from '@nestjs/common'
import { PhonebookController } from './phonebook.controller'
import { PhonebookService } from './phonebook.service'

@Module({
  controllers: [PhonebookController],
  providers: [PhonebookService],
})
export class PhonebookModule {}

 

PhonebookModule이 이미 import 되어있지만 주의할 점은, 기존의 AppModule에 있던 PhonebookService와 PhonebookController를 지워주자.

 

그 이유는 PhonebookModule에 import 되어있기에, 중복으로 적용되면 에러가 난다.

 

[AppModule.ts]

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

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

'B.E > Nest JS' 카테고리의 다른 글

Nestjs Swagger(1) - Swagger 설정  (0) 2023.10.09
[Nest JS] 파이프(Pipe)  (0) 2022.11.14
[Nest JS] 전화번호부 API 개발하기(1)  (0) 2022.08.24
[Nest JS] 구조에 대해서 알아보자.  (0) 2022.08.24
[Nest JS] Nest JS 시작하기.  (0) 2022.08.19
profile

Tech Blog of Pinomaker

@pinomaker

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!