반응형
강의 출처
진도표 7일차와 연결됩니다
우리는 JPA라는 개념을 배우고 유저 테이블에 JPA를 적용해 보았습니다. 몇 가지 문제를 통해 JPA를 연습해 봅시다! 🔥
문제 1
과제 #6 에서 만들었던 Fruit 기능들을 JPA를 이용하도록 변경해보세요!
Fruit 클래스 변경
@Entity
public class Fruit {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, length = 25)
private String name;
private long price;
private LocalDate warehousingDate;
@ColumnDefault("0")
private int salesYN;
protected Fruit() {
}
public Fruit(long id, String name, long price, LocalDate warehousingDate) {
this.id = id;
this.name = name;
this.price = price;
this.warehousingDate = warehousingDate;
}
public Fruit(long id, String name, long price, LocalDate warehousingDate, int salesYN) {
this.id = id;
this.name = name;
this.price = price;
this.warehousingDate = warehousingDate;
this.salesYN = salesYN;
}
public long getId() {
return id;
}
public String getName() {
return name;
}
public long getPrice() {
return price;
}
public LocalDate getWarehousingDate() {
return warehousingDate;
}
public int getSalesYN() {
return salesYN;
}
public void setSalesYN() {
this.salesYN = 1;
}
}
FruitRepository 생성
public interface FruitRepository extends JpaRepository<Fruit, Long> {
List<Fruit> findAllByNameAndSalesYN(String name, int salesYn);
}
FruitService 수정
@Service
public class FruitService {
private final FruitRepository fruitRepository;
public FruitService(FruitRepository fruitRepository) {
this.fruitRepository = fruitRepository;
}
public void save(FruitSaveRequest request) {
fruitRepository.save(new Fruit(request.getName(), request.getPrice(), request.getWarehousingDate()));
}
public void update(long id) {
Fruit fruit = fruitRepository.findById(id)
.orElseThrow(IllegalArgumentException::new);
fruit.setSalesYN();
fruitRepository.save(fruit);
}
public FruitStatResponse fruitStat(String name) {
List<Fruit> salesList = fruitRepository.findAllByNameAndSalesYN(name, 1);
List<Fruit> notSalesList = fruitRepository.findAllByNameAndSalesYN(name, 0);
long salesAmount = 0;
long notSalesAmount = 0;
for (Fruit fruit : salesList) {
salesAmount += fruit.getPrice();
}
for(Fruit fruit : notSalesList) {
notSalesAmount += fruit.getPrice();
}
return new FruitStatResponse(salesAmount, notSalesAmount);
}
}
문제 2
우리는 특정 과일을 기준으로 지금까지 우리 가게를 거쳐갔던 과일 개수를 세고 싶습니다.
<문제 1>에서 만들었던 과일 Entity Class를 이용해 기능을 만들어 보세요!
예를 들어
1. (1, 사과, 3000원, 판매 O)
2. (2, 바나나, 4000원, 판매 X)
3. (3, 사과, 3000원, 판매 O)
와 같은 세 데이터가 있고, 사과를 기준으로 과일 개수를 센다면, 우리의 API는 2를 반환할 것입니다.
Controller
@GetMapping("/count")
public FruitCountResponse getCount(@RequestParam String name) {
return fruitService.getCount(name);
}
DTO
public class FruitCountResponse {
private long count;
public FruitCountResponse() {}
public FruitCountResponse(long count) {
this.count = count;
}
public long getCount() {
return count;
}
}
Service
public FruitCountResponse getCount(String name) {
return new FruitCountResponse(fruitRepository.countByName(name));
}
Repository
int countByName(String name);
포스트맨 테스트
문제 3
우리는 아직 판매되지 않은 특정 금액 이상 혹은 특정 금액 이하의 과일 목록을 받아보고 싶습니다.
구체적인 스펙은 다음과 같습니다.
DTO
public class FruitListResponse {
private String name;
private long price;
private LocalDate warehousingDate;
public FruitListResponse(String name, long price, LocalDate warehousingDate) {
this.name = name;
this.price = price;
this.warehousingDate = warehousingDate;
}
public String getName() {
return name;
}
public long getPrice() {
return price;
}
public LocalDate getWarehousingDate() {
return warehousingDate;
}
}
Controller
@GetMapping("list")
public List<FruitListResponse> getList(@RequestParam String option, @RequestParam long price) {
return fruitService.getList(option, price);
}
Service
public List<FruitListResponse> getList(String option, long price) {
Optional<List<FruitListResponse>> list;
if(option.equals("GTE")) {
list = fruitRepository.findAllByPriceGreaterThanEqual(price);
}
else {
list = fruitRepository.findAllByPriceLessThanEqual(price);
}
return list.orElseThrow(IllegalArgumentException::new);
}
Repository
Optional<List<FruitListResponse>> findAllByPriceGreaterThanEqual(long price);
Optional<List<FruitListResponse>> findAllByPriceLessThanEqual(long price);
포스트맨 테스트
반응형