개인프로젝트를 하던 중 생긴 궁금증입니다.
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 를 선언하지 않아도 된다.

📝 정리
@SpringBootApplication이 선언된 클래스에서 애플리케이션이 시작되면@EnableAutoConfiguration에 의해 자동 설정이 활성화- 자동 설정 중
JpaRepositoriesAutoConfiguration클래스 로드 JpaRepositoriesAutoConfiguration이@EnableJpaRepositories를 내부적으로 활성화@EnableJpaRepositories은 JPA 리포지토리 관련 설정을 활성화하고SimpleJpaRepository구현체가 자동으로 생성되어 빈으로 등록
'Data' 카테고리의 다른 글
| 금융권에서 오라클 DBMS를 선택하는 이유 (6) | 2025.08.01 |
|---|---|
| JPA 연관관계 매핑 vs 값 컬렉션 매핑: 뭘 선택해야 할까 (0) | 2025.04.13 |
| JPA 복합키 엔티티에서 단일 필드 조회 문제 해결하기 (3) | 2025.04.01 |
| 데이터 마이그레이션이란? (2) | 2024.09.26 |