본문 바로가기
JPA

JPA - Spring-data-jpa 사용시 @Repository 어노테이션 사용 여부

by devLog by Ronnie's 2022. 1. 28.

들어가며


jpa를 사용하지 않은 프로젝트를 진행시 repository에는 @Repository 어노테이션을 활용하여 의존성 주입을 위한 빈 등록을 해준다. 그렇다면 spring-data-jpa를 사용시에는 @Repository 어노테이션이 필요할까? 라는 생각에 찾아보았다.

 

 

spring-data-jpa를 사용하지 않는 경우


spring-data-jpa를 사용하지 않는 경우에는 @Repository 어노테이션을 이용하여 리포지토리에 선언을 해주고 스프링 어플리케이션 동작시에 @ComponentScan 어노테이션을 통해 코드의 컴포넌트를 읽어 싱글톤 패턴으로 빈을 컨테이너에 등록하게 된다.

기본적으로 @Component 어노테이션을 명시한 클래스들이 Bean으로 등록이 되는데, @Controller, @Service, @Repository, @Configuration 등이 @Component 를 확장한 어노테이션들이기 때문에 모두 Bean 등록을 위해 명시해주면 등록을 해준다.

 

일반적으로 인터페이스를 만들어주고 해당 인터페이스 리포지토리를 구현하는 구현체에 @Repository 어노테이션을 명시하여 사용한다.

public interface TestRepository {
    Long 회원가입();
}
@Repository
public class TestRepositoryImpl implements TestRepository{
    @Override
    public Long 회원가입() {
        return null;
    }
}

 

 

spring-data-jpa를 사용하는 경우


결론부터 말하면 이 경우에는 @Repository 어노테이션을 사용할 필요가 없다. 

스프링 데이터 제이피에이를 사용하는 경우에는 JpaRepository를 상속받아 사용하게 되는데 JpaRepository 인터페이스에 들어가보면 @NoRepositoryBean이라는 어노테이션을 있다. 이 어노테이션은 Repository 인터페이스를 상속 받았기 때문에 실제 빈을 만들지 않도록 하기 위하여 사용되는 즉, 실제 사용되는 Repository가 아님을 표시하는 어노테이션이다.

 

그렇다면 실제로 빈 등록은 어디서 이루어지는지가 궁금해지는데 정답은 바로 @EnableJpaRepositories 어노테이션에서 이루어지며 스프링부트에서는 자동으로 설정되어 생략을 해도 이용하는데 문제가 없다. 코드는 이러하다. @Import.. 어노테이션에서 빈으로 등록해주는 역할을 하게 된다.

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(JpaRepositoriesRegistrar.class)
public @interface EnableJpaRepositories

 

 

 

 

 

 

 

 

 

 

 

 

 

 

댓글