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

현탸님의 프로필 이미지
현탸

작성한 질문수

실전! 스프링 데이터 JPA

@Query, 값, DTO 조회하기

정적 팩터리 메서드를 이용한 Dto 변환

작성

·

924

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

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

안녕하세요. 현탸님

전체 프로젝트를 압축해서 구글 드라이브로 공유해서 링크를 남겨주세요.

구글 드라이브 업로드 방법은 다음을 참고해주세요.

https://bit.ly/3fX6ygx

주의: 업로드시 링크에 있는 권한 문제 꼭 확인해주세요

추가로 다음 내용도 코멘트 부탁드립니다.

1. 실행 방법을 알려주세요.

2. 어떻게 문제를 확인할 수 있는지 자세한 설명을 남겨주세요.

감사합니다.

 

현탸님의 프로필 이미지
현탸

작성한 질문수

질문하기