본문 바로가기
☕️자바 𝗝𝗔𝗩𝗔

[Spring Data JPA] extends JpaRepository VS @Repository

by 비타민찌 2022. 9. 30.
728x90

우선 extends JpaRepository는 Spring Data JPA라는 기술을 사용했다. 이에 대한 개념을 간단히 이해하고 둘을 비교해보자.

 

Spring Data JPA

Spring Data JPA는 스프링에서 JPA를 편리하게 사용할 수 있도록 지원하는 모듈.

CRUD 처리를 위한 공통 인터페이스를 제공해주고, 인터페이스만 작성하면 동적으로 구현체를 생성해서 주입해주기 때문에 인터페이스만 작성해도 개발을 완료할 수 있다.

설정과 구현에 대한 내용은 아래 링크 참고)

https://blog.naver.com/ghdalswl77/222314410957

 

Spring Data JPA

1. Spring Data JPA Spring Data JPA는, JPA를 쓰기 편하게 만들어 놓은 모듈이다. 스프링 부...

blog.naver.com

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와 같은 어노테이션을 붙이지 않더라도 빈에 등록할 수 있다. 

@Repository

 

Spring Data 구성 요소

 

728x90

댓글