본문 바로가기

Development/TIL

Nest.js(feat.DTO)

지난 토요일에 작성해서 제출한 SA의 피드백을 확인하고 기획을 보완 및 수정하였다.
그리고 팀원 공통의 첫번쨰 챌린지 과제인 Nest.js 공부에 돌입하였다.


youtube nest.js 무료 강의

 

Nest.js란?

TypeScript로 작성된 서버 사이드 애플리케이션을 구축하기 위한 프레임워크이다.

Express.js를 기반으로하여 모듈 기반 아키텍처와 강력한 의존성 주입 컨테이너를 제공하여 확장 가능하고

유지 보수가 용이한 개발을 할 수 있게 해준다.

Nest.js는 간결하고 직관적인 문법을 가지며, 데코레이터를 사용하여 클래스와 메서드에 기능을 추가할 수 있다.

 

또한 다양한 기술과 통합할 수 있는 생태계를 가지고 있다.

DB는 TypeORM, Sequelize, Mongoose 등과 같은 ORM이나 ODM 라이브러리를 사용할 수 있고

WebSocket을 위한 Socket.io와 같은 라이브러리와도 통합이 가능하다.

그리고 테스트 도구로는 Jest를 기본적으로 지원하며, Passport를 사용하여 인증 기능을 쉽게 구현할 수 있다.

 

Nest.js의 주요 특징

  • 모듈 기반 아키텍처와 의존성 주입
  • 강력한 데코레이터 기반 문법
  • Express.js와의 호환성
  • 다양한 통합 및 확장 가능성
  • 테스트 용이성과 강력한 테스트 도구 지원

 

Nest.js 설치 및 초기세팅

Node.js 설치

안정화 버전 또는 최신버전 선택하여 설치

 

Node.js

Node.js® is a JavaScript runtime built on Chrome's V8 JavaScript engine.

nodejs.org

 

 

 

VSCODE를 사용하여 Nest.js 설치

프로젝트를 진행할 폴더를 만들고 vscode실행, 터미널에 명령어 입력

npm i -g @nestjs/cli

 

 

해당 폴더에 초기 세팅 생성 터미널 명령어

nest new ./

 

 

 

Nest.js 강의 시청 중에 생소한 개념이 등장했다.
DTO라는 것인데 mongoose의 schema나 sequelize의 migration과 비슷한 역할을 하는 것 같다.
개념을 정확히 정리하기 위해 정리해보았다. 

 

 

DTO(Data Transfer Object) : 데이터 전송 객체

데이터를 전송하거나 전달하는데 사용되는 객체이다.

DTO 객체는 데이터의 구조와 필드를 정의하고, 데이터를 캡슐화하여 전송하거나 전달하는데 사용된다.

주로 네트워크를 통해 클라이언트와 서버 간에 데이터를 주고받을 때 사용되며, 클라이언트와 서버 간의 데이터 형식을 표준화하고 데이터의 일관성을 유지하는데 도움을 준다.

일번적으로 DTO는 불변(immutable)하게 설계되어야하며, 데이터의 일관성과 안정성을 보장하기 위해 변경할 수 없는 형태로 사용된다.

 

DTO의 목적

  1. 데이터 전송: DTO는 여러 계층 또는 서비스 간에 데이터를 전송하기 위해 사용된다.
    클라이언트에서 서버로 데이터를 전송하거나, 서버에서 데이터를 클라이언트로 전달할 때 DTO를 사용하여
    데이터를 캡슐화하고 전송한다.
  2. 데이터 구조 표준화: DTO는 데이터의 구조를 정의하는 역할을 한다. 여러 계층 또는 서비스 간에 데이터를 교환할 때 DTO를 사용하여 데이터 구조를 표준화하고 일관성을 유지한다.
  3. 불필요한 데이터 필터링: DTO를 사용하면 클라이언트가 필요로 하는 특정 데이터 필드만 전달할 수 있다.
    이를 통해 불필요한 데이터를 제거하고 네트워크 대역폭을 절약할 수 있다.
  4. 보안: DTO를 사용하여 민감한 데이터를 캡슐화하고 전송하면 데이터의 노출을 제어할 수 있다.
    DTO를 통해 데이터를 적절하게 필터링하거나 암호화하여 보안을 강화할 수 있다.

 

 

DTO 적용 전

controller와 service 계층의 post 생성 코드이다.

Board의 property와 type을 일일이 지정해주고 있다.

만약 Board의 property가 변경된다면 수정해줘야할 곳이 많다.

property의 개수가 적을 때는 그나마 괜찮지만 수십개가 된다면 수정하다가 놓치는 부분이 생기기 마련이다.

// controller 계층

    @Post()
    createBoard(
        @Body('title') title: string,
        @Body('description') description: string
    ): Board {
        return this.boardsService.createBoard(title, description)
    }
    
    
// service 계층

    createBoard(title: string, description: string) Board {
        const board: Board = {
            id: uuid(),
            title,
            description,
            status: BoardStatus.PUBLIC
        }

        this.boards.push(board);
        return board;
    }

 

 

 

 

DTO 적용 후

create board의 dto를 지정해주는 파일을 생성 후 코드를 작성하고

controller와 service 계층에서 import하여 코드를 간결하게 수정하였다.

만약 board의 property에 수정 사항이 생긴다면 dto파일 한군데만 수정을 해주면된다.

결과적으로 코드의 유지보수가 매우 쉬워지는 것이다.

// create-board.dto.ts 파일
export class CreateBoardDto {
    title: string;
    description: string;
}



// controller 계층

    @Post()
    createBoard(
        @Body() createBoardDto: CreateBoardDto
    ): Board {
        return this.boardsService.createBoard(createBoardDto)
    }
    
    
// service 계층

    createBoard(createBoardDto: CreateBoardDto) {
        const { title, description } = createBoardDto;

        const board: Board = {
            id: uuid(),
            title,
            description,
            status: BoardStatus.PUBLIC
        }

        this.boards.push(board);
        return board;
    }

'Development > TIL' 카테고리의 다른 글

NestJS_Configuration  (0) 2023.05.26
Nest.js (feat.Pipe)  (0) 2023.05.24
기획 단계의 소통과 의사 결정에 대하여  (0) 2023.05.20
최종 프로젝트 시작  (0) 2023.05.20
클론 코딩 프로젝트 회고  (0) 2023.05.19