<aside> 📌 우리는 JPA라는 개념을 배우고 유저 테이블에 JPA를 적용해 보았습니다. 몇 가지 문제를 통해 JPA를 연습해 봅시다! 🔥
</aside>


FruitEntity
@Entity(name = "fruit")
public class FruitEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String name;
@Column(nullable = false)
private LocalDate warehousingDate;
@Column(nullable = false)
private long price;
@Column(nullable = false)
private boolean isSold;
protected FruitEntity() {}
public FruitEntity(String name, LocalDate warehousingDate, long price) {
this.name = name;
this.warehousingDate = warehousingDate;
this.price = price;
this.isSold = false;
}
public void updateSoldState() {
this.isSold = true;
}
...
}
FruitRepository
public interface FruitRepository extends JpaRepository<FruitEntity, Long> {
List<FruitEntity> findByName(String name);
}
FruitService
@Service
public class FruitService {
private final FruitRepository fruitRepository;
public FruitService(FruitRepository fruitRepository) {
this.fruitRepository = fruitRepository;
}
public void saveFruit(FruitCreateRequest request) {
FruitEntity fruit = new FruitEntity(request.getName(), request.getWarehousingDate(), request.getPrice());
fruitRepository.save(fruit);
}
public void updateFruit(FruitUpdateRequest request) {
FruitEntity fruit = fruitRepository.findById(request.getId())
.orElseThrow(IllegalArgumentException::new);
fruit.updateSoldState();
fruitRepository.save(fruit);
}
public FruitAmountResponse calculateAmountFruit(String name) {
List<FruitEntity> fruits = fruitRepository.findByName(name);
long salesAmount = fruits.stream()
.filter(FruitEntity::isSold)
.mapToLong(FruitEntity::getPrice)
.sum();
long notSalesAmount = fruits.stream()
.filter(fruit -> !fruit.isSold())
.mapToLong(FruitEntity::getPrice)
.sum();
return new FruitAmountResponse(salesAmount, notSalesAmount);
}
}
FruitController
@GetMapping("/api/v1/fruit/count")
public FruitCountResponse getFruitCount(@RequestParam String name) {
return fruitService.getFruitCount(name);
}
FruitCountResponse
public class FruitCountResponse {
private long count;
public FruitCountResponse(long count) {
this.count = count;
}
public long getCount() {
return count;
}
}
FruitService
public FruitCountResponse getFruitCount(String name) {
return new FruitCountResponse(fruitRepository.countAllByName(name));
}
FruitRepository
public interface FruitRepository extends JpaRepository<FruitEntity, Long> {
List<FruitEntity> findByName(String name);
long countAllByName(String name);
}
결과
