ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • NestJS ResponseDto 적극 활용하기
    백엔드/견고한 백엔드 만들기 2024. 7. 8. 14:26
    728x90

     

    이전글

     

    1. 정적 팩토리 메서드 패턴을 사용하여 ResponseDto 직렬화(serialize) 하기

    CreateCatResponse에서 of라는 메서드는 static 메서드로 해당 메서드를 통해서 class-transformer를 이용해서 newCat이라는 plainObject들을 CreateCatResponse dto로 serialize 한다.

    2. ResponseDto 직렬화(serialize)를 위해 인터셉터와 데코레이터 사용

     
    위의 글을 참고하여 NestJS LifeCycle과 특정 프로퍼티들을 변환 하는 데코레이터들의 LifeCycle들을 이해하고 사용 해야한다.
     
    NestJS에서 ResponseDto는 보통 하나의 api당 1개의 responseDto를 사용하게 된다.
    requestDto는 validation과 @Type 데코레이터 또는 @Transform 데코레이터 스웨거등 활용도가 많다.
    하지만 responseDto는 swagger 이외에는 활용도가 많진 않았다.
    이글에서 NestJS Interceptor와 class-transforemr의 plainToInstance를 이용하여 인스턴스화 해서 responseDto를 활용 해볼려고 한다.

     

    - group-event-item-res.dto.ts

     

     

    - member-search-res.dto.ts

     

    - response-dto.interceptor.ts

    - controller

     

    1. response-dto.interceptor를 이용하여 plainToInstance활용하여 GroupEventItemResDto의 인스턴스화를 한다.
    2. 중첩 객체가 있을경우 @Type 데코레이터를 이용하여 중첩객체도 해당하는 클래스로 인스턴스화 한다.
    3. api를 마지막으로 return 하기 전에 @Transform 데코레이터를 이용하여 원하는 작업을 수행한다.

     

    해당 코드에서는 GroupEventItemResDto과 MemberSearchResDto에서 createdAt 프로퍼티를 리턴 하기 전에 @Transform 작업을 하기 때문에 호출2와 호출3이라는 console.log가 출력 되는지 테스트 해보면 정상적으로 나오는걸 알 수 있다.

     

     

    여기에서 사용하는 예제는 createdAt 칼럼에서 마지막으로 api를 리턴할때 toISOString 메서드를 이용하여 해당 Date 프로퍼티를 ISO 8601 format string 값으로 리턴 하는 예제이다.

    결론적으로 이런식으로 intercepoter와 plainToInstance를 활용하여 responseDto로 인스턴스화 해서 사용하게 된다면 api 결과값를 ResponseDto에 담아서 return 할 경우 @Transform이라던지 @Type 데코레이터등 toPlainOnly 즉, plain object로 변환될때만 (응답 Response)일때 해당 기능들로 데이터를 원하는 작업을 수행 할 수 있게 된다.

     

    3. 정적 팩토리 메서드 패턴과 interceptor를이용한 response dto serialize하기

    • interceptor에서 response dto를 제대로 serialize 되었는지 체크
    • Interceptor에서 ResponseDto 데코레이터를 넣어줬는지 체크
    • interceptor를 app 글로벌 인터셉터로 등록 데코레이터를 통해서 특정 ResponseDto타입을 가져오기 즉, 비지니스 로직이 수행되고 마지막에 responseDto로 serialize하는 공통 관심사를 AOP interceptor를 통해 분리

     

    728x90
Designed by Tistory.