Develop/spring-data

[Querydsl] Querydsl을 적용하며.. class 파일명 주의

에디개발자 2020. 12. 18. 07:00
반응형

querydsl을 적용한 프로젝트를 진행하면서 나온 이슈를 정리해보겠습니다.

나를 닮았다고 한다...

JPARepository에서 Querydsl을 사용할 수 있게 Custom(interface), impl 로 세팅이 되어있었습니다. 

세팅방법은 여기를 참조해주세요.

 

데일리 미팅 도중 Custom Interface의 naming을 변경이 확정되었습니다.

AS-IS : CustomizedDomainRepository
TO-BE : DomainQueryRepository
Customized란 단어는 너무 포괄적이어서 변경하기로 결정!

 

증상

Class명을 변경하고 Application을 실행하자 에러가 발생하였습니다. 

No property search found for type Staff!
Staff는 Entity 객체입니다.

 

구현 된 소스는 최대한 비슷하게 작성해보았습니다.

@RequiredArgsConstructor
public class StaffRepositoryQueryImpl implements StaffQueryRepository {
    private final JPAQueryFactory jpaQueryFactory;

    @Override
    public StaffVo search(Long id) {
        return jpaQueryFactory
                .select(Projections.fields(StaffVo.class,
                    staff.id,
                    staff.name
                ))
                .from(staff)
                .where(staff.id.eq(id))
                .fetchOne();
    }
}

 

소스를 보시자마자 아시는 분들도 계실 것 같습니다. 

전 한참 찾았습니다...

 

원인

StaffRepositoryQueryImpl 클래스명이 문제가 있습니다. impl 네이밍 규칙은 Repository Interface + Impl 이어야합니다. 그래야 JPA가 사용자 정의 구현 클래스로 인식할 수 있습니다. 

 

에러 원인은 Application을 실행했을 때 사용자 정의 구현 클래스를 찾지못했고 JPA Method 생성 규칙에도 적합하지 않기 때문에 Staff Entity에서 search 메서드가 존재하지 않는다고 에러를 보여주고 있는 상태입니다.

 

해결

impl 클래스명을 수정하여 문제를 해결합니다.

@RequiredArgsConstructor
public class StaffQueryRepositoryImpl implements StaffQueryRepository {
    private final JPAQueryFactory jpaQueryFactory;

    @Override
    public StaffVo search(Long id) {
        return jpaQueryFactory
                .select(Projections.fields(StaffVo.class,
                    staff.id,
                    staff.name
                ))
                .from(staff)
                .where(staff.id.eq(id))
                .fetchOne();
    }
}
StaffRepositoryQueryImpl -> StaffQueryRepositoryImpl
반응형