강의

멘토링

로드맵

Inflearn brand logo image

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

yoonho님의 프로필 이미지
yoonho

작성한 질문수

Java/Spring 테스트를 추가하고 싶은 개발자들의 오답노트

도메인과 영속성 객체 구분하기

조회 시 엔티티를 조회하는 것이 아닌QueryDSL을 많이 사용 시 Dto는 어떻게 하나요?

작성

·

32

·

수정됨

0

일반적인 JpaRepository를 사용할 경우

Entity -> Domain model 객체로 변환하는데

보통 상세 조회, 목록 조회 시에는 QueryDSL를 사용하고, 또한 조회 시 Projections을 이용하여 Dto로 반환하는데요.

 

이 때, 조회된 Dto는 User와 마찬가지로 UserDetail, UserList(목록 Dto 명칭이 마땅히 생각나질 않네요.) 와 같은 도메인 모델을 추가로 만들어서 사용하는 건가요?

 

위와 같은 질문을 드리는 이유는 만약 User가 Team라는 도메인과 연관 관계가 있을 때 Team 정보를 포함하여 응답할 경우 User 따로 조회, Team 따로 조회 하여 응답 dto로 변환해야 할 것같은데 그럼 성능적인 이슈가 생기지 않을까 해서 질문드립니다.
(위 예시는 간단해서 성능적 이슈는 크게 없지만 복잡한 도메인에서는 여러 도메인의 정보를 조회해와야 하기 때문에 충분히 성능적 이슈가 있을걸로 판단됩니다.)

 

답변 1

-1

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

yoonho님, QueryDSL을 사용하여 조회 시 Projections을 이용하여 DTO로 반환하는 경우, 추가적인 도메인 모델을 만드는 전략은 다양한 방법으로 접근할 수 있습니다.

  1. DTO 사용: QueryDSL을 사용하여 조회 시 프로젝션을 통해 UserDetail, UserList와 같은 DTO로 변환하는 것은 일반적인 방법입니다. 이렇게 하면, 각 조회 요청에 대해 필요한 데이터만 포함하여 최적화된 응답을 받을 수 있습니다. DTO는 특정 뷰나 API 응답을 위한 데이터 구조를 갖추고 있어 가볍고 응답 요구 사항에 맞게 설정할 수 있습니다.

  2. 복합 프로젝트: User와 Team 같은 연관 관계가 있는 경우, 성능 문제를 피하기 위해 복잡한 쿼리를 작성하여 한 번의 조회로 필요한 데이터를 가져오는 것이 좋습니다. 예를 들어, JPQL 또는 QueryDSL을 사용하여 SELECT new 구문으로 여러 테이블의 데이터를 조인하는 방법을 사용할 수 있습니다.

SELECT new com.example.UserDetailDto(u.id, u.name, t.teamName)
FROM User u
LEFT JOIN u.team t
  1. 성능 최적화: 복잡한 도메인의 경우, 조회 시마다 데이터베이스에 다수의 쿼리를 보내는 것은 성능 저하를 일으킬 수 있습니다. 따라서, 필요한 데이터를 한 번의 쿼리로 가져오거나, 경우에 따라서는 데이터베이스에 저장된 프로시저를 사용하는 방법으로 데이터를 가져오는 것이 방법이 될 수 있습니다.

최종적으로, 복잡한 도메인 구조를 다룰 때는 다양한 쿼리 최적화 기법과 데이터 접근 전략을 조합하여 사용함으로써 시스템 성능을 높일 수 있습니다.

관련된 더 많은 내용은 다음 URL에서 확인하실 수 있습니다:
Spring Data JPA - Reference Documentation - Projections

yoonho님의 프로필 이미지
yoonho

작성한 질문수

질문하기