Engineering Note

[Error Handling] JPA 쿼리메서드 생성 오류 본문

Error Handling

[Error Handling] JPA 쿼리메서드 생성 오류

Software Engineer Kim 2025. 12. 23. 09:23

에러메시지

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'authController' defined in file [/Users/kim/myroot/Study/project/rest-shop/shop-api/build/classes/java/main/com/shop/api/auth/AuthController.class]: Unsatisfied dependency expressed through constructor parameter 1: Error creating bean with name 'authService' defined in file [/Users/kim/myroot/Study/project/rest-shop/shop-core/build/classes/java/main/com/shop/core/auth/AuthService.class]: Unsatisfied dependency expressed through constructor parameter 1: Error creating bean with name 'refreshTokenRepository' defined in com.shop.domain.auth.RefreshTokenRepository defined in @EnableJpaRepositories declared on ShopApiApplication: Could not create query for public abstract java.util.Optional com.shop.domain.auth.RefreshTokenRepository.findByMemberId(java.lang.Long); Reason: Failed to create query for method public abstract java.util.Optional com.shop.domain.auth.RefreshTokenRepository.findByMemberId(java.lang.Long); Could not resolve attribute 'memberId' of 'com.shop.domain.auth.RefreshToken'
	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:804) ~[spring-beans-6.2.14.jar:6.2.14]
	at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:240) ~[spring-beans-6.2.14.jar:6.2.14]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1395) ~[spring-beans-6.2.14.jar:6.2.14]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1232) ~[spring-beans-6.2.14.jar:6.2.14]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:569) ~[spring-beans-6.2.14.jar:6.2.14]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:529) ~[spring-beans-6.2.14.jar:6.2.14]
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:339) ~[spring-beans-6.2.14.jar:6.2.14]
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:373) ~[spring-beans-6.2.14.jar:6.2.14]
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:337) ~[spring-beans-6.2.14.jar:6.2.14]
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-6.2.14.jar:6.2.14]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.instantiateSingleton(DefaultListableBeanFactory.java:1228) ~[spring-beans-6.2.14.jar:6.2.14]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingleton(DefaultListableBeanFactory.java:1194) ~[spring-beans-6.2.14.jar:6.2.14]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:1130) ~[spring-beans-6.2.14.jar:6.2.14]
	at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:990) ~[spring-context-6.2.14.jar:6.2.14]
	at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:627) ~[spring-context-6.2.14.jar:6.2.14]
	at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:146) ~[spring-boot-3.5.8.jar:3.5.8]
	at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:752) ~[spring-boot-3.5.8.jar:3.5.8]
	at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:439) ~[spring-boot-3.5.8.jar:3.5.8]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:318) ~[spring-boot-3.5.8.jar:3.5.8]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1361) ~[spring-boot-3.5.8.jar:3.5.8]
	at org.springframework.boot.SpringApplication.run(SpringApplication.java:1350) ~[spring-boot-3.5.8.jar:3.5.8]
	at com.shop.api.ShopApiApplication.main(ShopApiApplication.java:21) ~[main/:na]
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'authService' defined in file [/Users/kim/myroot/Study/project/rest-shop/shop-core/build/classes/java/main/com/shop/core/auth/AuthService.class]: Unsatisfied dependency expressed through constructor parameter 1: Error creating bean with name 'refreshTokenRepository' defined in com.shop.domain.auth.RefreshTokenRepository defined in @EnableJpaRepositories declared on ShopApiApplication: Could not create query for public abstract java.util.Optional com.shop.domain.auth.RefreshTokenRepository.findByMemberId(java.lang.Long); Reason: Failed to create query for method public abstract java.util.Optional com.shop.domain.auth.RefreshTokenRepository.findByMemberId(java.lang.Long); Could not resolve attribute 'memberId' of 'com.shop.domain.auth.RefreshToken'
	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:804) ~[spring-beans-6.2.14.jar:6.2.14]
	at org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:240) ~[spring-beans-6.2.14.jar:6.2.14]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1395) ~[spring-beans-6.2.14.jar:6.2.14]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1232) ~[spring-beans-6.2.14.jar:6.2.14]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:569) ~[spring-beans-6.2.14.jar:6.2.14]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:529) ~[spring-beans-6.2.14.jar:6.2.14]
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:339) ~[spring-beans-6.2.14.jar:6.2.14]
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:373) ~[spring-beans-6.2.14.jar:6.2.14]
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:337) ~[spring-beans-6.2.14.jar:6.2.14]
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-6.2.14.jar:6.2.14]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1708) ~[spring-beans-6.2.14.jar:6.2.14]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1653) ~[spring-beans-6.2.14.jar:6.2.14]
	at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:913) ~[spring-beans-6.2.14.jar:6.2.14]
	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) ~[spring-beans-6.2.14.jar:6.2.14]
	... 21 common frames omitted
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'refreshTokenRepository' defined in com.shop.domain.auth.RefreshTokenRepository defined in @EnableJpaRepositories declared on ShopApiApplication: Could not create query for public abstract java.util.Optional com.shop.domain.auth.RefreshTokenRepository.findByMemberId(java.lang.Long); Reason: Failed to create query for method public abstract java.util.Optional com.shop.domain.auth.RefreshTokenRepository.findByMemberId(java.lang.Long); Could not resolve attribute 'memberId' of 'com.shop.domain.auth.RefreshToken'
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1826) ~[spring-beans-6.2.14.jar:6.2.14]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:607) ~[spring-beans-6.2.14.jar:6.2.14]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:529) ~[spring-beans-6.2.14.jar:6.2.14]
	at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:339) ~[spring-beans-6.2.14.jar:6.2.14]
	at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:373) ~[spring-beans-6.2.14.jar:6.2.14]
	at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:337) ~[spring-beans-6.2.14.jar:6.2.14]
	at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:202) ~[spring-beans-6.2.14.jar:6.2.14]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1708) ~[spring-beans-6.2.14.jar:6.2.14]
	at org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1653) ~[spring-beans-6.2.14.jar:6.2.14]
	at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:913) ~[spring-beans-6.2.14.jar:6.2.14]
	at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:791) ~[spring-beans-6.2.14.jar:6.2.14]
	... 34 common frames omitted
Caused by: org.springframework.data.repository.query.QueryCreationException: Could not create query for public abstract java.util.Optional com.shop.domain.auth.RefreshTokenRepository.findByMemberId(java.lang.Long); Reason: Failed to create query for method public abstract java.util.Optional com.shop.domain.auth.RefreshTokenRepository.findByMemberId(java.lang.Long); Could not resolve attribute 'memberId' of 'com.shop.domain.auth.RefreshToken'
	at org.springframework.data.repository.query.QueryCreationException.create(QueryCreationException.java:101) ~[spring-data-commons-3.5.6.jar:3.5.6]
	at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.lookupQuery(QueryExecutorMethodInterceptor.java:120) ~[spring-data-commons-3.5.6.jar:3.5.6]
	at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.mapMethodsToQuery(QueryExecutorMethodInterceptor.java:104) ~[spring-data-commons-3.5.6.jar:3.5.6]
	at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.lambda$new$0(QueryExecutorMethodInterceptor.java:92) ~[spring-data-commons-3.5.6.jar:3.5.6]
	at java.base/java.util.Optional.map(Optional.java:260) ~[na:na]
	at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.<init>(QueryExecutorMethodInterceptor.java:92) ~[spring-data-commons-3.5.6.jar:3.5.6]
	at org.springframework.data.repository.core.support.RepositoryFactorySupport.getRepository(RepositoryFactorySupport.java:434) ~[spring-data-commons-3.5.6.jar:3.5.6]
	at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.lambda$afterPropertiesSet$4(RepositoryFactoryBeanSupport.java:350) ~[spring-data-commons-3.5.6.jar:3.5.6]
	at org.springframework.data.util.Lazy.getNullable(Lazy.java:135) ~[spring-data-commons-3.5.6.jar:3.5.6]
	at org.springframework.data.util.Lazy.get(Lazy.java:113) ~[spring-data-commons-3.5.6.jar:3.5.6]
	at org.springframework.data.repository.core.support.RepositoryFactoryBeanSupport.afterPropertiesSet(RepositoryFactoryBeanSupport.java:356) ~[spring-data-commons-3.5.6.jar:3.5.6]
	at org.springframework.data.jpa.repository.support.JpaRepositoryFactoryBean.afterPropertiesSet(JpaRepositoryFactoryBean.java:132) ~[spring-data-jpa-3.5.6.jar:3.5.6]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1873) ~[spring-beans-6.2.14.jar:6.2.14]
	at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1822) ~[spring-beans-6.2.14.jar:6.2.14]
	... 44 common frames omitted
Caused by: java.lang.IllegalArgumentException: Failed to create query for method public abstract java.util.Optional com.shop.domain.auth.RefreshTokenRepository.findByMemberId(java.lang.Long); Could not resolve attribute 'memberId' of 'com.shop.domain.auth.RefreshToken'
	at org.springframework.data.jpa.repository.query.PartTreeJpaQuery.<init>(PartTreeJpaQuery.java:107) ~[spring-data-jpa-3.5.6.jar:3.5.6]
	at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:128) ~[spring-data-jpa-3.5.6.jar:3.5.6]
	at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$CreateIfNotFoundQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:260) ~[spring-data-jpa-3.5.6.jar:3.5.6]
	at org.springframework.data.jpa.repository.query.JpaQueryLookupStrategy$AbstractQueryLookupStrategy.resolveQuery(JpaQueryLookupStrategy.java:99) ~[spring-data-jpa-3.5.6.jar:3.5.6]
	at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.lookupQuery(QueryExecutorMethodInterceptor.java:116) ~[spring-data-commons-3.5.6.jar:3.5.6]
	... 56 common frames omitted
Caused by: org.hibernate.query.sqm.PathElementException: Could not resolve attribute 'memberId' of 'com.shop.domain.auth.RefreshToken'
	at org.hibernate.query.sqm.SqmPathSource.getSubPathSource(SqmPathSource.java:95) ~[hibernate-core-6.6.36.Final.jar:6.6.36.Final]
	at org.hibernate.query.sqm.tree.domain.AbstractSqmPath.get(AbstractSqmPath.java:199) ~[hibernate-core-6.6.36.Final.jar:6.6.36.Final]
	at org.hibernate.query.sqm.tree.domain.AbstractSqmPath.get(AbstractSqmPath.java:44) ~[hibernate-core-6.6.36.Final.jar:6.6.36.Final]
	at org.springframework.data.jpa.repository.query.QueryUtils.getModelForPath(QueryUtils.java:1015) ~[spring-data-jpa-3.5.6.jar:3.5.6]
	at org.springframework.data.jpa.repository.query.QueryUtils.requiresOuterJoin(QueryUtils.java:865) ~[spring-data-jpa-3.5.6.jar:3.5.6]
	at org.springframework.data.jpa.repository.query.QueryUtils.toExpressionRecursively(QueryUtils.java:820) ~[spring-data-jpa-3.5.6.jar:3.5.6]
	at org.springframework.data.jpa.repository.query.QueryUtils.toExpressionRecursively(QueryUtils.java:799) ~[spring-data-jpa-3.5.6.jar:3.5.6]
	at org.springframework.data.jpa.repository.query.QueryUtils.toExpressionRecursively(QueryUtils.java:794) ~[spring-data-jpa-3.5.6.jar:3.5.6]
	at org.springframework.data.jpa.repository.query.JpaQueryCreator$PredicateBuilder.getTypedPath(JpaQueryCreator.java:393) ~[spring-data-jpa-3.5.6.jar:3.5.6]
	at org.springframework.data.jpa.repository.query.JpaQueryCreator$PredicateBuilder.build(JpaQueryCreator.java:313) ~[spring-data-jpa-3.5.6.jar:3.5.6]
	at org.springframework.data.jpa.repository.query.JpaQueryCreator.toPredicate(JpaQueryCreator.java:211) ~[spring-data-jpa-3.5.6.jar:3.5.6]
	at org.springframework.data.jpa.repository.query.JpaQueryCreator.create(JpaQueryCreator.java:122) ~[spring-data-jpa-3.5.6.jar:3.5.6]
	at org.springframework.data.jpa.repository.query.JpaQueryCreator.create(JpaQueryCreator.java:1) ~[spring-data-jpa-3.5.6.jar:3.5.6]
	at org.springframework.data.repository.query.parser.AbstractQueryCreator.createCriteria(AbstractQueryCreator.java:119) ~[spring-data-commons-3.5.6.jar:3.5.6]
	at org.springframework.data.repository.query.parser.AbstractQueryCreator.createQuery(AbstractQueryCreator.java:95) ~[spring-data-commons-3.5.6.jar:3.5.6]
	at org.springframework.data.repository.query.parser.AbstractQueryCreator.createQuery(AbstractQueryCreator.java:81) ~[spring-data-commons-3.5.6.jar:3.5.6]
	at org.springframework.data.jpa.repository.query.PartTreeJpaQuery$QueryPreparer.<init>(PartTreeJpaQuery.java:224) ~[spring-data-jpa-3.5.6.jar:3.5.6]
	at org.springframework.data.jpa.repository.query.PartTreeJpaQuery$CountQueryPreparer.<init>(PartTreeJpaQuery.java:370) ~[spring-data-jpa-3.5.6.jar:3.5.6]
	at org.springframework.data.jpa.repository.query.PartTreeJpaQuery.<init>(PartTreeJpaQuery.java:103) ~[spring-data-jpa-3.5.6.jar:3.5.6]
	... 60 common frames omitted

 

 

에러메세지 해석

우선 어레메세지를 보고 에러가 발생한 위치를 파악해보면, AuthController에서 발생했다. AuthController에서 발생한 이유는, 생성자 파라미터를 통해 의존성을 표현할 때 오류가 발생했는데 에러가 발생한 bean은 authService이다. 다시 AuthService는 RefreshTokenRepository에 의존하고 있는데 여기서 오류가 났고, 오류가 난 이유는 'findByMemberId(java.lang.Long);' 메서드를 쿼리로 변환하지 못했다는 뜻이다. 

이유는 RefreshToken Entity에 memberId 속성(attribute, 필드)이 없는데 속성 기반 쿼리메서드를 생성하려고 했다는 뜻이다. 

 

에러메세지 분석

## 에러 메시지 분석
UnsatisfiedDependencyException 발생.

의존성 추적:
AuthController 
  → AuthService (생성자 주입)
    → RefreshTokenRepository (생성자 주입)
      → findByMemberId() 쿼리 생성 실패 ❌
      
      
에러 원인: 
"Could not resolve attribute 'memberId' of 'RefreshToken'"
→ RefreshToken Entity에 memberId 필드가 없는데, 
  Spring Data JPA가 해당 필드로 쿼리를 생성하려 했음

 

 

 

 

 

해결방법

public interface RefreshTokenRepository extends JpaRepository<RefreshToken, Long> {
    Optional<RefreshToken> findByToken(String token);
    Optional<RefreshToken> findByMember_Id(Long memberId);
    void deleteByMember_Id(Long memberId);
}

 

RefreTokenRepository의 쿼리메서드를 수정해주었다. 처음에는 findByMemberId(Long memberId);로 작성했는데 findMember_Id(Long memberId)라고 수정했다.

 

 

참고 자료: 쿼리메서드 생성 규칙(https://techbook11.tistory.com/763)

Comments