• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

DTO에 Entity 포함

23.05.25 18:36 작성 조회수 910

0

학습하는 분들께 도움이 되고, 더 좋은 답변을 드릴 수 있도록 질문전에 다음을 꼭 확인해주세요.

1. 강의 내용과 관련된 질문을 남겨주세요.
2. 인프런의 질문 게시판과 자주 하는 질문(링크)을 먼저 확인해주세요.
(자주 하는 질문 링크: https://bit.ly/3fX6ygx)
3. 질문 잘하기 메뉴얼(링크)을 먼저 읽어주세요.
(질문 잘하기 메뉴얼 링크: https://bit.ly/2UfeqCG)

질문 시에는 위 내용은 삭제하고 다음 내용을 남겨주세요.
=========================================
[질문 템플릿]
1. 강의 내용과 관련된 질문인가요? (예/아니오)
2. 인프런의 질문 게시판과 자주 하는 질문에 없는 내용인가요? (예/아니오)
3. 질문 잘하기 메뉴얼을 읽어보셨나요? (예/아니오)

[질문 내용]
여기에 질문 내용을 남겨주세요.

 

안녕하세요.

public class MemberTeamDto {
   private Member member;
   private Team team;

   @QueryProjection
   public MemberTeamDto(Member member, Team team) {
      this.member = member;
      this.team = team;
   }
}

이런식으로 DTO에 엔티티를 직접 포함해도 되나요??

실행은 잘되는거 같은데 이렇게 활용해도 되는지 궁금합니다

답변 1

답변을 작성해보세요.

2

y2gcoder님의 프로필

y2gcoder

2023.05.26

안녕하세요, ycrpark 님. 공식 서포터즈 y2gcoder 입니다.

DTO에 엔티티를 포함하셔서 사용하셔도 됩니다. 다만 개인적으로는 DTO에 엔티티를 포함하는 것을 추천드리지 않습니다.

DTO의 멤버변수로서 엔티티를 사용하게 되면 엔티티는 DTO에서 해야 할 일을 같이 해야 하기 때문에 변경에 대한 이유가 늘어나게 됩니다. 이는 유지보수적인 측면에서 좋지 않습니다.

가장 먼저 생각해볼 수 있는 것은 DTO를 프레젠테이션 계층까지, 즉 응답 json까지 사용해야 하는 상황입니다. 예를 들어 회원 정보 조회의 응답으로 멤버와 팀에 대한 정보를 줘야한다고 가정하겠습니다. 그리고 응답 DTO로 MemberTeamDto를 사용한다고 해보겠습니다. 또한 Member Entity의 속성 중에 비밀번호를 담는 password라는 필드가 있다고 하겠습니다. 보통 비밀번호와 같이 보안과 관련된 값들은 회원 정보 조회에 대한 응답 값에 포함해서 보내지 않기 때문에 password를 빼고 보내줘야 합니다. 그런데 Member Entity는 password를 속성으로 갖고 있기 때문에 이를 위한 처리를 entity에서 해줘야 합니다. 이는 엔티티라는 역할 때문이 아니라 응답을 위한 DTO라는 역할 때문에 생겨난 기능입니다. 그러면 이제 해당 엔티티는 엔티티와 관련된 기능을 수정할 때와, 회원 정보 조회의 API의 응답 필드를 수정할 때 모두 확인해봐야 하는 책임이 생겼습니다.

예시를 찰떡같이 들지는 못했으나 제가 말씀드리고자 했던 것의 요지는 객체가 맡은 역할이 많아지면 해당 객체를 바꿔야할 이유가 많아지고, 관리하기가 힘들어진다는 것입니다. 이러한 부분을 고려하시면서 요구사항을 잘 따져보시면 좋겠다고 말씀드리고 싶습니다.

감사합니다.