Spring/스프링 데이터 JPA
[스프링 데이터 JPA] 스프링 데이터 JPA 소개 및 원리
주멘이
2021. 1. 10. 22:34
JpaRepository <Entity, Id> 인터페이스
- 매직 인터페이스
- @Repository가 없어도 빈으로 등록해 줌.
@EnableJpaRepositories
- 매직의 시작은 여기서 부터
매직은 어떻게 이뤄지나?
- 시작은 @Import( JpaRepositoriesRegistrar.class )
- 핵심은 ImportBeanDefinitionRegistrar 인터페이스
- Bean을 프로그래밍을 통해 등록할 수 있게 한다.
- JpaRepository를 상속받은 모든 인터페이스들을 찾아서 빈으로 등록해준다.
ImportBeanDefinitionRegistrar를 통한 Bean 등록 과정 간략 예시
/**
* ImportBeanDefinitionRegistrar를 통한 Bean 등록 과정 간략 예시
*/
public class JumenRegister implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry, BeanNameGenerator importBeanNameGenerator) {
GenericBeanDefinition genericBeanDefinition = new GenericBeanDefinition();
genericBeanDefinition.setBeanClass(Jumen.class);
genericBeanDefinition.getPropertyValues().add("name", "jumen");
registry.registerBeanDefinition("jumenBean", genericBeanDefinition);
}
}
SpringBootApplication 클래스에서 @Import
@SpringBootApplication
@Import(JumenRegister.class)
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
JpaRepository를 상속하여 만드는 현재의 interface 방식
/* JpaRepository를 상속하는 모든 인터페이스들을 찾아서 bean으로 등록해준다. (@Repository 불필요) */
public interface PostRepository extends JpaRepository<Post, Long> {
}
PostRepositoryRunner로 PostRepositry 빈 주입과 테스트
@Component
@Transactional
public class PostRepositoryRunner implements ApplicationRunner {
@Autowired
Jumen jumen; // ImportBeanDefinitionRegistrar 예제 빈 주입
PostRepository postRepository;
// 생성자 주입
public PostRepositoryRunner(PostRepository postRepository) {
this.postRepository = postRepository;
}
@Override
public void run(ApplicationArguments args) {
System.out.println("=============" + jumen.getName());
postRepository.findAll().forEach(p -> {
System.out.println(p.toString());
});
}
}