[JPA] 저의 repository는 왜 생성할 수 없죠

봄도둑·2022년 8월 9일
0

Spring 개인 노트

목록 보기
9/17

그간 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> {
}

꼭 자동 완성 쓰시고 한 번씩 올바른 정보로 자동 완성 되었는지 확인 합시다!

profile
Java Spring 백엔드 개발자입니다. java 외에도 다양하고 흥미로운 언어와 프레임워크를 학습하는 것을 좋아합니다.

2개의 댓글

comment-user-thumbnail
2022년 12월 14일

진짜 이런 실수를 누가 할까요 ㅋㅋㅋㅋ
저도 똑같은 실수중이였는데, 같은 내용으로 에러 터지고 있었습니다. 너무너무 감사해요

1개의 답글