[17] Spring - QueryDSL 트러블슈팅

2024. 11. 19. 14:29Spring/JPA-Plus 과제

728x90

📁️ github 참고

https://github.com/kuk1157/spring-plus/commit/05cae3c4514c95331958ca1f9303da8c52a5985b

 

refactor: 레벨 2_8 QueryDSL로 변경 · kuk1157/spring-plus@05cae3c

- gradle QueryDsl 의존성 추가 - JPAQueryFactory bean등록, Custom, Impl 파일 세팅 - Impl에서 QueryDSL 작성

github.com

 

🛠️ 트러블슈팅 -  QueryDSL 적용 중에 발생한 no property found for type오류

 

1. 개요

- QueryDSL을 적용할때 발생한 no property found for type 오류에 대한 트러블 슈팅을 작성해보겠습니다.

 

2. 배경

- gradle에서 의존성 추가 및 설정파일에서 EntityManager인터페이스와 JPAQueryFactory클래스를 세팅했습니다.

 

3. 발단

-  위 과정들을 진행하고 나서 no property found for type오류가 계속 발생해서 오류해결을 하기위해 계속 검색했습니다.

 

4. 전개

- QueryDSL과 연관되는 Repository 파일 3가지의 파일명을 규칙을 지키지 않으면 오류가 발생한다고 해서 맞췄습니다.

- 카멜케이스의 쿼리메소드를 확인하고, 해당되는 엔티티의 필드명을확인(존재하지않는필드명)도 하였습니다.

 

5. 위기

-  위 과정들을 다 거쳤는데도 계속 오류는 발생했고, RepositoryCustom 파일에서 쿼리메소드명을 변경하면서 테스트를 진행했습니다.

 

6. 절정

-  쿼리메소드를 바꾸면서 JPA기본제공되는 쿼리메소드로 변경하니 잘되는것을 확인했습니다. 이때 순간 착각을 했는데 QueryDSL도 JPA에서 제공되는 쿼리메서드명과 맞춰야하는건가? 라고 생각을 해버리고 테스트를 진행했습니다.

테스트가 정상적으로 완료되길래 이렇게 하는게 맞나보다라고 하는 찰나에 뒤늦게 내가 작성한 QueyDSL 자체가 적용이 안되는게 아닌가? 라는 의문이 생겼습니다.

현재는 완성된 코드로 정상 동작 중

- QueryDSL로 만들어둔 쿼리메소드를 아예 정상적으로 불러오질 못하고 있었습니다.

- 전개단계에서 진행했던 Repository관련 파일 3개의 파일명을 제대로 맞추지 않고 생성하게 되면 QueryDSL을 아예 인식을 못하고 JPA로 인식한다는 것을 알게되었습니다. RepositoryCustom파일에서 JPA에서 제공되는 쿼리메소드명으로 맞췄을때 정상적으로 테스트가 되었던게 그 이유에서 였습니다.

※ 결과적으로 파일명을 제대로 맞췄다고 생각했는데 그거 조차도 다르게 이름을 지었었습니다. 참고했던 블로그 글들을 다시 제대로 읽어보았고, 읽어보니 내가 맞췄다고 생각한 파일명과 다른것을 발견할 수 있었습니다.

https://lincoding.tistory.com/110

 

Springboot JPA + QueryDSL 사용 시 no property found for type 오류 해결

와! 레전드 배달 프로젝트를 진행하면서 `QueryDSL`을 사용할 일이 생겼다.그래서 적용 시키고! 쿼리도 다 짜고! 실행했는데 !!!!!!!!! `no property found for type` 오류가 났다..  남겨둔 나의 코멘트.......

lincoding.tistory.com

- 해당링크참고

https://wildeveloperetrain.tistory.com/281

 

PropertyReferenceException: No property found for type 발생 원인과 해결 방법

PropertyReferenceException: No property found for type 발생 원인과 해결 방법 작업 중 'PropertyReferenceException: No property found for type' 예외가 발생하였고, 원인을 찾는데 한 시간이 넘게 걸렸지만 원인은 결국 아

wildeveloperetrain.tistory.com

- 해당링크참고

 

 

 

7. 결말

1) gradle에 의존성 추가, build/clean, other/compileJava 2가지 실행(Q클래스 생성)

2) config에 JPAQueryFactory, EntityManager 세팅

3) 엔티티명Repository, 엔티티명RepositoryCustom, 엔티티명RepositoryQueryImpl 세팅

- 여기서 Impl파일명이 잘못되었었음.

4) QueryImpl에서 QueryDSL사용한 문법으로 변경

5) 4번에서 만든 쿼리가 정상적으로 작용된다고 착각했었음.
- JPA기본제공 쿼리메서드를 사용해서 JPA로 인식해서 QueryDSL이 정상작동하는것처럼 보이는 것이었음.

6) 최종적으로 파일명은 엔티티명Repository, 엔티티명RepositoryCustom, 엔티티명RepositoryImpl 이렇게 맞춰야함.

 

※ no property found for type오류 해결과정

1) repository, custom, impl 3개 파일 파일명 맞추기
2) 카멜케이스의 쿼리메소드 확인, 해당되는 엔티티의 필드명확인(존재하지않는 필드명)
3) impl파일명이 QueryImpl이 아니라 Impl로 끝이나야했음. 1번에서 잘못했었음.

728x90