[스터디] Spring Data JPA(6회차)

이호석·2023년 3월 25일
0

[스터디] Spring Boot

목록 보기
5/7
post-thumbnail

😁 배운 내용

Spring Data JPA에서 메소드 명명 규칙에 대해 좀 더 자세히 공부할 수 있었습니다.

또한 Controller에서 작성한 api에 대한 테스트를 작성하여 테스트 커버리지를 88%까지 증가시키며
확실한 테스트 코드를 통해 새로운 로직 작성이나 기존 로직에 대한 테스트 시 빠른 피드백을 받을 수 있어 편리함을 느꼈습니다.

BDD 방식은 공부 중이라 적용해보지 못했습니다.🥲



✏️ 미션 제출

미션 전체 코드는 다음 PR에서 살펴볼 수 있습니다.
[이호석] DAY6 Spring Data JPA(완료)

✅ 상품 상세조회 구현하기

요청 URI: GET /api/products?id=1

  • ProductController

    id값을 받아와 서비스에게 해당 id값에 맞는 상품을 찾도록 합니다.


  • ProductService

    이전 서비스 코드와 동일하지만, productRepository가 메모리 db가 아닌 JPA를 사용합니다.


  • ProductRepository

    findById(..)와 같은 기본키 매핑은 기본적으로 Jpa 인터페이스에서 제공해주므로 해당 메소드를 사용합니다.



✅ 이름으로 상품 상세조회 구현하기

요청 URI: GET /api/products?name=모니터
Controller, Service 코드는 기존 메모리 DB를 사용할 때와 큰 변화는 없었습니다.

  • ProductRepository

    Spring Data JPA는 명명 규칙을 지키면서 인터페이스 메소드를 선언만 하면 실행할 때 프록시 객체를 통해 실제 구현 메소드가 만들어집니다. 단, 검색 조건들은 해당 Repository에 매핑된 도메인 객체의 필드 값을 이용해야 합니다.



✅ 요구사항 만족하는 상품 조회 메소드 구현하기

가격 조회시 이름 기준 내림차순 조회

요청 URI: GET /api/products?price=1000 -> 1000원 가격에 해당되는 모든 상품을 이름 기준 내림차순 정렬하여 반환

  • ProductController

  • ProductService

  • ProductRepository
    위 요구사항의 경우 Spring Data JPA에서 제공하는 메소드 명명 규칙으로 해결할 수 있습니다.
    findAllByPrice: 특정 가격에 대한 상품을 전부 찾습니다.
    OrderByName[Desc, Asc]: 찾은 상품에 대해 name기준 정렬합니다. (내림차순, 오름차순)
    동일한 가격에 여러 상품이 존재할 수 있으므로 List 타입이 반환됩니다.

name, price값을 모두 만족하는 상품 리스트 조회

요청 URI: GET /api/products?name=모니터&price=1000 -> name, price를 AND 조건으로 만족하는 상품 리스트 반환

  • ProductController

  • ProductService

  • ProductRepository

    이번 요구사항도 마찬가지로 메소드 명명으로 구현할 수 있습니다.
    findAllBy: 특정 기준에 해당하는 Product를 모두 찾습니다.
    PriceAndName: 상품 그리고 이름이 특정 기준에 해당합니다.
    AND 연산이므로 상품가격과 이름을 모두 만족하는 상품만이 결과 리스트에 포함됩니다.


JPQL 사용

  • 전체 상품을 조회하는데, name이 모니터인 상품은 무시

    모니터만 특징짓지 않고 매개인자를 통해 제외할 상품의 이름을 받아옵니다.
    연산은 != 연산으로 생각하면 됩니다. @Query에 변수를 대입할 때는 :[변수명]으로 사용됩니다.

  • 가장 가격이 비싼 상품 조회하기

    WHERE 절에서 서브쿼리를 통해 가장 비싼 상품을 조회할 수 있습니다. 동일한 가격의 상품이 존재할 수 있으므로 List 타입으로 반환합니다.

  • 이름에 “컴”을 포함하는 상품 조회하기

    like연산은 문자열 비교 시에 사용되며 컴뿐만 아니라 특정 문자열 포맷을 직접 지정할 수 있도록 매개인자를 통해 포함할 문자열을 받아옵니다.

  • 가장 가격이 저렴한 상품의 ‘이름만’ 조회하기

    이름만을 조회하므로 SELECT 문에서 p.name으로 이름을 특징짓습니다. 나머지는 가장 비싼 가격의 상품을 조회할 때와 동일합니다.

  • 상품 가격의 평균 구하기

    avg(p.price)를 통해 모든 상품의 가격에 대해 avg() 함수가 평균을 구합니다.



🤔 개선 및 고민되는 부분들

고민했던 부분들은 Pull Request에 남겼습니다!

정성 가득한 리뷰와 조언 매우매우 감사합니다!😊

profile
꾸준함이 주는 변화를 믿습니다.

0개의 댓글