JPA로 프로젝트를 진행하면서 복잡한 쿼리문이 필요한 경우 Querydsl같은 라이브러리를 쓸수밖에 없다. Entity라는 개념에 집착해 Repository 영역에서 Service 단계로 전달하는 것은 무결한 Entity그 자체여야 한다는 고집이 있었다.
그렇지만 우아한 형제들의 Querydsl 사용 방식을 보고 달리 느끼게 되어 생각을 정리해봐야겠다.
Repository에서 Dto로 리턴받는 경우 백엔드 구조는 다음과 같이 이루어진다.
Entity로 리턴하는 경우 다음과 같다.
@Mapper(unmappedTargetPolicy = ReportingPolicy.IGNORE, componentModel = "spring")
public interface OneononeInquiryBoardMapper {
@Mapping(source="categoryAdmin.customercenterCategoryCode" , target="customercenterCategoryCode")
OneononeInquiryBoardDto toDto(OneononeInquiry oneononeInquiry, CategoryAdmin categoryAdmin);
}
다음과 같은 MapStruct를 이용해 두 개의 Entity를 Dto로 변환하여 사용한다.
단일 책임을 세분화 할 수 있는것은 후자의 방식이라고 생각한다. Entity전체를 가져와 MapStruct를 이용해 원하는 Dto를 만들 수 있고 Querydsl에 대한 의존도를 낮출 수 있다. 그러나 대규모 서비스 기업에서 불필요한 Entity Column까지 조회하는 것이 애플리케이션 성능에 영향을 끼친다면 어쩔 수 없이 전자의 방식을 택하게 될 것 같다.