작업하면서 오랜만에 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로 바꿔줘야 정상적으로 실행된다는 것이다..
왜 그런지에 대해서는 나중에 공식문서를 읽고 정리 할 예정이고, 오랜시간을 사용한건 아니지만 시덥잖은 오류에 시간을 쓴게 좀 아쉬웠다.
'SPRING FRAMEWORK' 카테고리의 다른 글
jsp:include를 이용한 페이지 이동 (0) | 2022.02.24 |
---|---|
QueryDsl에서 서브쿼리 사용하기 (0) | 2021.09.13 |
@Transient 어노테이션 사용해보기 (0) | 2021.01.15 |
개발중 발생했던 @Autowired 관련 이슈 정리 (1) | 2021.01.07 |
Spring JPA에서 @Query를 사용하는 방법. (0) | 2020.09.22 |