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

imageFruit)

import javax.persistence.*;
import java.time.LocalDate;

@Entity
public class Fruit {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(length = 30)
    private String name;
    private LocalDate warehousingDate;
    private long price;
    private boolean isSold;

    protected Fruit(){}

    public Fruit(String name, LocalDate warehousingDate, long price) {
        this.name = name;
        this.warehousingDate = warehousingDate;
        this.price = price;
        this.isSold = false;
    }

    public Long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public LocalDate getWarehousingDate() {
        return warehousingDate;
    }

    public long getPrice() {
        return price;
    }

    public boolean isSold() {
        return isSold;
    }

    public void setSold(boolean sold) {
        isSold = sold;
    }
}

primary key인 id 설정을 해주었으며, Entity로 사용하기 위해 빈 생성자를 만들어 주었다.

 

image

Fruit 테이블 상태)

image

요청을 위한 FruitController 메소드)

    @GetMapping("/api/v1/fruit/count")
    public CountResponse countFruit(@RequestParam String name) {
        return fruitService.countFruit(name);
    }

FruitService 메소드)

@Service
public class FruitService {

    private final FruitRepository fruitRepository;
    private final FruitJpaRepository jpaRepository;

    public FruitService(FruitRepository fruitRepository, FruitJpaRepository jpaRepository) {
        this.fruitRepository = fruitRepository;
        this.jpaRepository = jpaRepository;
    }

    public CountResponse countFruit(String name) {
        List<Fruit> fruits = jpaRepository.findAllByName(name);

        return new CountResponse(fruits.size());
    }
}

기존 FruitService에서 변경점이 생겼다. JpaRepository사용을 위해 FruitJpaRepository 인터페이스를 생성자로 받아줬으며, 인터페이스의 메소드를 정의 후 사용하였다.

결과)

image정상적으로 나오는걸 확인할 수 있었다.

image

문제를 확인했을 때, 스프링 데이터 JPA의 쿼리문을 이용하여 메소드명을 작성해야 할 것으로 생각하였다. 또한 응답 body의 형태는 List의 형태를 취했으며 List<FruitResponse>를 사용하였다.

컨트롤러)

    @GetMapping("/api/v1/fruit/list")
    public List<FruitResponse> notSoldFruitList(FruitOptionRequest request) {
        return fruitService.notSoldFruitList(request);
    }

서비스)

    public List<FruitResponse> notSoldFruitList(FruitOptionRequest request) {
        return getFruits(request).stream()
                .map(FruitResponse::new)
                .collect(Collectors.toList());
    }

    private List<Fruit> getFruits(FruitOptionRequest request) {
        if (request.getOption().equals("GTE")) {
            System.out.println("hi");
            return jpaRepository.findAllByPriceGreaterThanEqualAndIsSoldFalse(request.getPrice());
        } else {
            return jpaRepository.findAllByPriceLessThanEqualAndIsSoldFalse(request.getPrice());
        }
    }

request option으로 넘어온 데이터를 확인하기 위한 메소드를 만들어 작성하였다. 그 결과로 주 목적인 notSoldFruitList의 코드는 간결해졌으며, 서비스 계층에서 중요한 역할인 비즈니스를 만을 위한 코드를 작성 해주었다.

 

FruitJpaRepository)

import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface FruitJpaRepository extends JpaRepository<Fruit, Long> {

    List<Fruit> findAllByName(String name);

    List<Fruit> findAllByPriceGreaterThanEqualAndIsSoldFalse(Long price);

    List<Fruit> findAllByPriceLessThanEqualAndIsSoldFalse(Long price);
}

이상을 위한 GreatherThanEqual, 이하를 위한 LessThanEqual을 사용해주었으며, IsSold의 boolean 값 체크를 위해 False를 이어주었다.

결과)

imageimageGTE, LTE 모두 정상적인 값을 출력하였다.

댓글을 작성해보세요.