우선 extends JpaRepository는 Spring Data JPA라는 기술을 사용했다. 이에 대한 개념을 간단히 이해하고 둘을 비교해보자.
Spring Data JPA
Spring Data JPA는 스프링에서 JPA를 편리하게 사용할 수 있도록 지원하는 모듈.
CRUD 처리를 위한 공통 인터페이스를 제공해주고, 인터페이스만 작성하면 동적으로 구현체를 생성해서 주입해주기 때문에 인터페이스만 작성해도 개발을 완료할 수 있다.
설정과 구현에 대한 내용은 아래 링크 참고)
https://blog.naver.com/ghdalswl77/222314410957
Spring Data JPA는 다음과 같이 JpaRepository 인터페이스를 상속하는 인터페이스를 정의하면 이 인터페이스를 통해 RDBMS, NoSQL 등의 Repository와 데이터를 주고받을 수 있는 빈을 자동적으로 등록하는 기능을 제공한다.
public interface TestRepository extends JpaRepository<Test, Long> {
}
위와 같은 인터페이스를 만들어두고, @Autowird와 같이 빈을 주입하는 어노테이션을 추가하여 사용할 수 있다.
@Component
@Transactional
public class JpaRunner implements ApplicationRunner {
@Autowired
TestRepository testRepository;
@Override
public void run(ApplicationArguments args) throws Exception{
testRepository.findAll().forEach(System.out::println);
}
}
extends JpaRepository
extends JpaRepository란 뭘까?
우리가 만든 XRepository 인터페이스가 JpaRepository 인터페이스를 상속하면 해당 인터페이스의 구현체(Spring Data Jpa의 구현체 )인 SimpleJpaRepository에서 @Repository로 스프링 컨테이너가 관리하는 빈이 된다. 코드를 따라가보자.
그렇기 때문에 우리가 만든 Repository에서 별도의 @Repository 어노테이션 없어도 스프링 빈이 되어 컴포넌트 스캔의 대상이 되어 사용할 수 있는 것이다.
Q. 구현체가 없는데 어떻게 동작을 하지?🤔
extends JpaRepository 가 있으면 Spring Data JPA가 인터페이스에 대해서 프록시 구현체를 만든 뒤 DI 받기 때문에 사용할 수 있다.
@Repository 기능으로는 컴포넌트 스캔, JPA의 예외를 스프링에서 공통적으로 처리할 수 있는 예외로 변환해주는 역할도 지원한다. 또 @Repository를 생략할 수도 있는데, Spring Data JPA가 자동으로 컴포넌트 스캔 처리해주기 때문에 가능하다. (아래에 자세히 설명)
@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를 import한다. 이 클래스는 Jpa Repository 들을 등록하는 역할을 하는데, JpaRepositoriesRegistrar는 추적해보면 ImportBeanDefinitionRegistrar 인터페이스의 구현체다. 이 ImportBeanDefinitionRegistrar의 인터페이스의 registerBeanDefinitions를 구현하면 어떤 클래스든지 그 클래스에 명시적으로 @Component와 같은 어노테이션을 붙이지 않더라도 빈에 등록할 수 있다.
Spring Data 구성 요소
'☕️자바 𝗝𝗔𝗩𝗔' 카테고리의 다른 글
[JPA] validMemberEmailDuplicate 문제점 (1) | 2022.09.30 |
---|---|
[JPA] Spring Data JPA 반환 타입 (1) | 2022.09.30 |
[JPA] 엔티티 설계 시 주의점 (setter 지양, 즉시로딩 지양) (1) | 2022.09.26 |
[JPA] 영속성 전이, 고아 객체 (cascade 범위) (1) | 2022.09.24 |
[JPA] 즉시로딩, 지연로딩 (JPA N+1문제) (0) | 2022.09.22 |
댓글