ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 데이터 접근 기술 - 스프링 데이터 JPA
    Spring&SpringBoot 2025. 11. 20. 09:59

    스프링 데이터 JPA 주요 기능

    • 공통 인터페이스 기능
    • 쿼리 메서드 기능

     

     

    1. 공통 인터페이스 기능

     

     

    스프링 데이터 JPA가 구현 클래스를 대신 생성

    • JpaRepository 인터페이스만 상속받으면 스프링 데이터 JPA가 프록시 기술을 사용해서 구현 클래스를 만들어준다. 그리고 만든 구현 클래스의 인스턴스를 만들어서 스프링 빈으로 등록한다.

     

     


    JpaRepository 사용법

    public interface ItemRepository extends JpaRepository<Item, Long> {}
    • JpaRepository 인터페이스를 인터페이스 상속 받고 제네릭에 관리할 <엔티티, 엔티티ID> 를 주면 된다
    • JpaRepository가 제공하는 기본 CRUD 기능을 모두 사용할 수 있다

     

     

    2. 쿼리 메서드 기능

    // 순수 JPA 리포지토리
    public List<Member> findByUsernameAndAgeGreaterThan(String username, int age) {
        return em.createQuery("select m from Member m where m.username = :username and m.age > :age")
                .setParameter("username", username)
                .setParameter("age", age)
                .getResultList();
    }
    
    // 스프링 데이터 JPA
    public interface MemberRepository extends JpaRepository<Member, Long> {
        // 쿼리 메서드 기능
        List<Member> findByUsernameAndAgeGreaterThan(String username, int age);
        
        // JPQL 직접 사용하기
        @Query("select i from Item i where i.itemName like :itemName and i.price <= :price")
        List<Item> findItems(@Param("itemName") String itemName, @Param("price") Integer price);
    }

     

    • 스프링 데이터 JPA는 메서드 이름을 분석해서 필요한 JPQL을 만들고 실행해준다
    • 스프링 데이터 JPA가 제공하는 쿼리 메소드 기능
      • 조회 : find…By, read…By, query…By, get…By
      • COUNT : count…By  반환타입 long 
      • EXISTS : exists…By 반환타입 boolean 
      • 삭제 : delete…By 반환타입 long 
      • DISTINCT : findDistinct, findMemberDistinctBy 
      • LIMIT : findFirst3, findFirst, findTop, findTop3  
    • 쿼리 메소드 필터 조건  - Spring Data JPA :: Spring Data JPA
    • 직접 JPQL을 사용하고 싶을 때는 @Query와 함께 JPQL을 작성하면 된다 

     

     

    cf. JPA 예외 반환

    @Repository
    @Transactional
    public class JpaItemRepositoryV1 implements ItemRepository {
        private final EntityManager em;
        
        @Override
        public Item save(Item item) {
            em.persist(item);
            return item;
        }
    }
    • EntityManager는 순수한 JPA 기술이고 스프링과는 관계가 없다 따라서 EntityManager는 예외가 발생하면 JPA 관려 예외를 발생한다 

     

     

    • JPA는 PersistenceException과 그 하위 예외를 발생시킨다
    • JPA 예외를 스프링 예외 추상화(DataAccessException)로 변환하는 방법은 @Repository가 처리한다
    • @Repository는 컴포넌트 스캔의 대상이 되며 예외 변환 AOP의 적용 대상이 된다
      • 스프링과 JPA를 함께 사용하는 경우 스프링은 JPA 예외 변환기(PersistenceExceptionTranslator)를 등록한다
      • 예외 변환 AOP 프록시는 JPA 관련 예외가 발생하면 JPA 예외 변환기를 통해 발생한 예외를 스프링 데이터 접근 예외로 변환한다 

     

     

    • 결국 리파지토리에 @repository 어노테이션만 있으면 스프링이 예외 변환을 처리하는 AOP를 만들어 준다 
    • 스프링 부트는 PersistenceExceptionTranslationPostProcessor를 자동으로 등록하는데 여기서 @Reppsitory를 AOP 프록시로 만드는 어드바이저가 등록된다 
    728x90

    'Spring&SpringBoot' 카테고리의 다른 글

    스프링 트랜잭션 전파  (0) 2025.11.20
    트랜잭션 커밋/롤백과 예외  (0) 2025.11.20
    @Transaction  (0) 2025.11.13
    트랜잭션, DB 락  (0) 2025.11.12
    JDBC  (0) 2025.11.12
Designed by Tistory.