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

Untitled

Untitled

문제1

Fruit

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

FruitServiceV2

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

FruitRepository

public interface FruitRepository extends JpaRepository<Fruit, Long> {
    Optional<Fruit> findByName(String name);
    List<Fruit> findAllByNameAndPurchase(String name, boolean purchase);
}

문제2

FruitController

@GetMapping("/api/v1/fruit/count")
    public FruitCountResponse getCountByName(@RequestParam String name) {
        return fruitServiceV2.getCountByName(name);
    }

FruitServiceV2

public FruitCountResponse getCountByName(String name){
        long count = fruitRepository.countByName(name);
        return new FruitCountResponse(count);
    }