SPRING FRAMEWORK

CustomRepository의 PropertyReferenceException

Ambitions 2023. 4. 28. 17:53

작업하면서 오랜만에 QueryDsl을 사용하기위해 커스텀 레포지토리를 만들어서 작업하는동안 발생한 오류를 정리해보려고 한다.

발생했던 오류메시지의 맨 아랫부분은 아래와 같고, 위쪽도 찬찬히 읽어보니 의존성, 빈생성을 실패했다는 걸 알 수 있었다.

당시 코드 구성은 대략 다음과 같았다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
// 글 내용을 간략하게 위해 한 페이지에 모두 서술
 
 
 
// Spring Data의 JpaRepository와 customRepo를 상속
public interface TestRepository extends JpaRepository<Test, Long>,  CustomRepository { 
 // .. 중략
}
 
 
 
// 커스텀레포
public interface CustomRepository {
 
    List<Test> findTest(long id);
}
 
 
//구현클래스
public class SheetCustomRepo extends QuerydslRepositorySupport implements CustomRepository {
 
    //Qdomain
    QTest test = QTest.test;
 
    QTest2 test = QTest2.test;
 
 
    @Override
    public List<Test> findTest(long id) {
 
        JPAQueryFactory queryFactory = new JPAQueryFactory(getEntityManager());
 
        //원 코드는 DTO가 들어가지만 여긴 그냥 test 객체
        List<Test> result = queryFactory.selectFrom(test)
                .leftJoin(test2).on(test1.id.eq(test2.id))
                .where(eqName)
                .fetchJoin()
                .fetch();
 
        return result;
    }
 
    // 이름조건
    private BooleanExpression eqName(String name) {
        return qtest.name.eq(name);
    }
 
 
    public SheetCustomRepo () {
        super(Test.class);
    }
 
    /**
        EntityManger에 주입되어이있는 unitName 
        <property name="persistenceUnitName" value="Test"/>
    */
 
    @PersistenceContext(unitName = "Test")
    @Override
    public void setEntityManager(EntityManager entityManager) {
        super.setEntityManager(entityManager);
    }
}
cs

Jpa 고수분들은 이 코드만 봐도 뭐가 잘못된지 바로 알겠지만, 나의 경우는 한 30분정도는 찾아봤던 것 같다.

정답은 커스텀쿼리를 구현한 클래스인 SheetCustomRepo에 있었는데, 구현 클래스의 경우에는 클래스명이 Impl로 끝나야 한다는 것이였다.

즉 SheetCustomRepo ->  SheetCustomRepoImpl로 바꿔줘야 정상적으로 실행된다는 것이다..

 

왜 그런지에 대해서는 나중에 공식문서를 읽고 정리 할 예정이고, 오랜시간을 사용한건 아니지만 시덥잖은 오류에 시간을 쓴게 좀 아쉬웠다.