dto를 도입해야 하는 이유(deserialization error) - 초록 스터디 3주차

김성재·2024년 3월 9일
0

dto(Data Transfer Object)는 말 그대로 데이터 전송 객체를 말한다. 계층 간의 데이터 전송을 위해 도메인 모델 대신 사용되는 객체이다.

지금까지 어떤 기능 구현을 할 때 dto를 사용하면 좋다는 것을 알고 있지만 이번 초록 스터디는 끝까지 구현하지 않았었다. 솔직히 어떠한 목적과 이유가 있었다면 거짓말이고 귀찮기도 했고 도메인 모델을 dto로 사용해도 지금까지 어떠한 에러도 겪지 못했기 때문이다.

일반적으로 entity를 직접 반환하면 안되는 이유는 다음과 같다

  • 필요한 정보만 반환, 전송하기 어렵다
  • 엔티티 간 양방향 관계가 존재할 경우, 엔티티를 반환하는 순간 순환 참조 문제가 발생 할 수 있다.
  • 요구사항이 변경되어 엔티티의 필드 이름이 변경 될 경우, api 스펙만 변경되어 추가 작업이 요구된다.

이 반대가 dto 도입시 장점이 될 것이다. 이걸 말로만 이해하고 있고 체감을 못하고 있었는데 이번에 deserialization error(역직렬화 에러)를 겪으면서 dto를 잘 적용해야 함을 새삼 느꼈다.

직렬화와 역직렬화의 개념을 살펴보고 가면 다음과 같다

직렬화

객체를 직렬화한다는 건 객체 상태를 바이트 스트림으로 바꿔서 바이트 스트림을 객체의 복사본으로 되돌릴 수 있음을 의미한다

역직렬화

역직렬화는 직렬화된 객체 형식을 객체의 사본으로 다시 바꾸는 프로세스를 말한다.

WARN 14696 --- [io-8080-exec-10] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Cannot construct instance of `roomescape.domain.Time` (although at least one Creator exists): no String-argument constructor/factory method to deserialize from String value ('1')]    

아마 이번 에러는 시간 테이블에 대한 정보를, 예약 할 때 가져야 하는 참조 관계가 되어서 구조가 복잡해져서 역직렬화 하는 과정에서 문제가 발생한 것 같다.

DTO를 사용하면, 역직렬화 과정을 단순화하여 이러한 오류를 줄일 수 있다. DTO는 클라이언트로부터 받은 데이터를 단순한 구조로 정의하며, 이로 인해 Spring 같은 프레임워크가 JSON 데이터를 해당 객체로 변환하는 과정이 더욱 명확해지고 오류 발생 가능성이 감소한다.

이 글을 보고 있는 누군가 deserialization error를 겪고 있다면 dto와 도메인 모델을 잘 분리했는지 다시 살펴보자

0개의 댓글