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

손성용님의 프로필 이미지

작성한 질문수

실전! 스프링 데이터 JPA

@Query, 값, DTO 조회하기

@Query를 활용한 DTO 매핑

작성

·

666

3

안녕하세요 김영한 강사님!

"@Query값, DTO조회하기" 편에서

@Query 애노테이션을 활용해서 엔티티를 DTO와 매핑하는 것과

ModelMapper를 통해서 엔티티와 DTO를 매핑하는것과 실질적인 차이가 있는지 궁금해서 질문 드려봅니다

혹시 성능면이나 상황상 이번에 소개해주신 방법이 ModelMapper와 비교했을 때 유리한 점이 있나요?

ModelMapper를 다루는 강의는 아니지만 기능이 유사한 것 같아 성능면의 차이가 있을까 해서 여쭤봅니다

답변 5

7

김영한님의 프로필 이미지
김영한
지식공유자

2020. 05. 26. 23:21

네^^ 즐거운 추가 질문을 주셨네요.

리포지토리에서 엔티티를 반환하는 메서드가 있으면, 그 메서드는 여러곳에서 사용할 수 있습니다.

엔티티는 상당히 범용성이 있으니까요.

반면에 DTO로 반환하면, 범용성이 확 떨어집니다. 일반적으로 DTO는 목적이 딱 정해진 곳에서만 사용하도록 최적화 되어 있지요.

그래서 제가 선호하는 방법은 다음 순서를 따릅니다.

1. 리포지토리에서 엔티티를 반환하도록 해서 범용성을 높인다.

2. 성능 최적화가 필요하면 리포지토리에서 엔티티를 반환하되, fetch join으로 최적화 한다. 단 fetch join은 객체그래프가 어느정도 정해지므로 1번에 비해 범용성이 약간 떨어진다.

3. 더 큰 성능최적화를 위해 리포지토리에서 DTO를 바로 반환한다. DB에서 select 프로젝션 데이터 까지 완전히 최적화 할 수 있다. 단점은 범용성이 상당히 떨어진다. 예를 들어 특정 API나 화면을 그리기 위한 데이터에 최적화되어버리고, 재사용이 거의 불가능하다.

여기서 활용2편 강의에서 강조했듯이 1,2번 방법은 API로 반환하려면 엔티티를 직접 반환하면 안되기 때문에 DTO로 번환이 필요합니다. 그것을 컨트롤러나 적절한 계층에서 하면 되는 것이지요.

결국 스타일이라기 보다는 모두 트레이드 오프가 있습니다^^ 한 프로젝트 안에서도, 여러가지 방법을 적절하게 섞어서 사용하시면 됩니다.

이런 고민을 하면서 활용2편의 색션4에 있는 API 개발 고급 정리를 들어보시면 궁금한 부분이 또 한번 정리되실꺼에요^^

도움이 되셨길 바랍니다^^

2

김영한님의 프로필 이미지
김영한
지식공유자

2020. 05. 26. 00:07

안녕하세요. 손성용님

둘이 장단점이 있습니다. 제가 다음 글에 자세히 남겨두었으니 참고해주세요^^

https://www.inflearn.com/questions/15292

감사합니다.

1

손성용님의 프로필 이미지
손성용
질문자

2020. 05. 26. 23:49

친절한 답변 정말 감사합니다!

덕분에 궁금한 것들 많이 해결한 것 같습니다

수업도 재밌게 듣고있어요!!

0

김영한님의 프로필 이미지
김영한
지식공유자

2020. 05. 26. 23:50

네^^ 도움을 드려서 기쁘네요. 신나는 코딩시간 되세요~

0

손성용님의 프로필 이미지
손성용
질문자

2020. 05. 26. 01:07

답변 정말 감사합니다 링크해주신 곳 잘 참고했어요!! 잘 이해했습니다 

실례가 안된다면 하나 더 여쭤봐도 될까요?

이번예제 같은 경우를 보면 리포지토리단에서 DTO매핑이 되는데요,

Api 활용편에서는 stream을 활용하여 DTO 변환을 컨트롤러단에서 수행하는 것을 예로 들어주셨습니다.

제 얕은 지식에 의하면 컨트롤러와 리포지토리는 각기 다른 컨텍스트에 속해있는데

이렇게 DTO 변환 시점이 다른것에 의미가 또 숨어있는 것인지 궁금합니다

그게 아니면 단순히 어느시점에 DTO 변환이 일어나는지는 개발 스타일이라고 봐도 무방한것인가요?

혹이 이 두 방법에 대해서는 어떤 생각을 갖고 계신지 궁금합니다!!