들어가며
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
'JPA' 카테고리의 다른 글
JPA - save() & saveAll() 성능 비교 분석 (0) | 2023.05.27 |
---|---|
JPA - N+1 문제와 해결방법 정리 (0) | 2022.08.09 |
JPA - findById() & existById() & getById() 메서드 관련 내용 정리 (쿼리, 성능 등등) (0) | 2022.03.25 |
JPA - JPQL @Query 기록 (0) | 2021.10.12 |
댓글