JAVA/JPA 학습기록

[Spring Data JPA] Custom Repository 구현체 클래스명 주의점

kth990303 2024. 7. 19. 21:06
반응형

Spring Data JPA 를 사용한다면 (특히 querydsl) 아래와 같은 생각이 들 때가 있다.

 

'클래스명 xxxRepositoryImpl 말고 xxxRepositoryImplementation 이라든지, HappyRepositoryImpl 처럼 좀 줄이거나 바꿔서 작성할 수 없나?'

 

안된다

아래 에러를 만나게 된다.

 

Failed to load ApplicationContext

Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name defined in file 

 

빈을 아예 못찾아서 위 에러가 발생하게 된다.

원인을 찾기 위해 내려보면, No property found for type 이라는 메시지가 있다. 심지어 어떤 경우는 추천까지 해준다. Did you mean 'memberNumber'? 이런식으로 말이다.

 

클래스명 잘못 작성해서 빈을 못찾은건데, 뭔 뚱딴지같이 메서드명 또는 변수명이 잘못됐다고 하는거지 싶다.

심지어 에러 원인을 제대로 모르는 경우는, 그냥 메서드명 때문에 안됐나보다~ 하다가 삽질할 수 있다... (내가 그랬음 ㅜㅜ)

 

 

Spring 공식문서(https://docs.spring.io/spring-data/jpa/reference/repositories/custom-implementations.html)의 Custom Repository Implementation 부분을 읽어보면 아래와 같이 명시돼있다.

The repository infrastructure tries to autodetect custom implementation fragments by scanning for classes below the package in which it found a repository. These classes need to follow the naming convention of appending a postfix defaulting to Impl.
리포지토리 인프라는 리포지토리를 찾은 패키지 아래의 클래스를 검색하여 사용자 정의 구현 조각을 자동으로 탐지하려고 합니다.
이러한 클래스는 Imp에 기본값으로 포스트픽스를 추가하는 명명 규칙을 따라야 합니다.

 

즉, Spring 공식문서의 custom Repository 구현체를 작성할 때에는

스프링에서 빈으로 인식되기 위해 (별도 설정을 하지 않는 한) 반드시 repository 클래스명 + Impl 로 이름을 지어야 한다.

 

그럼 왜 에러메시지는 클래스명이 잘못됐어! 가 아닌 No property '변수명' found for type 이 뜰까?

추측이지만, Repository 구현체 클래스를 찾지 못해 JPQL로 실행이 될 것이고, 그러다보니 JPQL 문법검사하다가 property가 적절치 않아 에러가 뜬게 아닐까 싶다.

 

애초에 빈을 못찾는다고 에러가 뜨는 케이스는, 웬만하면 에러메시지가 제정상이 아니어서 원인을 찾기가 쉽지않은 듯하다.

(@Service, @Repository, @Component 붙이는 거 깜빡해서 에러뜨는 경우는 오히려 양반일지도?)

 

이러한 삽질을 하지 말도록 하자!

반응형