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

문제 1

과제 #6에서 만들었던 Fruit 기능들을 JPA를 이용하도록 변경해보세요!

코드 구현

Fruit.java

@Entity
public class Fruit {

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

    @Getter
    @Column(nullable = false)
    private String name;

    @Getter
    @Column(name = "warehousing_date", nullable = false)
    private LocalDate warehousingDate;

    @Getter
    @Column(nullable = false)
    private long price;

    @Column(nullable = false)
    private boolean isSold;

    public Fruit() {
    }

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

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

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

    public boolean isSold() {
        return isSold;
    }

    public void updateFruitInfo() {
        this.isSold = true;
    }
}

application.yml

jpa:
    hibernate:
      ddl-auto: none
    properties:
      hibernate:
        show_sql: true
        format_sql: true
        dialect: org.hibernate.dialect.MySQL8Dialect

FruitService.java

@Service
public class FruitService {

    private final FruitRepository fruitRepository;

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

    public void saveFruitInfo(SaveFruitInfoRequest request) {
        fruitRepository.save(new Fruit(request.getName(), request.getWarehousingDate(), request.getPrice()));
    }

    public void updateFruitInfo(UpdateFruitInfoRequest request) {
        Fruit fruit = fruitRepository.findById(request.getId()).orElseThrow(IllegalArgumentException::new);
        fruit.updateFruitInfo();
        fruitRepository.save(fruit);
    }

    public GetFruitInfoResponse getFruitSalesAmountInfo(String name) {
        long salesAmount = fruitRepository.salesAmount(name);
        long notSalesAmount = fruitRepository.notSalesAmount(name);

        return new GetFruitInfoResponse(salesAmount, notSalesAmount);
    }
}

FruitController.java

@RestController
@RequestMapping("/api/v1/fruit")
public class FruitController {

    private final FruitService fruitService;

    public FruitController(FruitService fruitService) {
        this.fruitService = fruitService;
    }

    @PostMapping
    public void saveFruitInfo(@RequestBody SaveFruitInfoRequest request) {
        fruitService.saveFruitInfo(request);
    }

    @PutMapping
    public void updateFruitInfo(@RequestBody UpdateFruitInfoRequest request) {
        fruitService.updateFruitInfo(request);
    }

    @GetMapping("/stat")
    public GetFruitInfoResponse getFruitInfo(@RequestParam String name) {
        return fruitService.getFruitSalesAmountInfo(name);
    }
}

문제 2

우리는 특정 과일을 기준으로 지금까지 우리 가게를 거쳐갔던 과일 개수를 세고 싶습니다. <문제 1>에서 만들었던 과일 Entity Class를 이용해 기능을 만들어 보세요!

예를 들어

  1. (1, 사과, 3000원, 판매 O)
  2. (2, 바나나, 4000원, 판매 X)
  3. (3, 사과, 3000원, 판매 O)