인프런 커뮤니티 질문&답변

박준형님의 프로필 이미지

작성한 질문수

Practical Testing: 실용적인 테스트 가이드

Business Layer 테스트 (2)

Dto 사용에 관하여

24.06.23 12:02 작성

·

204

0

  • 학습 관련 질문을 남겨주세요. 어떤 부분이 고민인지, 무엇이 문제인지 상세히 작성하면 더 좋아요!

  • 먼저 유사한 질문이 있었는지 검색해 보세요.

  • 서로 예의를 지키며 존중하는 문화를 만들어가요.

     

 안녕하세요 강사님 강의 코드를 작성중 궁금한 점이 생겨 질문드립니다.

강의 예제 코드에서는 Dto를 예를 들어 OrderResponse 이런 식으로 Response, Requset를 생성해서 작성하셨는데 실무에서도 이런 방법으로 하시는 지 궁금합니다.

예로 프로젝트가 커지게 된다면 Order에 대해서도 많은 Request, Response가 발생하게 되어 저는 OrderDto 클래스를 두고 OrderDto클래스 속 static inner 클래스로 여러 Dto 클래스를 만들어서 사용했습니다. 이와 같은 방법은 추천 안하시는 지 궁금합니다.
또 Dto클래스를 record로 작성하는 경우도 봤는데 record를 사용하는 방법은 어떠한지 궁금합니다.

답변 2

0

박우빈님의 프로필 이미지
박우빈
지식공유자

2024. 06. 25. 20:22

박준형 님, 안녕하세요!

하나의 OrderDto 클래스 내에 모든 케이스의 상세 DTO를 만드신다고 말씀하신 것 같은데, 그리 추천하는 방식은 아닙니다.
Order라는 어찌보면 거대한 도메인 객체가, 그 필요에 따라 수많은 DTO로 파생될 수 있을텐데요.
각각의 DTO는 그 목적에 맞게 독립적으로 존재하는 것이 객체의 책임에 맞게 DTO를 구성하는 것이라 볼 수 있겠습니다. (DTO의 위치도 포함해서요.)

다만, 특정 DTO 내에서 object로 묶여서 관리되는 하위 데이터가 있다면, 그런 객체는 해당 DTO에 종속되는 객체이므로 내부 클래스로 만들어서 같이 관리할 수 있습니다.

예시를 들어보자면,

  • 아래 DTO는 각자의 위치에서 책임을 가지며 각각 관리하는 것이 좋음

    • Order를 생성하기 위한 OrderCreateRequest

    • Order를 수정하기 위한 OrderUpdateRequest

    • Order를 사용자 화면에 보여주기 위한 OrderDisplayResponse

    • Order를 관리자 화면에 보여주기 위한 OrderAdminResponse

  • 아래와 같은 경우는 DTO내에 inner class로 관리할 수 있음

    • OrderCreateRequest 내의 List<ProductDto> (주문을 생성하기 위한 상품 정보)

도움이 되셨기를 바랍니다.
감사합니다. 🙂

박준형님의 프로필 이미지
박준형
질문자

2024. 06. 29. 16:03

오 상세한 답변 감사합니다!

0

인프런 AI 인턴님의 프로필 이미지

2024. 06. 25. 12:06

안녕하세요, 인프런 AI 인턴입니다.

DTO(Data Transfer Object) 사용법에 관해 궁금하신 것 같네요. 실제로 프로젝트의 요구 사항과 크기에 따라 DTO를 설계하는 다양한 방법이 사용됩니다.

  1. Response, Request 별로 DTO 생성: 실무에서는 각각의 요구 사항에 맞추어 Response, Request DTO를 별도로 생성하는 것이 일반적입니다. 이 방식은 각각의 용도에 맞게 DTO를 세분화하여 관리할 수 있다는 장점이 있습니다.

  2. OrderDto 클래스 내에 static inner 클래스 사용: 프로젝트가 커지고, Order와 관련된 다양한 DTO가 필요할 때, 이러한 구조로 관리하는 것은 좋은 방법일 수 있습니다. 이를 통해 관련 DTO들을 한 곳에 모아서 관리함으로써 유지보수성을 높일 수 있습니다. 다만, 각각의 DTO가 서로 다른 목적을 가지고 있다면, 너무 많은 책임을 하나의 클래스에 부여하는 것으로 볼 수 있으므로 상황에 따라 적절히 선택하는 것이 중요합니다.

  3. DTO 클래스를 record로 작성: Java의 record는 불변성을 가지는, 데이터를 전달하는 용도로 유용한 구조입니다. 모든 필드가 private final이며, equals(), hashCode(), toString() 메소드가 자동으로 생성됩니다. 이러한 특징 때문에 DTO를 정의하기에 아주 이상적일 수 있습니다. 복잡한 로직보다는 단순 데이터 전달 목적으로 사용할 때 record 사용을 고려할 수 있습니다.

    • Spring Data JPA에서는 클래스 기반의 프로젝션을 사용하여 DTO를 정의할 수 있으며, Java Records를 사용해 DTO 타입을 정의하는 것이 이상적이라고 설명하고 있습니다. 중요한 점은 class-based 프로젝션은 JPQL에서는 사용할 수 있지만, native 쿼리에서는 사용할 수 없다는 점입니다.

참고 링크: Spring Data JPA - Reference Documentation

각각의 방법은 상황과 프로젝트의 필요에 따라 장단점이 있으므로, 프로젝트의 유지보수성, 확장성 등을 고려하여 적절한 방법을 선택하는 것이 중요합니다.