[Spring Boot] QueryCreationException : Could not create query for public abstract

임원재·2024년 1월 15일
0

SpringBoot

목록 보기
1/18
post-thumbnail

오류 메세지

Error starting ApplicationContext. To display the condition evaluation report re-run your application with 'debug' enabled.
2024-01-15T20:49:57.670+09:00 ERROR 10100 --- [           main] o.s.boot.SpringApplication               : Application run failed

org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'exhibitionController' defined in file [C:\Users\yyyti\바탕 화면\BackEnd\build\classes\java\main\com\example\demo\domain\member\controller\ExhibitionController.class]: Unsatisfied dependency expressed through constructor parameter 0: Error creating bean with name 'exhibitionServiceImpl' defined in file [C:\Users\yyyti\바탕 화면\BackEnd\build\classes\java\main\com\example\demo\domain\member\service\ExhibitionServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 2: Error creating bean with name 'scrapExhibitionRepository' defined in com.example.demo.domain.member.repository.ScrapExhibitionRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Could not create query for public abstract java.lang.Boolean com.example.demo.domain.member.repository.ScrapExhibitionRepository.existsSrcapExhibitionByExhibitionIdAndMemberId(java.lang.Long,java.lang.Long); Reason: Failed to create query for method public abstract java.lang.Boolean com.example.demo.domain.member.repository.ScrapExhibitionRepository.existsSrcapExhibitionByExhibitionIdAndMemberId(java.lang.Long,java.lang.Long); No property 'id' found for type 'Member'; Traversed path: ScrapExhibition.member
	
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'exhibitionServiceImpl' defined in file [C:\Users\yyyti\바탕 화면\BackEnd\build\classes\java\main\com\example\demo\domain\member\service\ExhibitionServiceImpl.class]: Unsatisfied dependency expressed through constructor parameter 2: Error creating bean with name 'scrapExhibitionRepository' defined in com.example.demo.domain.member.repository.ScrapExhibitionRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Could not create query for public abstract java.lang.Boolean com.example.demo.domain.member.repository.ScrapExhibitionRepository.existsSrcapExhibitionByExhibitionIdAndMemberId(java.lang.Long,java.lang.Long); Reason: Failed to create query for method public abstract java.lang.Boolean com.example.demo.domain.member.repository.ScrapExhibitionRepository.existsSrcapExhibitionByExhibitionIdAndMemberId(java.lang.Long,java.lang.Long); No property 'id' found for type 'Member'; Traversed path: ScrapExhibition.member
	
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'scrapExhibitionRepository' defined in com.example.demo.domain.member.repository.ScrapExhibitionRepository defined in @EnableJpaRepositories declared on JpaRepositoriesRegistrar.EnableJpaRepositoriesConfiguration: Could not create query for public abstract java.lang.Boolean com.example.demo.domain.member.repository.ScrapExhibitionRepository.existsSrcapExhibitionByExhibitionIdAndMemberId(java.lang.Long,java.lang.Long); Reason: Failed to create query for method public abstract java.lang.Boolean com.example.demo.domain.member.repository.ScrapExhibitionRepository.existsSrcapExhibitionByExhibitionIdAndMemberId(java.lang.Long,java.lang.Long); No property 'id' found for type 'Member'; Traversed path: ScrapExhibition.member
	
Caused by: org.springframework.data.repository.query.QueryCreationException: Could not create query for public abstract java.lang.Boolean com.example.demo.domain.member.repository.ScrapExhibitionRepository.existsSrcapExhibitionByExhibitionIdAndMemberId(java.lang.Long,java.lang.Long); Reason: Failed to create query for method public abstract java.lang.Boolean com.example.demo.domain.member.repository.ScrapExhibitionRepository.existsSrcapExhibitionByExhibitionIdAndMemberId(java.lang.Long,java.lang.Long); No property 'id' found for type 'Member'; Traversed path: ScrapExhibition.member
	
Caused by: java.lang.IllegalArgumentException: Failed to create query for method public abstract java.lang.Boolean com.example.demo.domain.member.repository.ScrapExhibitionRepository.existsSrcapExhibitionByExhibitionIdAndMemberId(java.lang.Long,java.lang.Long); No property 'id' found for type 'Member'; Traversed path: ScrapExhibition.member

Process finished with exit code 1

다음과 같은 에러 메세지가 발생하였다.
ExhibitionController의 bean을 생성할 수 없다는 에러에서 연쇄적으로 에러가 발생하여(ExhibitionController -> ExhibitonServiceImpl -> ScrapExhibitionRepository) 결국 ScrapExhibitionRepository의 쿼리에 문제가 생겼음을 확인할 수 있었다. 해당 에러는 다음과 같다.

Caused by: org.springframework.data.repository.query.QueryCreationException: Could not create query for public abstract java.lang.Boolean com.example.demo.domain.member.repository.ScrapExhibitionRepository.existsSrcapExhibitionByExhibitionIdAndMemberId(java.lang.Long,java.lang.Long); Reason: Failed to create query for method public abstract java.lang.Boolean com.example.demo.domain.member.repository.ScrapExhibitionRepository.existsSrcapExhibitionByExhibitionIdAndMemberId(java.lang.Long,java.lang.Long); No property 'id' found for type 'Member'; Traversed path: ScrapExhibition.member
Caused by: java.lang.IllegalArgumentException: Failed to create query for method public abstract java.lang.Boolean com.example.demo.domain.member.repository.ScrapExhibitionRepository.existsSrcapExhibitionByExhibitionIdAndMemberId(java.lang.Long,java.lang.Long); No property 'id' found for type 'Member'; Traversed path: ScrapExhibition.member
Caused by: org.springframework.data.mapping.PropertyReferenceException: No property 'id' found for type 'Member'; Traversed path: ScrapExhibition.member

원인

package com.example.demo.domain.member.repository;

import com.example.demo.domain.member.entity.ScrapExhibition;
import org.springframework.data.jpa.repository.JpaRepository;

public interface ScrapExhibitionRepository extends JpaRepository<ScrapExhibition, Long> {

    Boolean existsSrcapExhibitionByExhibitionIdAndMemberId(Long exhibitionId, Long memberId);
}

JpaRepository에서 제공하지 않는 메서드인 existsSrcapExhibitionByExhibitionIdAndMemberId을 사용하려고 하여 에러가 발생하였다.

해결

package com.example.demo.domain.member.repository;

import com.example.demo.domain.member.entity.ScrapExhibition;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

public interface ScrapExhibitionRepository extends JpaRepository<ScrapExhibition, Long> {

    @Query("select s from ScrapExhibition s where s.member =: memberId and s.exhibition =: exhibitionId")
    Boolean existsSrcapExhibitionByExhibitionIdAndMemberId(@Param("exhibitionId") Long exhibitionId, @Param("memberId") Long memberId);
}

이를 해결하기 위해 ScrapExhibition의 외래키인 exhibitionId와 memberId로 ScrapExhibition 테이블에 해당 데이터가 존재하는지 메서드를 작성하기 위해 사용자 정의 쿼리를 사용하였다.

JpaRepository의 메서드 명명규칙이 익숙치 않아 발생한 문제였다.

https://docs.spring.io/spring-data/jpa/docs/current/api/org/springframework/data/jpa/repository/JpaRepository.html

spring JpaRepository 공식 문서이다. 이를 보고 JpaRepository에 더 익숙해져야겠다고 생각했다.

0개의 댓글