[인프런 워밍업 클럽] BE 0기 7일차 과제
2024.02.27
Fruit)
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로 사용하기 위해 빈 생성자를 만들어 주었다.
Fruit 테이블 상태)
요청을 위한 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 인터페이스를 생성자로 받아줬으며, 인터페이스의 메소드를 정의 후 사용하였다.
결과)
정상적으로 나오는걸 확인할 수 있었다.
문제를 확인했을 때, 스프링 데이터 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를 이어주었다.
결과)
GTE, LTE 모두 정상적인 값을 출력하였다.
댓글을 작성해보세요.