작성
·
935
1
안녕하세요, 김영한님
@Query에서 Dto로 매핑해주는 과정에서 궁금한 점이 있습니다. MemberDto에 정적 팩토리 메서드를 만들어서 Member를 파라미터로 받으니 new MemberDto() 부분이 없이도 생성이 되는 것으로 보여지는데 이 과정이 이해가 되지 않습니다.
@Query("SELECT c "
+ "FROM Coupon c "
+ "JOIN FETCH c.receiver "
+ "WHERE c.receiver = :member AND c.couponState.couponStatus = :status "
+ "ORDER BY c.couponState.meetingDate DESC")
List<CouponResponse> findAllByReceiver(@Param("member") Member member,
@Param("status") CouponStatus couponStatus){}
public static CouponResponse of(Coupon coupon) {
Member sender = coupon.getSender();
Member receiver = coupon.getReceiver();
return new CouponResponse(
coupon.getId(),
new CouponMemberResponse(sender.getId(), sender.getNickname(), sender.getImageUrl()),
new CouponMemberResponse(receiver.getId(), receiver.getNickname(), receiver.getImageUrl()),
coupon.getCouponTag(),
coupon.getCouponMessage(),
coupon.getCouponType().getDisplayName(),
coupon.getCouponState().getCouponStatus().name(),
coupon.getCouponState().getMeetingDate(),
coupon.getCreatedTime());
}
어떻게 정적 팩터리 메서드를 통해 생성될 수 있는 건가요?
답변 3
2
안녕하세요. 현탸님
저도 정확하지는 않은데, 스프링 데이터가 of, from, valueOf 등의 메서드 이름을 가진 정적 팩터리 메서드가 있는 경우 이 정적 팩터리 메서드를 사용하는 것으로 보입니다.
(관련해서 메뉴얼이나 자료에서 내용을 찾으신 분은 공유 부탁드립니다.)
그리고 추가로 문의 주신 부분은 조회 전용의 경우 실제로 많이 사용하는 방법입니다. 단 이경우 특정 화면에 맞춘 DTO는 별도의 조회 전용 리포지토리로 분리하는 것이 더 나을 수 있습니다.
감사합니다.
1
안녕하세요, 김영한님
프로젝트를 공유하기가 어려울 것 같아서 비슷한 환경을 구축했습니다.
https://drive.google.com/file/d/10_0JV24FbOVIBthv5YvSkdxyJIYvqQu0/view?usp=sharing
1.실행 방법
test -> java.com.example.application -> MemberServiceTest 에 테스트 코드를 전체 실행해주시면됩니다.
각각의 DTO에는 of, from 정적 팩토리 메서드가 있는 경우가 있고, 메서드의 이름만 변경한 noStaticFactory 총 3가지 Dto가 있습니다.
2. 문제 상황
MemberRepository에서 MemberResponse Dto에 정적팩터리메서드가 있는 경우 매핑을 하고, 없는 경우 ConverterNotFoundException을 반환하는데 어떻게 처리되는 것인지 궁금합니다.
만약 제가 추측하는 것 처럼 정적팩터리메서드로 바로 Dto를 만들어줄 수 있다면 Repository에서 바로 Dto를 반환 하는 것에 대해서 어떻게 생각하시는지 궁금합니다.
presentation에서 반환해야할 dto를 applicationLayer -> dataAccessLayer까지 의존한다는 부분에서는 부적절하다고 생각하지만, 조회 로직의 경우 DTO를 바로 쓰는 것도 유리하지 않을까 생각이 듭니다.
1
안녕하세요. 현탸님
전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.
구글 드라이브 업로드 방법은 다음을 참고해주세요.
주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요
추가로 다음 내용도 코멘트 부탁드립니다.
1. 실행 방법을 알려주세요.
2. 어떻게 문제를 확인할 수 있는지 자세한 설명을 남겨주세요.
감사합니다.
답글로 링크 공유해드립니다.
https://drive.google.com/file/d/10_0JV24FbOVIBthv5YvSkdxyJIYvqQu0/view?usp=sharing