[Spring] Spring Data JPA에서 @Repository를 사용하지 않는 이유

2025. 2. 9. 17:16·TIL (Today I Learned)

spring data jpa로 프로젝트를 구현할때, Repository 클래스에 Repository 어노테이션을 사용하지 않는 이유가 궁금해져서 알아보았다.

spring jdbc로 구현할 때는 @Repository를 썼었는데, JPA에서는 Repository 클래스에 @Repository를 사용하지 않아도 되는 이유가 뭘까?

 

Spring JDBC vs Spring Data JPA

  Spring JDBC Spring Data JPA
레포지터리 `JdbcTemplate`을 이용하여 직접 SQL 작성 `JpaRepository` 또는 `CrudRepository`를 상속하여 자동으로 구현
@Repository 필요 여부 명시적으로 `@Repository`를 선언해야 스프링 빈(Bean)으로 등록됨 Spring이 자동으로 빈(Bean) 등록
(@Repository를 명시해도 문제는 없음!)
예외 변환
(AOP 적용 여부)
`@Repository`를 선언해야 Spring의 예외 변환(AOP)이 적용됨 자동으로 예외 변환 지원

 

 

Spring Data JPA의 Repository

Spring Data JPA에서 JpaRepository를 상속받는 인터페이스는 Spring Boot가 자동으로 구현체를 생성해준다.
그래서 굳이 @Repository를 명시할 필요 없이 자동으로 빈으로 등록된다.

 

예시: 일정관리 API의 Repository

import com.example.schedule.entity.Schedule;
import org.springframework.data.jpa.repository.JpaRepository;

public interface ScheduleRepository extends JpaRepository<Schedule, Long> {
}

 

 

Spring Data JPA의 예외 변환 자동화(AOP)

Spring Data JPA는 @Repository 없이도 자동으로 예외 변환을 수행한다.

JPA 구현체(Hibernate 등)에서 발생하는 기본 예외(RuntimeException) 를 Spring의 일관된 데이터 접근 계층 예외(DataAccessException) 로 변환하여 처리한다.

 

예시: 일정 조회 API의 예외 발생 orElseThrow

@Service
@RequiredArgsConstructor
public class ScheduleService {
    private final ScheduleRepository scheduleRepository;

    public Schedule getSchedule(Long id) {
        return scheduleRepository.findById(id)
                .orElseThrow(() -> new RuntimeException("존재하지 않는 아이디입니다."));
    }
}

 

Spring이 자동으로 예외를 변환하는 과정

  1. Spring이 @Repository 빈을 감싸는 프록시(proxy)를 생성
  2. Repository 메서드를 실행할 때 AOP가 적용된 프록시가 먼저 실행됨
  3. JPA 예외가 발생하면 AOP가 예외를 감지하고, Spring의 DataAccessException으로 변환
  4. 서비스(Service) 계층에서는 변환된 Spring 예외를 받아서 처리 가능

 

 

결론

1️⃣ Spring Data JPA는 JpaRepository를 상속받으면 자동으로 빈으로 등록됨
2️⃣ @Repository 없이도 Spring이 예외 변환(AOP) 기능을 자동 지원
3️⃣ Spring JDBC에서는 @Repository가 필요했지만, JPA에서는 생략 가능
4️⃣ 필요하면 @Repository를 추가해도 무방하지만 일반적으로 불필요함 🎯

저작자표시 비영리 변경금지 (새창열림)

'TIL (Today I Learned)' 카테고리의 다른 글

[Spring] JPA 영속성 컨텍스트와 JOIN 활용  (0) 2025.02.12
[Spring] JPA에서 꼭 알아야 할 개념: 영속성  (0) 2025.02.10
[Spring] JPA Auditing 적용하기: @CreatedDate, @LastModifiedDate 활용법  (0) 2025.02.07
[TIL] SQL - WITH RECURSIVE 개념과 사용법  (0) 2025.02.06
[TIL] SQL 윈도우 함수 (Window Function)  (0) 2025.01.14
'TIL (Today I Learned)' 카테고리의 다른 글
  • [Spring] JPA 영속성 컨텍스트와 JOIN 활용
  • [Spring] JPA에서 꼭 알아야 할 개념: 영속성
  • [Spring] JPA Auditing 적용하기: @CreatedDate, @LastModifiedDate 활용법
  • [TIL] SQL - WITH RECURSIVE 개념과 사용법
기만나🐸
기만나🐸
공부한 내용을 기록합시다 🔥🔥🔥
  • 기만나🐸
    기만나의 공부 기록 🤓
    기만나🐸
  • 전체
    오늘
    어제
    • ALL (147)
      • TIL (Today I Learned) (56)
      • Dev Projects (15)
      • Algorithm Solving (67)
        • Java (52)
        • SQL (15)
      • Certifications (8)
        • 정보처리기사 실기 (8)
  • 인기 글

  • 태그

    java
    시뮬레이션
    백트래킹
    bootstrap
    완전탐색
    Firebase
    그리디
    jQuery
    Google Fonts
    join
    HTML
    jwt
    GROUP BY
    프로그래머스
    mysql
    sql
    CSS
    BOJ
    다이나믹프로그래밍
    programmers
    greedy
    Subquery
    DFS
    websocket
    javascript
    자료구조
    백준
    BFS
    jpa
    dp
  • 최근 글

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
기만나🐸
[Spring] Spring Data JPA에서 @Repository를 사용하지 않는 이유
상단으로

티스토리툴바