아카이브

[스프링 데이터 JPA] 스프링 데이터 JPA 소개 및 원리 본문

Spring/스프링 데이터 JPA

[스프링 데이터 JPA] 스프링 데이터 JPA 소개 및 원리

주멘이 2021. 1. 10. 22:34

JpaRepository <Entity, Id> 인터페이스

  •  매직 인터페이스
  •  @Repository가 없어도 빈으로 등록해 줌.

@EnableJpaRepositories

  •  매직의 시작은 여기서 부터

매직은 어떻게 이뤄지나?

  •  시작은 @Import( JpaRepositoriesRegistrar.class )
  •  핵심은 ImportBeanDefinitionRegistrar 인터페이스
    • Bean을 프로그래밍을 통해 등록할 수 있게 한다.
    • JpaRepository를 상속받은 모든 인터페이스들을 찾아서 빈으로 등록해준다.

ImportBeanDefinitionRegistrar의 빈 등록 method

 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());
        });
    }
}