• 카테고리

    질문 & 답변
  • 세부 분야

    백엔드

  • 해결 여부

    해결됨

응답 시 DTO에 Entity를 그대로 노출해도 괜찮은가요?

24.01.24 03:58 작성 조회수 192

0

안녕하세요. 강의를 듣다가 궁금한 점이 생겨 질문드립니다!

저는 클라이언트로 데이터를 반환할 때 Entity를 그대로 반환하면 안 되고 DTO로 변환 후 반환해야 한다고 해서 @Service 단에서 MapStruct을 이용하여 항상 DTO로 데이터가 반환되게끔 구현했습니다.

이번에 querydsl로 데이터를 DTO를 이용하여 조회하게 되면서
QStoreDto 클래스의 Member 참조형과

QStore 클래스의 Member 참조형 이 일치하지 않아 에러가 발생하고 있습니다.

제가 궁금한 것은 아래 두 개 중에 어떤 방식으로 구현을 하는 것이 맞는지(?) 효율적인지 궁금합니다.

  1. Entity를 절대 외부로 반환하지 말고 .select(Qstore) 로 조회하고 service 계층에서 dto로 매핑 후 리턴

  2. DTO 내부에 Entity 클래스를 사용 후 그대로 외부로 반환 (Response DTO 클래스 내부 Entity는 외부로 노출되어도 괜찮은가요)


 

감사합니다.

 

==== 코드도 같이 첨부드립니다! ====

Store Dto

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class StoreDto {
    private Long id;

    private String name;

    private MemberDto member; // Entity를 반환하지 않기 위해 DTO 클래스로 반환 


    @Builder(toBuilder = true)
    @QueryProjection
    public StoreDto(Long id, String name, MemberDto member) {
        this.id = id;
        this.name = name;
        this.member = member;
    }
}


Store Entity

@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Store {
    private Long id;

    private String name;

    private Member member;


    @Builder(toBuilder = true)
    public Store(Long id, String name, Member member) {
        this.id = id;
        this.name = name;
        this.member = member;
    }
}

 


// QStoreDto.member = MemberDto
// QStore.member = Member

jpaQueryFactory
                .select(new QStoreDto(store.id, store.name,  store.member))
                .from(store).fetch();

 

 

 

답변 1

답변을 작성해보세요.

0

y2gcoder님의 프로필

y2gcoder

2024.01.24

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

가장 간단하게는 StoreDto에서 생성자를 통해 Member 타입의 member를 받도록 하고, 이를 memberDto로 생성자 내에서 변환하는 방법을 사용하는 것에 대해 고려해보시는 것을 추천합니다!

//...
public StoreDto(Long id, String name, Member memberEntity) {
    this.id = id;
    this.name = name;
    this.member = new MemberDto(memberEntity);
}

 

감사합니다.

아! 왜 이런방법은 생각하지 못했을까요..ㅠ 감사합니다!