[Spring DB 2편] 6. Spring Data JPA

HJ·2023년 2월 4일
1

Spring DB 2편

목록 보기
6/11
post-thumbnail
post-custom-banner

김영한 님의 스프링 DB 2편 - 데이터 접근 활용 기술 강의를 보고 작성한 내용입니다.
https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-2/dashboard


1. Spring Data 소개

1-1. 등장 배경

  • 예전에는 관계형 DB를 많이 사용했는데 mongo DB나 redis 같은 것들이 등장

  • 데이터를 어딘가에 저장하고 조회하고 변경하고 삭제하는 것은 동일하고 어디에 저장하는지만 다르다

  • 기본 CRUD에 대해 인터페이스를 만들고 편리하게 사용할 수 있도록 하자는 생각에서 출발

  • Spring Data 라는 공통기술에서 CRUD 같은 기본적인 인터페이스를 제공


1-2. Spring Data 기능

  • CRUD + 쿼리

  • 동일한 인터페이스가 제공

  • 페이징 처리

  • 메서드 이름으로 쿼리를 자동으로 생성

  • 스프링 MVC에서 id 값만 넘겨도 도메인 클래스로 바인딩

  • 저장소와 관계 없이 추상화해서 공통으로 제공하는 기능




2. Spring Data JPA 소개

2-1. Spring Data JPA

  • Spring Data 에서 각 구현 기술의 특징에 맞게 기능을 확장해서 제공한다

  • JPA 에 맞게 확장된 것이 Spring Data JPA

  • Spring Data JPA 는 JPA 를 편리하게 사용할 수 있도록 도와주는 라이브러리

  • 대표적으로 공통 인터페이스 기능쿼리 메서드 기능을 제공한다


2-2. 공통 인터페이스 기능

  • JpaRepository 인터페이스를 통해서 기본적인 CRUD 기능을 제공한다

  • 공통화 가능한 기능이 거의 모두 포함되어 있다


2-3. 쿼리 메서드 기능

// Spring Data JPA
public interface MemberRepository extends JpaRepository<Member, Long> {
    List<Member> findByUsernameAndAgeGreaterThan(String username, int age);
}
  • Spring Data JPA 는 인터페이스에 메서드만 적어두면 메서드 이름을 분석해서 JPQL을 만들고 실행해준다

  • 쿼리 메서드 기능을 사용하려면 규칙에 맞는 메서드 이름을 사용해야 한다

  • @Query 어노테이션으로 sql이나 jpql을 직접 작성할 수 있는데, 이런 경우 쿼리 메서드 기능은 동작하지 않는다


2-4. 구현체

  • JpaRepository 인터페이스를 상속받으면 Spring Data JPA 가 동적 프록시 기술을 사용해서 구현 클래스를 만들어준다

  • 이렇게 만든 구현 클래스의 인스턴스를 만들어 스프링 빈으로 등록한다

  • 개발자는 구현 클래스 없이 인터페이스만 만들면 기본 CRUD 기능을 사용할 수 있다


2-5. 의존관계

  • JPA를 사용하기 위해 spring-boot-starter-data-jpa 라이브러리를 추가했는데 JPA , 하이버네이트, Spring Data JPA, 스프링 JDBC 관련 기능도 모두 포함되어 있기 때문에 별도의 라이브러리 설정은 하지 않아도 된다



3. Spring Data JPA 사용하기

3-1. 인터페이스 생성

public interface SpringDataJpaItemRepository extends JpaRepository<Item, Long> {

    List<Item> findByItemNameLike(String itemName);

    List<Item> findByPriceIsLessThanEqual(Integer price);

    // 쿼리 메서드 ( 아래 메서드와 같은 기능 수행 )
    List<Item> findByItemNameLikeAndPriceIsLessThanEqual(String itemName, Integer Price);

    // 쿼리 직접 실행
    @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);
}
  • 사용하려면 JpaRepository 를 상속받고, 제네릭에 관리할 <엔티티, PK 타입> 를 작성

  • 그러면 JpaRepository 가 제공하는 기본 CRUD 기능을 모두 사용할 수 있다

  • 조건을 추가하여 검색하는 기능은 공통으로 제공하지 않기 때문에 쿼리 메서드 기능을 사용하거나 @Query 를 사용해 직접 쿼리를 작성해야한다

    • 쿼리 메서드 기능을 사용하면 파라미터를 순서대로 입력한다

    • 직접 작성할 때는 @Param 을 이용해 명시적으로 파라미터를 바인딩 해야 한다


3-2. Repositoy 생성

3-2-1. 의존관계

  • ItemService 는 ItemRepository 에 의존하기 때문에 ItemService 에서 SpringDataJpaItemRepository 를 사용하려면 코드를 수정해야한다

  • ItemService 가 ItemRepository 에 대한 의존을 유지하면서 DI를 통해 구현 기술을 변경하기 위해 새로운 Repository 를 생성

  • 새로 생성된 Repository 가 ItemRepository 와 SpringDataJpaItemRepository 사이를 맞추기 위한 어댑터처럼 사용된다


3-2-2. 코드

public class JpaItemRepositoryV2 implements ItemRepository {

    private final SpringDataJpaItemRepository repository;

    @Override
    public Item save(Item item) {
        return repository.save(item);
    }
    ...
}
  • ItemRepository를 구현한 JpaItemRepositoryV2가 SpringDataJpaItemRepository 를 사용

  • itemServicejpaItemRepositoryV2SpringDataJpaItemRepository(프록시 객체)

  • JpaItemRepository 가 어댑터 역할을 해준 덕분에 ItemService 가 사용하는 ItemRepository 인터페이스를 그대로 유지할 수 있고 클라이언트인 ItemService 의 코드를 변경하지 않아도 된다

post-custom-banner

0개의 댓글