[인프런 워밍업 클럽 0기] BE 7일차 과제
9개월 전
문제1
JPA 적용하기
FruitRepository에 JpaRepository 상속및 함수 작성
public interface FruitRepository extends JpaRepository<Fruit, Long> {
boolean existsByName(String name);
@Query("SELECT new com.group.libraryapp.dto.fruit.response.FruitTotalPriceResponse(" +
"SUM(CASE WHEN f.isSale = true THEN f.price ELSE 0 END), " +
"SUM(CASE WHEN f.isSale = false THEN f.price ELSE 0 END)) " +
"FROM Fruit f WHERE f.name = :name GROUP BY f.isSale")
List<FruitTotalPriceResponse> getSum(String name);
}
Fruit 엔티티 작성
@Getter
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Entity
public class Fruit {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;
private String name;
private LocalDate warehousingDate;
private long price;
@Column(name = "is_sale")
private boolean isSale;
}
FruitService 수정
public void save(FruitRequest request) {
fruitRepository.save(new Fruit().builder()
.name(request.getName())
.warehousingDate(request.getWarehousingDate())
.price(request.getPrice())
.build());
}
public void stateUpdate(FruitRequest request) {
Fruit fruit = fruitRepository.findById(request.getId())
.orElseThrow(() -> new EntityNotFoundException("일치하는 과일 정보가 없습니다."));
fruit.builder()
.isSale(true)
.build();
}
public FruitTotalPriceResponse getSum(String name) {
boolean isFruitExist = fruitRepository.existsByName(name);
if (!isFruitExist) {
throw new IllegalStateException("일치하는 과일 정보가 없습니다.");
}
List<FruitTotalPriceResponse> sumResult = fruitRepository.getSum(name);
long salesAmount = 0;
long noSalesAmount = 0;
for (FruitTotalPriceResponse result : sumResult) {
salesAmount += result.getSalesAmount();
noSalesAmount += result.getNoSalesAmount();
}
return new FruitTotalPriceResponse(salesAmount, noSalesAmount);
}
문제 2
과일 이름을 받아 해당 과일 개수 반환하기
FruitController에 과일 이름을 받아 처리할 수 있도록 추가
@GetMapping("/count")
public ResponseEntity<?> getCount(@RequestParam String name) {
return ResponseEntity.ok(fruitService.getFruitCountByName(name));
}
FruitService 클래스에 controler에서 받은 이름으로 repository로 결과 받아 처리 로직 추가
public long getFruitCountByName(String name) {
return fruitRepository.getFruitCountByName(name);
}
FruitRepository에서 JPQL로 쿼리문으로 작성하여 결과값을 반환했다.
@Query("select count (f) from Fruit f where f.name = :name")
long getFruitCountByName(String name);
문제 3
아직 판매되지 않은 특정 과일 금액 이상 혹은 금액 이하 과일 목록 받아오기
응답을 주기위해 FruitResponse 만듭니다
@AllArgsConstructor
@NoArgsConstructor
@Data
public class FruitResponse {
private String name;
private long price;
private LocalDate warehousingDate;
}
FruitController에 옵션과 가격을 받아 서비스 계층으로 전달하여 판매되지 않은 결과값을 반환 할 수 있게 추가합니다.
@GetMapping("/list")
public ResponseEntity<List<FruitResponse>> getFruits(
@RequestParam String option, @RequestParam long price) {
List<FruitResponse> fruits = fruitService.getFruitsByPrice(option, price);
return ResponseEntity.ok(fruits);
}
FruitService에 옵션에 따라 금액을 이상으로 할지 이하로 할지 구분하여 해당 과일 리스트를 얻어 FruitResponse 리스트로 보냅니다.
public List<FruitResponse> getFruitsByPrice(String option, long price) {
List<Fruit> fruits;
if (option.equals("GET")) {
fruits = fruitRepository.findByPriceGreaterThanEqualAndIsSaleFalse(price);
} else if (option.equals("LTE")) {
fruits = fruitRepository.findByPriceLessThanEqualAndIsSaleFalse(price);
}else throw new IllegalStateException("일치하는 옵션이 없습니다.");
return fruits.stream()
.map(Fruit::toDto)
.collect(Collectors.toList());
}
fruitRepository에 나오는 값은 Fruit 클래스이므로 FruitResponse 변환을 위해 Fruit클래스에 toDto메서드를 만듭니다.
public FruitResponse toDto() {
return new FruitResponse(name, price, warehousingDate);
}
FruitRepository에 금액 이상 혹은 이하 에 판매하지 않은 과일 목록을 구하기 위해 메서드를 추가합니다.
List<Fruit> findByPriceGreaterThanEqualAndIsSaleFalse(long price);
List<Fruit> findByPriceLessThanEqualAndIsSaleFalse(long price);
응답 결과
댓글을 작성해보세요.