본문 바로가기
Dev-Code(Back-End)/NestJS

[NestJS] Entity기반 DTO 설정

by 김밥맨이야 2023. 2. 2.
반응형

혹시라도 Entity를 작성하지 않았다면 아래링크로 가서 작성 후 아래글을 읽으시길 추천드립니다.

2023.03.15 - [Dev-Code(Back-End)/NestJS] - [NestJS] Entity 작성하기 (feat.TypeORM)

 

 

 

DTO는 계층 간의 데이터 이동 객체로 사용된다. 

클라이언트에서 보낸 데이터도 DTO로 이동시킬 수 있으며 반대로 DB에서부터 나온 데이터 역시 DTO를 이용하여 이동시킬 수 있다.

 

예전에 스프링 프레임워크를 사용하여 개인적으로 웹페이지를 만들어 보았을 때는 DTO를 모두 정의해야 해서 어렵지는 않지만 꽤 귀찮았던 기억이 있다. 

 

지금 생각해보면 아마 편하게 할 수 있는 방법이 있었을 텐데 내 실력이 부족했을 것이다.

 

하지만 이번에 NestJS 프레임 워크를 사용하면서 DTO를 작성하려고 보니 간편하게 설정할 수 있는 방법이 있었다.

 

바로 PickType을 상속받아 사용하는 방법이다.

유저 생성 DTO

위와 같이 DTO의 클래스를 정의해 주면서 PirckType을 상속받아 사용하면 DTO에 많은 내용을 적지 않아도 된다.

 

단, 내가 현재 DTO를 사용하는 의미는 단순히 데이터를 옮겨 다니기 위한 것만은 아니다!

내가 DTO에 지정해둔 데이터대로 형식에 맞게, 빠짐없이 잘 들어왔는지 확인하는 기능도 포함되어 있다.

 

이는 class-validator를 사용하여 자료형 및 데이터 미수신 유무를 확인할 수 있다.

자세한 내용은 나중에 Class-Validator를 따로 포스팅하도록 해야지...

 

아무튼! DTO를 저렇게 짧게 구성할 수 있는 이유는 Entity에서 Class Validation을 미리 처리했기 때문이다.

어떤 형태의 데이터가 들어와야 하는지, 필수데이터 여부 등을 Entity에서 미리 지정해 놓았기 때문에 DTO에서는 그저 항목명만 가져다 쓰면 되는 것이다.

 

문법은

export class 'DTO이름' extends PickType('엔티티명', [

  '데이터 비교할 칼럼명 1',

  '데이터 비교할 칼럼명 2',

  '데이터 비교할 칼럼명 3',

] as const)

 

위와 같이 작성하면 된다. 더 좋은 방법이 있을 수도 있지만 현재로서는 이게 내 최선이다....

 

아무튼 덕분에 몇몇 모듈에서는 DTO를 저 정도까지만 작성하고 넘어가고 있다.

 

다음에는 DTO와 Entity를 최대한 분리하는 방법에 대해서 적어보려고 한다.

 

코드를 좀 세련되게 작성해보고 싶은데 생각보다 잘 안된다... 열심히 하면 언젠간 되겠지 뭐...

반응형

댓글