최근까지 repository 계층에서 리턴되는 타입에 entity를 그대로 사용했었다. 하지만 단위 테스트를 작성하다 보니 entity를 타입으로 지정하면 테이블 조인되어 있는 부분까지 명시해줘야 하는 불편함이 있었다.
이에 아웃풋 타입 DTO를 작성해 하려다보니 계속해서 실제 리턴타입과 명시된 아웃풋 DTO가 다르다는 에러가 발생했다. 내가 모르는 리턴 타입에 대한 DTO 작성 방법에 대해 찾다 보니 역직렬화에 대해 알 수 있었다.
역직렬화를 말하기전에 직렬화에 대해서 말하자면 객체(class) 형태의 데이터를 json 형태로 변환하는 과정이다. http 통신을 통해 데이터를 주고받을 때 json으로 주고받기 때문에 서버로 넘어온 데이터를 직렬화를 통해 객체(class) 형태로 바꿔주기 위해 필요한 과정이다. 직렬화와는 반대로 역직렬화는 json형태의 데이터를 객체(class) 형태의 데이터로 변환하는 과정이다.
(여기서 말하는 아웃풋 DTO는 repository 계층에서 리턴되는 타입을 말함. 실제로 비즈니스 로직이 전부 실행되고 클라이언트로 리턴되는 데이터는 직렬화를 통해 리턴됨.)
repository 리턴 응답 객체 역직렬화
이게 딱 repository 계층에서 찾아온 json 데이터를 객체(class)형태(아웃풋 DTO)로 바꿔주기 위해 필요한 과정이다.
class-transformer 설치
Typescript는 직렬화, 역직렬화를 지원하지 않기 때문에 라이브러리를 설치해줘야 한다. class-transformer는 nestjs 공식문서에서 나와있는 라이브러리이다.
사용 방법
먼저 내가 원하는 아웃풋 DTO를 작성하고, 변환하려고 하는 json 데이터를 불러온다. 그리고 class-transformer에서 지원하는 plainToInstance 메서드의 첫 번째 파라미터로 DTO, 두 번째 파라미터로 json 데이터를 넣어주면 변환이 완료된다.
아웃풋 DTO 예시
- 해당 데이터의 id, name은 private으로 설정하고 메서드를 통해서만 관리할 수 있게 설정했다.
export class OutputDTO {
private readonly id: number;
private readonly name: string;
constructor() {}
get _id(): number {
return this.id;
}
get _name(): string {
return this.name;
}
}
plainToInstance 예시
import { plainToInstance } from 'class-transformer';
.....
return plainToInstance(OutputDTO, json데이터);
http 통신 req data 역직렬화
http 통신 요청 객체를 역직렬화해서 사용하려면 아래와 같이 main.ts에 글로벌로 설정해 사용할 수 있다.
{ transform: true } 옵션을 통해 벨리데이션이 끝난 객체를 class로 바꿔서 제공해 주는 기능이다.
app.useGlobalPipes(new ValidationPipe({ transform: true }));
'NestJS' 카테고리의 다른 글
Express에서 DI 프레임워크 만들어보기 (0) | 2023.05.04 |
---|---|
Nest.js에서 모듈간의 의존성 관리하기 (0) | 2023.04.19 |
AuthGuard 예외처리 조건 만들기 (0) | 2023.04.19 |
Nest.js custom decorator 사용하기 (0) | 2023.03.07 |
@nestjs/config 사용하는 이유 (0) | 2023.02.09 |