JpaRepository를 상속받으면 @Repository 어노테이션을 안달아도 되는 이유

2025. 3. 26. 00:47·Data

개인프로젝트를 하던 중 생긴 궁금증입니다.
QueryDsl 인터페이스를 상속받는 구현체에는 @Repository를 선언해야 하는데, JpaRepository를 상속받는 인터페이스에는 @Repository를 작성하지 않아도 되는 이유가 무엇일까?

📍 배경

public interface BookingQueryDsl {  
    public List<Booking> findAll(BookingSearch bookingSearch);  
}


@Repository  
public class BookingQueryDslImpl implements BookingQueryDsl {  

    private final JPAQueryFactory queryFactory;  
    public BookingQueryDslImpl(EntityManager entityManager) {  
        queryFactory = new JPAQueryFactory(entityManager);  
    }  

    @Override  
    public List<Booking> findAll(BookingSearch bookingSearch) {  

        BooleanBuilder builder = new BooleanBuilder();  
        if (bookingSearch.getCustName() != null) {  
            builder.and(booking.cust.name.contains(bookingSearch.getCustName()));  
        }  

        if (bookingSearch.getBookingStatus() != null) {  
            builder.and(booking.status.eq(bookingSearch.getBookingStatus()));  
        }  

        return queryFactory  
                .selectFrom(booking)  
                .join(booking.cust, cust).fetchJoin()  
                .where(builder)  
                .limit(100)  
                .fetch();  
    }  
}

위 코드소스는 보기 쉽게 2개의 클래스에 있는 코드를 붙여서 작성했다
예약된 내역을 보기 위한 동적 쿼리를 작성하기 위해 QueryDsl 전용 인터페이스와 구현체를 작성했다

public interface JpaBookingRepository extends JpaRepository<Booking, Long>, BookingQueryDsl {  
}

JpaBookingRepository 인터페이스에서 JpaRepository와 위에 있던 BookingQueryDsl를 다중 상속받아 서비스에서 사용되어진다

이때 문뜩 JpaRepository는 상속만받는다고 어떻게 컴포넌트 스캔이 되는지 궁금해졌다


📍 Spring Data JPA 내부 동작 원리

① @EnableAutoConfiguration

SpringBoot 애플리케이션이 시작되면 @SpringBootApplication 어노테이션을 통해 @EnableAutoConfiguration이 활성화된다.
@EnableAutoConfiguration을 통해 필요한 빈들을 자동으로 설정하고 등록이 가능해진다

@EnableAutoConfiguration 이 실행되면 JpaRepositoriesAutoConfiguration 클래스가 자동으로 로드된다
JpaRepositoriesAutoConfiguration 클래스에는 @AutoConfiguration 이 달려있기 때문이다

② @EnableJpaRepositories

JpaRepositoriesAutoConfiguration 클래스가 로드될 때 내부적으로 @EnableJpaRepositories를 처리하는 컴포넌트가 활성화된다
이를 통해 (1) JpaRepository를 검색하고 (2)이에 대한 프록시 객체를 자동으로 생성한다.
@EnableJpaRepositories 가 사용되면 JpaRepositoriesImportSelector가 호출되어 JpaRepository 설정을 활성화한다
JpaRepositoriesImportSelector는 JpaRepository를 상속받은 인터페이스를 찾아서 자동으로 프록시 객체를 생성하고 빈으로 등록한다

⭐️ @SpringBootApplication에는 직접적으로 @EnableJpaRepositories가 선언되어 있지 않다.
하지만 @EnableAutoConfiguration 덕분에 Spring Boot에서는 @SpringBootApplication 내부적으로 를 포함하고 있어서 자동으로 JPA 레포지토리를 스캔 한다

③SimpleJpaRepository가 @Repository 역할 수행

JpaRepositoriesImportSelector 에서 프록시 객체를 생성할 때 SimpleJpaRepository라는 기본 구현체를 생성한다
이때! SimpleJpaRepository 클래스에는 @Repository 어노테이션이 이미 포함되어 있다
그래서 개발자가 명시적으로 @Repository 를 선언하지 않아도 된다.


📝 정리

  1. @SpringBootApplication이 선언된 클래스에서 애플리케이션이 시작되면
  2. @EnableAutoConfiguration에 의해 자동 설정이 활성화
  3. 자동 설정 중 JpaRepositoriesAutoConfiguration 클래스 로드
  4. JpaRepositoriesAutoConfiguration이 @EnableJpaRepositories를 내부적으로 활성화
  5. @EnableJpaRepositories은 JPA 리포지토리 관련 설정을 활성화하고 SimpleJpaRepository 구현체가 자동으로 생성되어 빈으로 등록

'Data' 카테고리의 다른 글

금융권에서 오라클 DBMS를 선택하는 이유  (6) 2025.08.01
JPA 연관관계 매핑 vs 값 컬렉션 매핑: 뭘 선택해야 할까  (0) 2025.04.13
JPA 복합키 엔티티에서 단일 필드 조회 문제 해결하기  (3) 2025.04.01
데이터 마이그레이션이란?  (2) 2024.09.26
'Data' 카테고리의 다른 글
  • 금융권에서 오라클 DBMS를 선택하는 이유
  • JPA 연관관계 매핑 vs 값 컬렉션 매핑: 뭘 선택해야 할까
  • JPA 복합키 엔티티에서 단일 필드 조회 문제 해결하기
  • 데이터 마이그레이션이란?
꾸준히 기록하는 지수
꾸준히 기록하는 지수
서비스 백엔드 개발자가 되기 위해 제 경험들을 하나씩 기록해봅니다
  • 꾸준히 기록하는 지수
    지수블로그
    꾸준히 기록하는 지수
  • 전체
    오늘
    어제
    • 분류 전체보기 (37)
      • Spring (15)
      • JAVA (9)
      • 클라우드_인프라 (4)
      • Data (5)
      • CS (3)
      • 돌아보기 (0)
      • 취업준비 (1)
  • 블로그 메뉴

    • 홈
    • 태그
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    스프링테스트
    스프링클라우드
    트랜잭션
    MSA
    Spring
    스프링
    DAsP
    AWS
    데이터아키텍처준전문가
    스프링트랜잭션
    자격증
    트러블슈팅
    스프링부트
    DASP합격후기
    DASP후기
    DASP합격
    트랜잭션전파
    SCG
    SpringCloudGateway
    궁금증
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
꾸준히 기록하는 지수
JpaRepository를 상속받으면 @Repository 어노테이션을 안달아도 되는 이유
상단으로

티스토리툴바