우리는 JPA라는 개념을 배우고 유저 테이블에 JPA를 적용해 보았습니다. 몇 가지 문제를 통해 JPA를 연습해 봅시다! 🔥
@Entity
public class Fruit {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id = null;
@Column(nullable = false, length=25)
private String name;
@Column(nullable = false)
private LocalDate warehousingDate;
@Column(nullable = false)
private long price;
@Column(nullable = false, columnDefinition = "boolean default false")
private boolean purchase;
public Fruit(String name, LocalDate warehousingDate, long price) {
this.name = name;
this.warehousingDate = warehousingDate;
this.price = price;
}
public Fruit() {}
public void updatePerchaseStatus() {
this.purchase = true;
}
public long getId() {
return id;
}
public String getName() {
return name;
}
public LocalDate getWarehousingDate() {
return warehousingDate;
}
public long getPrice() {
return price;
}
public boolean isPurchase() {
return purchase;
}
@Service
public class FruitServerV2 {
private final FruitRepository fruitRepository;
public FruitServerV2(FruitRepository fruitRepository) {
this.fruitRepository = fruitRepository;
}
public void saveFruit(FruitCreateRequest request){
Fruit fruit = fruitRepository.save(new Fruit(request.getName(), request.getWarehousingDate(), request.getPrice()));
}
public void updateFruit(FruitUpdateRequest request){
Fruit fruit = fruitRepository.findById(request.getId())
.orElseThrow(IllegalArgumentException::new);
}
public FruitResponse getFruitStatus(String name){
Fruit fruit = fruitRepository.findByName(name)
.orElseThrow(IllegalArgumentException::new);
long salesAmount = fruitRepository.findAllByNameAndPurchase(name, true).stream().mapToLong(Fruit::getPrice).sum();
long notSalesAmount = fruitRepository.findAllByNameAndPurchase(name, false).stream().mapToLong(Fruit::getPrice).sum();
return new FruitResponse(salesAmount, notSalesAmount);
}
}
public interface FruitRepository extends JpaRepository<Fruit, Long> {
Optional<Fruit> findByName(String name);
List<Fruit> findAllByNameAndPurchase(String name, boolean purchase);
}
@GetMapping("/api/v1/fruit/count")
public FruitCountResponse getCountByName(@RequestParam String name) {
return fruitServiceV2.getCountByName(name);
}
public FruitCountResponse getCountByName(String name){
long count = fruitRepository.countByName(name);
return new FruitCountResponse(count);
}