그간 jpa를 사용하며 별의별 실수를 겪었지만, 이런 황당한 실수가 있을까 싶어 기록으로 남깁니다. 아마 자동 완성 기능을 쓰는 많은 분들이 겪을 수 있는, 특히 저를 비롯한 초보 분들이 많이 겪을 것 같은 문제라 기록으로 남겨봅니다.
spring batch 기능 구현을 위해 공부하던 중 한가지 샘플 코드 하나 만들어 보려고 신규 프로젝트를 하나 만들었습니다.
maven, jpa 를 사용해 간단한 spring batch 구현을 목표로 하는 간단한 프로젝트였습니다. 환경 설정을 끝내고 나서 빌드 여부를 확인하기 위해 mvn clean package
를 진행했습니다.
이게 무슨 일이죠…????
에러의 첫 번째 줄을 주목해서 보았습니다.
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userInfoRepository' defined in com.example.batchexample.repository.UserInfoRepository defined in @EnableJpaRepositories declared on JpaRepositor
iesRegistrar.EnableJpaRepositoriesConfiguration: Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Not a managed type: interface com.example.batchexample.repository.UserInfoRepository
일단, 엔티티와 레포지토리를 확인 해봅시다.
@Entity
@Builder
@AllArgsConstructor
@RequiredArgsConstructor
@Getter
@Table(name = "USER_INFO")
@EntityScan
public class UserInfo {
@Id
@GeneratedValue
private Long id;
private String name;
private String email;
@Override
public String toString() {
return "UserInfo{" +
"id=" + id +
", name='" + name + '\'' +
", email='" + email + '\'' +
'}';
}
}
엔티티 별 문제 없어 보입니다.
public interface UserInfoRepository extends JpaRepository<UserInfoRepository, Long> {
}
레포지토리 대~충 보면 별 문제 없어 보입니다. (여기까지는 몰랐죠)
엔티티 클래스에 @Entity
와 @EntityScan
어노테이션이 있어서 entity를 인식하지 못한 문제 같지는 않습니다.
그렇다면 @EnableJpaRepositoires
문제일까요? spring boot에서는 해당 어노테이션이 자동 설정이 되어 있어 생략해도 별 문제가 없습니다.
일단, BeanCreationException인 걸 보면 repository가 bean으로 올라가는 과정에서 문제가 있는 것 같습니다. 이것이 원인인지 정확하게 파악하기 위해 bean 등록 없이 진행해봅시다. repository 인터페이스에 @NoRepositoryBean
어노테이션만 추가해주면 됩니다.
@NoRepositoryBean
public interface UserInfoRepository extends JpaRepository<UserInfoRepository, Long> {
}
정상적으로 동작하는 것을 확인했으니 문제가 있는 녀석은 repository로 bean으로 올라갈 때 문제가 발생하고 있다는 것을 확인했습니다. 이쯤 되면 눈썰미 좋은 분들은 뭐가 문제인지 찾았을 것이라 생각하는데요, 저도 무심코 흘려 봤던 repository에 문제가 있다는 걸 찾았습니다.
바로 JpaRepository
에 제너릭으로 entity를 넣어야 하는데 UserInfoRepository를 넣어버린 것입니다. 이렇게 되니 UserInfoRepository라는 entity를 계속 찾아 헤맸던 것입니다.
아무 생각 없이 사용 했던 자동 완성 기능으로 오타 아닌 오타를 내버린 것입니다. 이를 올바르게 수정 해보면…
@NoRepositoryBean
public interface UserInfoRepository extends JpaRepository<UserInfo, Long> {
}
꼭 자동 완성 쓰시고 한 번씩 올바른 정보로 자동 완성 되었는지 확인 합시다!
진짜 이런 실수를 누가 할까요 ㅋㅋㅋㅋ
저도 똑같은 실수중이였는데, 같은 내용으로 에러 터지고 있었습니다. 너무너무 감사해요