반응형
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
반응형
'Develop > spring-data' 카테고리의 다른 글
[Querydsl] 성능 개선 1편 (0) | 2021.01.29 |
---|---|
[Querydsl-JPA] Querydsl JPA를 사용하며.. "*" 아스타리스크 사용방법 (0) | 2020.12.20 |
[JPA] Querydsl에 pageable을 적용하며... 2가지 방법을 소개하겠습니다. (2) | 2020.12.10 |
[Querydsl] Querydsl 사용방법 3가지 (0) | 2020.12.07 |
[JPA] JPA를 적용하며... mysql 함수 2번 호출되는 문제 (0) | 2020.12.06 |