데이터 접근 기술 _ 스프링 JPA

이동건 (불꽃냥펀치)·2025년 2월 26일
0

스프링 데이터 JPA 주요기능

  • 공통 인터페이스 기능
    • JpaRepository 인터페이스를 통해 기본적인 CRUD 기능 제공
    • 공통화 가능한 기능이 거의 모두 포함
  • 쿼리 메서드 기능

JPARepository 사용법

 public interface ItemRepository extends JpaRepository<Item, Long> {
 }
  • JpaRepository 인터페이스를 인터페이스 상속 받고, 제네릭에 관리할 <엔티티, 엔티티ID> 를 주면 된다
  • JpaRepository가 제공하는 기본 CRUD기능을 모두 사용 가능
  • JpaRepository만 상속받으면 스ㅡㅍ링 데이터 JPA가 프록시 기술을 사용해서 구현 클래스를 만들어 준다. 그리고 만든 구현 클래스의 인스턴스를 만들어서 스프링 빈으로 등록

쿼리메서드 기능

 public interface MemberRepository extends JpaRepository<Member, Long> {
     List<Member> findByUsernameAndAgeGreaterThan(String username, int age);
}
  • 스프링 데이터 JPA는 메서드 이름을 분석해서 필요한 JPQL을 만들고 실행해 준다.

JPQL 사용 예시

public interface SpringDataJpaItemRepository extends JpaRepository<Item, Long> {

    List<Item> findByItemNameLike(String itemName);

    List<Item> findByPriceLessThanEqual(Integer price);

    //쿼리 메서드 (아래 메서드와 같은 기능 수행)
    List<Item> findByItemNameLikeAndPriceLessThanEqual(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);
}
  • 쿼리메서드 기능 대신에 직접 JPQL을 사용하고 싶을 때는 @Query와 함께 JPQL을 작성하면 도니다. 이때 메서드 이름으로 실행되는 규칙은 무시



스프링 데이터 JPA 적용1

List<Item> findByItemNameLike(String itemName);

List<Item> findByPriceLessThanEqual(Integer price);

    //쿼리 메서드 (아래 메서드와 같은 기능 수행)
List<Item> findByItemNameLikeAndPriceLessThanEqual(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);

findAll()

  • 모든 아이템을 조회
    -select i from Item i

findByItemNameLike()

  • 이름조건만 검색했을 때 사용하는 쿼리
  • select i from Item i where i.name like ?
    findByPriceLessThanEqual()
  • 가격조건만 검색했을 때 사용하는 쿼리
  • select i from Item i where i.price <= ?

findByItemNameLikeAndPriceLessThanEqual()

  • 이름과 가격조건을 검색했을 때 사용하는 메서드
  • select i from Item i where i.name like ? and i.price <= ?

쿼리를 직접 사용하려면 @Query 구문을 쓰면된다. 변수를 바인딩 할 때는 @Param("itemName")
와 같이 지정하면 됨



스프링 데이터 JPA 적용 2

@Repository
@Transactional
@RequiredArgsConstructor
public class JpaItemRepositoryV2 implements ItemRepository {

    private final SpringDataJpaItemRepository repository;

    @Override
    public Item save(Item item) {
        return repository.save(item);
    }

    @Override
    public void update(Long itemId, ItemUpdateDto updateParam) {
        Item findItem = repository.findById(itemId).orElseThrow();
        findItem.setItemName(updateParam.getItemName());
        findItem.setPrice(updateParam.getPrice());
        findItem.setQuantity(updateParam.getQuantity());
    }

    @Override
    public Optional<Item> findById(Long id) {
        return repository.findById(id);
    }

    @Override
    public List<Item> findAll(ItemSearchCond cond) {
        String itemName = cond.getItemName();
        Integer maxPrice = cond.getMaxPrice();

        if (StringUtils.hasText(itemName) && maxPrice != null) {
//            return repository
			.findByItemNameLikeAndPriceLessThanEqual("%" + itemName + "%", maxPrice);
            return repository.findItems("%" + itemName + "%", maxPrice);
        } else if (StringUtils.hasText(itemName)) {
            return repository.findByItemNameLike("%" + itemName + "%");
        } else if (maxPrice != null) {
            return repository.findByPriceLessThanEqual(maxPrice);
        } else {
            return repository.findAll();
        }
    }
}

의존관계와 구조

  • ItemServiceItemRepository에 의존하므로 ItemService에서 직접 SpringDataJpaItemRepository을 사용할 수 없음
  • 이를 해결하기 위해 JpaItemRepository2ItemRepositorySpringDataJpaItemRepository 사이를 맞추 기 위한 어댑터 처럼 사용함

findAll()

  • 모든 데이터조회
  • 이름 조회
  • 가격 조회
  • 이름 + 기격 조회
    @Override
    public List<Item> findAll(ItemSearchCond cond) {
        String itemName = cond.getItemName();
        Integer maxPrice = cond.getMaxPrice();

        if (StringUtils.hasText(itemName) && maxPrice != null) {
//            return repository
			.findByItemNameLikeAndPriceLessThanEqual("%" + itemName + "%", maxPrice);
            return repository.findItems("%" + itemName + "%", maxPrice);
        } else if (StringUtils.hasText(itemName)) {
            return repository.findByItemNameLike("%" + itemName + "%");
        } else if (maxPrice != null) {
            return repository.findByPriceLessThanEqual(maxPrice);
        } else {
            return repository.findAll();
        }
    }
}
  • like => % + itemName + % 이 부분을 주의하자
  • 그냥 itemName이름을 넣으면 x






출처:https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-db-2

profile
자바를 사랑합니다

0개의 댓글

관련 채용 정보