본문 바로가기

Kotlin/Spring

(Spring) No property {} found for type {} 해결 법

JPA와 QueryDSL 을 동시에 사용하려다 보면 이런 현상들이 발생 한다

@Transactional
@Service
class IssueService(
    private val issueRepository: IssueRepository,
    private val queryDslIssueRepository: QueryDslIssueRepository
    private val memberService: ExternalMemberService,
){

이런 식으로 2개의 Repository를 주입 받아야 하는 현상이 생기는 것이다

 

나는 이 부분이 마음에 안들어서 JPA와 QueryDSL 을 하나의 Repository로 통합을 해보려고 한다

위와 같이 리펙터링을 하여 Service 코드에서 하나의 Repository의 주입 만으로 JPA와 QueryDSL을 모두 활용할 수 있도록 또한 JPA에서 QueryDSL로 로직이 변경되더라도 유용하게 사용할 수 있도록 변경하였다

 

그러나 문제의 에러가 2개 발생하였다

 

1.unsatisfied dependency expressed through constructor parameter 0: error creating bean with name 애러

LoggingFailureAnalysisReporter

 

(Spring) LoggingFailureAnalysisReporter 애러 해결 방법

해당 문제는 보통 애러로그를 제대로 읽어 봐야한다Description: Parameter 0 of constructor in com.example.mytodo.domain.todo.service.TodoServiceImpl required a bean of type 'com.example.mytodo.domain.todo.repository.TodoRepository' that c

whererufromdevelop.tistory.com

해당 애러는 한번 포스팅을 한 적이 있지만 Spring이 Bean을 찾지 못해서 발생하는 현상이다 이런 경우 가장 흔한 실수로 @Service, @Controller, @Repository 같은 Annotation을 잘 확인 하거나 애러로그를 확인을 하여 어디서 어디로 가는 도중에 Bean 이 막혔는지 확인을 하고 애러를 해결할 필요가 있다

 

필자는 이번에 1시간을 고생한 끝에 아래 처럼 패키지 명이 누락되어 있어서 발생한 현상으로 패키지명이 등록이 되지 않아서 Spring 내부적으로 Bean을 찾지 못한 것으로 풀이가 된다

 

AS-IS

import com.querydsl.core.types.Expression
import com.querydsl.core.types.Order
import com.querydsl.core.types.OrderSpecifier
import com.querydsl.core.types.dsl.BooleanExpression
import com.querydsl.core.types.dsl.EntityPathBase
import com.querydsl.core.types.dsl.PathBuilder
import com.querydsl.jpa.impl.JPAQueryFactory
import com.yoong.myissue.domain.issue.entity.Issue
import com.yoong.myissue.domain.issue.entity.QIssue
import com.yoong.myissue.domain.issue.enumGather.Priority
import com.yoong.myissue.domain.issue.enumGather.WorkingStatus
import com.yoong.myissue.exception.clazz.IllegalArgumentException
import jakarta.persistence.EntityManager
import jakarta.persistence.PersistenceContext
import org.springframework.data.domain.Page
import org.springframework.data.domain.PageImpl
import org.springframework.data.domain.Pageable
import org.springframework.data.repository.findByIdOrNull
import org.springframework.stereotype.Repository

@Repository
class IssueRepositoryImpl(

 

TO-BE

package com.yoong.myissue.domain.issue.repository

import com.querydsl.core.types.Expression
import com.querydsl.core.types.Order
import com.querydsl.core.types.OrderSpecifier
import com.querydsl.core.types.dsl.BooleanExpression
import com.querydsl.core.types.dsl.EntityPathBase
import com.querydsl.core.types.dsl.PathBuilder
import com.querydsl.jpa.impl.JPAQueryFactory
import com.yoong.myissue.domain.issue.entity.Issue
import com.yoong.myissue.domain.issue.entity.QIssue
import com.yoong.myissue.domain.issue.enumGather.Priority
import com.yoong.myissue.domain.issue.enumGather.WorkingStatus
import com.yoong.myissue.exception.clazz.IllegalArgumentException
import jakarta.persistence.EntityManager
import jakarta.persistence.PersistenceContext
import org.springframework.data.domain.Page
import org.springframework.data.domain.PageImpl
import org.springframework.data.domain.Pageable
import org.springframework.data.repository.findByIdOrNull
import org.springframework.stereotype.Repository

@Repository
class IssueRepositoryImpl(

인간적으로 옆에 자세히 보면 @ 밑에 노란색으로 밑줄이 그여져 있다 저기에 가져다 대니까 패키지 명 누락을 확인 할 수 있었다

아니 이걸 어케 찾아

2. No property {} found for type {} 애러

사실 이 문제가 가장 핵심 문제 였다 이 문제는 메서드가 JPA를 찾지 못해서 발생한 애러로 나는 여기서 아래와 같은 애러 테스트를 진행하였다

  • 1. 모든 Repository의 @Repository Annotation 주입
  • 2. QueryDSL을 사용하는 메서드 명 JPA 메서드 명과 겹치지 않게 수정
  • 3. IssueRepositoryImpl 구조 변경
  • 4. .yml 파일 코드 일부 수정
  • 5. build.gradle 파일 refrash
  • 6. QueryDSL 설정 clean 진행

모든 문제를 다 보기에는 의미도 없고 해당 문제를 해결 한 방법인 QueryDSL 설정 clean 진행 에 대해서 이야기를 하려고 한다

 

필자는 금번 애러 상황전에 많은 양의 QueryDSL을 다루고 있었고 이번에도 QueryDSL을 다루기 위해서 리펙터링 하는 과정에서 발생한 것이다 해당 애러는 QueryDSL 에 관한 정보가 cache에 누적이 되면서 다른 프로젝트 파일에 설정이 되어 있는 QueryDSL 설정이 현재 프로젝트 파일에 영향을 주었을 가능성이 가장 높아 보인다

 

따라서 아래와 같은 명령어로 clean 을 실행했다

./gradlew clean build

//테스트 코드를 적용하고 싶지 않을 경우
./gradlew clean build -x test

진행을 하고 다시 빌드 시에 정상적으로 빌드 되는 것을 확인했다

 

원인은 프로젝트 만들 때 캐시 삭제 및 빌드 초기화 등을 하지 않아서 캐시가 누적되어서 빌드가 꼬인 현상으로 확인이 된다

 

앞으로는 프로젝트 파일 생성할 때 빌드 초기화 및 캐시 삭제는 꼭 진행하자!!