JVM/JPA

[JPA] JpaRepository를 상속 받은 인터페이스는 @Repository 없이 어떻게 인스턴스화될까?

헹창 2022. 7. 26.
반응형

개요

Spring Data JPA 를 사용한다면, 보통 Repository 인터페이스는 다음과 같을 것이다

import org.springframework.data.jpa.repository.JpaRepository;

public interface MemberRepository extends JpaRepository<Member, String> {
    // ...
}

 

위의 코드만 봤을 때는, MemberRepository가 @Repository 어노테이션 없이 어떻게 Bean을 등록되는 지 알 수 없다.

JpARepository 내부 구현 코드를 들어가봐도 Bean 으로 등록해주는 코드는 존재하지 않았다.

이 궁금증을 시작으로 찾아보게 되었다.

 

 

@EnableJpaRepositories

  • 이 어노테이션은 JPA Repository 들을 활성화하기 위한 어노테이션이다.
  • Spring : @Configuration 클래스에서 @EnableJpaRepositories 어노테이션을 사용한다.
  • SprintBoot : @EnableJpaRepositories 가 자동설정이 돼서 생략해도 된다.
@Configuration
@EnableJpaRepositories(basePackages = "kr.co.haenny")
publc JpaConfiguration {
	// ...
}

 

내부 코드 확인

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(JpaRepositoriesRegistrar.class)
public @interface EnableJpaRepositories {
	// ...
}

 

@Import(JpaRepositoriesRegistrar.class)

  • JpaRepository 를 상속받은 모든 인터페이스를  Bean 으로 등록해준다.
  • ImportBeanDefinitionRegistrar 인터페이스의 구현체라고 볼 수 있으며 JpaRepositoriesRegistrar 와 ImportBeanDefinitionRegistrar 는 Spring 에서 제공하는 클래스이다.

 

참고로 ImportBeanDifinitionRegistrar 인터페이스는 BeanDefinition 을 정의할 수 있는 인터페이스로, ImportBeanDifinitionRegistrar를 이용해 빈으로 등록할 수 있다.

 

 

728x90
반응형

댓글

추천 글