작성자 : 김다희
배경
기존 SeriesRepository를 확장해서 CustomRepository를 만들었다. 새로운 레포를 CustomSeriesRepository로 네이밍하고 실행했더니 다음과 같은 오류가 났다.
오류
org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'paymentController' defined in file [/Users/Kimdahee/prgrms-dev/final-project/Team_Sagack_MonthSub_BE/build/classes/java/main/com/prgrms/monthsub/module/payment/app/PaymentController.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'paymentService' defined in file [/Users/Kimdahee/prgrms-dev/final-project/Team_Sagack_MonthSub_BE/build/classes/java/main/com/prgrms/monthsub/module/payment/app/PaymentService.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'seriesService' defined in file [/Users/Kimdahee/prgrms-dev/final-project/Team_Sagack_MonthSub_BE/build/classes/java/main/com/prgrms/monthsub/module/series/series/app/SeriesService.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'seriesRepository' defined in com.prgrms.monthsub.module.series.series.app.SeriesRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Invocation of init method failed; nested exception is org.springframework.data.repository.query.QueryCreationException: Could not create query for public abstract java.util.List com.prgrms.monthsub.module.series.series.app.CustomServiceRepository.findAllByCategoryIn(java.lang.Long,int,java.util.List,java.time.LocalDateTime)! Reason: Failed to create query for method public abstract java.util.List com.prgrms.monthsub.module.series.series.app.CustomServiceRepository.findAllByCategoryIn(java.lang.Long,int,java.util.List,java.time.LocalDateTime)! Operator IN on category requires a Collection argument, found class java.lang.Long in method public abstract java.util.List com.prgrms.monthsub.module.series.series.app.CustomServiceRepository.findAllByCategoryIn(java.lang.Long,int,java.util.List,java.time.LocalDateTime).; nested exception is java.lang.IllegalArgumentException: Failed to create query for method public abstract java.util.List com.prgrms.monthsub.module.series.series.app.CustomServiceRepository.findAllByCategoryIn(java.lang.Long,int,java.util.List,java.time.LocalDateTime)! Operator IN on category requires a Collection argument, found class java.lang.Long in method public abstract java.util.List com.prgrms.monthsub.module.series.series.app.CustomServiceRepository.findAllByCategoryIn(java.lang.Long,int,java.util.List,java.time.LocalDateTime). at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:800) at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:229) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1372) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1222) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:582)
원인
기존에는 아래와 같은 네이밍으로 코드를 작성했는데 알고보니 custom repository를 만들려면 따라야하는 네이밍 규칙이 있었다.
기존코드
public interface SeriesRepository extends JpaRepository<Series, Long>, DynamicSeriesRepository { ... }
public interface DynamicSeriesRepository { ... }
@Repository public class SeriesRepositoryCustom implements DynamicSeriesRepository { ... }
수정 후 코드
public interface SeriesRepositoryCustom extends JpaRepository<Series, Long>, DynamicSeriesRepository { ... }
public interface DynamicSeriesRepository { ... }
@Repository public class SeriesRepositoryCustomImpl implements DynamicSeriesRepository { ... }
→ Impl을 꼭 붙여주자!
참고문서
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#repositories.single-repository-behavior 를 보면 Custom~Repository의 용도를 알 수 있다.