[인프런 워밍업 클럽 0기] BE 7일차 과제

[인프런 워밍업 클럽 0기] BE 7일차 과제

문제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

과일 이름을 받아 해당 과일 개수 반환하기

imageFruitController에 과일 이름을 받아 처리할 수 있도록 추가

@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);

 

image

문제 3

아직 판매되지 않은 특정 과일 금액 이상 혹은 금액 이하 과일 목록 받아오기

 

image응답을 주기위해 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);

응답 결과

imageimage

댓글을 작성해보세요.

채널톡 아이콘