[Spring JPA #9] 스프링 데이터 JPA 원리 및 스프링 데이터 구성 요소
| 스프링 데이터 JPA 소개 및 원리
스프링 데이터 JPA에서는 다음과 같이 JpaRepository 인터페이스를 상속하는 인터페이스를 정의하면 이 인터페이스를 통해 RDBMS, NoSQL 등의 Repository와 데이터를 주고받을 수 있는 빈을 자동적으로 등록하는 기능을 제공합니다.
public interface PostRepository extends JpaRepository<Post, Long> {
}
위에서 정의한 인터페이스는 다음과 같이 @Autowird와 같은 빈을 주입하는 어노테이션을 추가함으로서 사용할 수 있습니다.
@Component
@Transactional
public class JpaRunner implements ApplicationRunner {
@Autowired
PostRepository postRepository;
@Override
public void run(ApplicationArguments args) throws Exception {
postRepository.findAll().forEach(System.out::println);
}
}
결과 화면
Post{id=1, title='Spring Data Title'}
| @EnableJpaRepositories
@EnableJpaRepositories 어노테이션은 JpaRepository 에 대한 설정정보를 자동적으로 로딩하고 이 정보를 토대로 Repository 빈을 등록하는 역할을 합니다.
@EnableJpaRepositories 어노테이션은 @SpringBootApplication 어노테이션 안에 이미 등록되어 있어 스프링 부트를 사용할 경우에는 따로 어노테이션을 추가할 필요가 없어집니다.
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
| Repository 빈 자동 등록 메커니즘
스프링 부트에서 제공하는 Repository 빈 자동 메커니즘의 원리는 다음과 같습니다.
먼저 @EnableAutoConfiguration에 있는 @Import(JpaRepositoriesRegistrar.class)에서 JpaRepositoriesRegistrar를 임포트 시킵니다. 이 클래스는 Jpa Repository 들을 등록하는 역할을 합니다.
JpaRepositoriesRegistrar는 추적해보면 ImportBeanDefinitionRegistrar 인터페이스의 구현체입니다. 이 ImportBeanDefinitionRegistrar의 인터페이스의 registerBeanDefinitions를 구현하면 어떤 클래스든지 그 클래스에 명시적으로 @Component와 같은 어노테이션을 붙이지 않더라도 빈에 등록할 수 있습니다.
| 스프링 데이터 구성 요소
스프링 데이터는 다음과 같은 구성 요소들로 이루어져 있습니다.
'Spring Data > Spring Data JPA' 카테고리의 다른 글
[Spring JPA #13] 스프링 데이터 쿼리 만들기 (0) | 2021.03.25 |
---|---|
[Spring JPA #12] 스프링 데이터 Null 체크 (0) | 2021.03.25 |
[Spring JPA #11] 스프링 데이터 리포지터리 인터페이스 정의하기(Spring Repository Interface) (0) | 2021.03.25 |
[Spring JPA #10] 스프링 데이터 Common 리포지터리(Repository) (0) | 2021.03.25 |
[Spring JPA #8] JPA Query (0) | 2021.03.25 |
[Spring JPA #7] JPA Fetch (0) | 2021.03.25 |
[Spring JPA #6] JPA Cascade (0) | 2021.03.25 |
[Spring JPA #5] JPA 엔티티 상태 (0) | 2021.03.25 |