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
findAllByPrice
: 특정 가격에 대한 상품을 전부 찾습니다.OrderByName[Desc, Asc]
: 찾은 상품에 대해 name기준 정렬합니다. (내림차순, 오름차순)요청 URI: GET /api/products?name=모니터&price=1000
-> name, price를 AND 조건으로 만족하는 상품 리스트 반환
ProductController
ProductService
ProductRepository
이번 요구사항도 마찬가지로 메소드 명명으로 구현할 수 있습니다.
findAllBy
: 특정 기준에 해당하는 Product를 모두 찾습니다.
PriceAndName
: 상품 그리고
이름이 특정 기준에 해당합니다.
AND 연산이므로 상품가격과 이름을 모두 만족하는 상품만이 결과 리스트에 포함됩니다.
모니터
만 특징짓지 않고 매개인자를 통해 제외할 상품의 이름을 받아옵니다.고민했던 부분들은 Pull Request에 남겼습니다!
정성 가득한 리뷰와 조언 매우매우 감사합니다!😊