조회 시 엔티티를 조회하는 것이 아닌QueryDSL을 많이 사용 시 Dto는 어떻게 하나요?
116
4 asked
일반적인 JpaRepository를 사용할 경우
Entity -> Domain model 객체로 변환하는데
보통 상세 조회, 목록 조회 시에는 QueryDSL를 사용하고, 또한 조회 시 Projections을 이용하여 Dto로 반환하는데요.
이 때, 조회된 Dto는 User와 마찬가지로 UserDetail, UserList(목록 Dto 명칭이 마땅히 생각나질 않네요.) 와 같은 도메인 모델을 추가로 만들어서 사용하는 건가요?
위와 같은 질문을 드리는 이유는 만약 User가 Team라는 도메인과 연관 관계가 있을 때 Team 정보를 포함하여 응답할 경우 User 따로 조회, Team 따로 조회 하여 응답 dto로 변환해야 할 것같은데 그럼 성능적인 이슈가 생기지 않을까 해서 질문드립니다.
(위 예시는 간단해서 성능적 이슈는 크게 없지만 복잡한 도메인에서는 여러 도메인의 정보를 조회해와야 하기 때문에 충분히 성능적 이슈가 있을걸로 판단됩니다.)
Answer 1
-1
안녕하세요, 인프런 AI 인턴입니다.
yoonho님, QueryDSL을 사용하여 조회 시 Projections을 이용하여 DTO로 반환하는 경우, 추가적인 도메인 모델을 만드는 전략은 다양한 방법으로 접근할 수 있습니다.
DTO 사용: QueryDSL을 사용하여 조회 시 프로젝션을 통해 UserDetail, UserList와 같은 DTO로 변환하는 것은 일반적인 방법입니다. 이렇게 하면, 각 조회 요청에 대해 필요한 데이터만 포함하여 최적화된 응답을 받을 수 있습니다. DTO는 특정 뷰나 API 응답을 위한 데이터 구조를 갖추고 있어 가볍고 응답 요구 사항에 맞게 설정할 수 있습니다.
복합 프로젝트: 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
- 성능 최적화: 복잡한 도메인의 경우, 조회 시마다 데이터베이스에 다수의 쿼리를 보내는 것은 성능 저하를 일으킬 수 있습니다. 따라서, 필요한 데이터를 한 번의 쿼리로 가져오거나, 경우에 따라서는 데이터베이스에 저장된 프로시저를 사용하는 방법으로 데이터를 가져오는 것이 방법이 될 수 있습니다.
최종적으로, 복잡한 도메인 구조를 다룰 때는 다양한 쿼리 최적화 기법과 데이터 접근 전략을 조합하여 사용함으로써 시스템 성능을 높일 수 있습니다.
관련된 더 많은 내용은 다음 URL에서 확인하실 수 있습니다:
Spring Data JPA - Reference Documentation - Projections
UserService, CertificationService 책임 분리 기준 질문
0
26
1
service.port 패키지로 이동한 UserRepository가 infrastructure에 있는 UserEntity에 의존
0
58
1
Service 소형 테스트 질문
0
81
1
controller 의 port 패키지의 service 인터페이스 사용
0
72
1
빌드 문제
0
92
1
빌드 안 되시는 분들 참고
0
102
1
update에서 Repository.save
0
105
1
최종 완성된 코드를 받아 볼 수 있을까요?
0
156
1
의존성 역전으로 해결한 외부의존성?
0
162
1
좋은 설계
0
180
1
Controller에 테스트
0
138
1
JPA가 아닌 Mapper 아키텍처 기반 테스트 코드 작성
0
242
0
영속성 객체 구분으로 인한 JPA와 Querydsl의 Projection 사용
0
224
1
인프라계층 구현체와 테스트 구현체에 대한 질문
0
222
1
실습 코드 커밋
0
372
1
UserEntity 메서드
0
293
2
CertificationServiceTest에서 MailSender 인터페이스가 아닌 FakeMailSender를 이용하는 것
0
217
1
레이어드 아키텍처 개발에 대하여
0
231
1
BDDMockito의 when을 사용한 코드가 given 절에 있는 이유가 궁금합니다.
0
223
1
테스트에서 주입과 생성
0
198
1
프로젝트 코드는 제공해주시지 않는건가요?
0
382
2
개선된 아키텍처의 구조
0
277
1
서비스 레이어의 단위 테스트 범위 고민
0
188
1
도메인 객체 / entity 객체 / requset, response 객체 간 mapping 시 mapper 사용
1
343
1

