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의 메서드 명명규칙이 익숙치 않아 발생한 문제였다.
spring JpaRepository 공식 문서이다. 이를 보고 JpaRepository에 더 익숙해져야겠다고 생각했다.