[Spring / QueryDSL] UnsatisfiedDependencyException, Error creating bean with name 해결
Spring에서 JPA와 QueryDSL 을 동시에 도입 하는 방법은 여러가지가 있는데 그중 2가지를 소개해보자면
- Service Layer에서 생성자로 JpaRepository, QueryRepository를 동시에 주입 시키는 방법
- 이 방법은 가장 직관적이고 쉽게 사용하는 방법이다
- 따로 각각의 Repository를 만들어서 Service에서 같이 생성자를 주입받는 방법이다
- 하지만 Service객체의 결합도가 높아진다는 단점이 있다
@Service
@Transactional
class TeamService(
private val teamRepository: TeamRepository,
private val queryDslTeamRepository: QueryDslTeamRepository
)
2. 추상적인 객체를 생성하여 JpaRepository, QueryRepository를 묶고 하나의 Repository만을 주입을 받는 방식
- 위의 그림과 같이 CustomTeamRepository라는 최상위 interface를 생성하고 이를 JpaRepository, QueryRepository가 상속 받은 이후에 Service Layer에서 TeamRepository만 받는 방식이다
- 위 방법은 Service Layer에서 Repository를 통합하지 않고 Repository에서 객체별로 역할을 구분하는 방법이기 때문에 가장 객체 지향적으로 코드를 짜는 방식이라고 생각한다
그래서 위의 방법으로 코드를 짯는데 문제가 생겼다
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name
이런 애러가 발생하는 것 아닌가;;
해당 애러를 자세히 보니 Spring Data JPA에서 해당 클래스의 findAllByEmail() 에 대해서 Bean을 생성하지 못했다는 애러였다
해당 애러를 보고 딱 드는 생각은 @Repository Annotation을 작성하지 않아서 Spring에서 Bean을 생성하지 못하는 구나 였다
바로 실행에 옮기려고 하는데
@Repository
class QueryDslTeamRepositoryImpl : QueryDslSupport(), CustomTeamRepository {
붙어있네;;
그럼 Bean을 정상적으로 생성해야 하는 것 아닌가 라는 생각이 들어서 찾아봤는데 흥미로운 것을 찾아냈다
바로 JPA가 Repository 를 찾기 위해서는 클래스 명을 맵핑을 시켜줘야 하는 것
현재 나의 JPA 클래스는 TeamRepository 이므로 JPA에 맵핑을 시키기 위해서는 QueryDslTeamRepositoryImpl이 아닌 TeamRepository라고 앞에 명시를 해주고 뒤에 Impl 이라고 맵핑을 해줘야 정상적으로 작동하는 것을 확인하였다
혹시나 애메 하니까 TeamRepositoryIm, TeamRepositoryI 등등 별의 별 실험을 다 해봤지만 제대로 맵핑 되지는 않았다
결국은 JPA에서 클래스를 맵핑시키려면 네이밍도 Repository에 맞춰서 작성을 해야지 JPA에서 클래스를 맵핑 해준다