About Me/인프런 워밍업 클럽

[인프런 워밍업 클럽 1기] BE 7일차 과제

블로그 주인장 2024. 5. 15.

BE 7일차 과제

인프런 워밍업 클럽 1기 BE 7일차 과제를 구현해보겠습니다.

 

문제 1

이전 차수에 JDBCTemplate 구현했던 기능들을 JPA로 구현해보겠습니다.

https://miiro-under.tistory.com/307

 

[인프런 워밍업 클럽 1기] BE 6일차 과제

BE 6일차 과제인프런 워밍업 클럽 1기 BE 6일차 과제를 구현해보겠습니다.기존에 작성했던 Controller 코드를 레이어별로 3단 분리를 해보겠습니다. 기존 코드@RestControllerpublic class FruitController { privat

miiro-under.tistory.com

 

 

Entity 클래스 구현

Spring Data JPA를 사용하기 위해서 Entity 클래스를 구현하겠습니다.

@Entity
public class Fruit {

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

  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 String getName() {
    return name;
  }

  public LocalDate getWarehousingDate() {
    return warehousingDate;
  }

  public Long getPrice() {
    return price;
  }

  public boolean isSold() {
    return isSold;
  }

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

}

 

Repository 클래스 구현

JpaRepository를 상속받는 인터페이스 구현체를 생성합니다.

public interface FruitRepository extends JpaRepository<Fruit, Long> {

  Optional<Fruit> findByName(String name);

  List<Fruit> findAllByName(String name);
}

 

Service 클래스 구현

기존에 JPA를 활용한 클래스 구현 시에는 V2를 붙여서 기존 JDBCTemplate과 비교할 수 있도록 생성합니다.

@Service
public class FruitServiceV2 {

  private final FruitRepository fruitRepository;

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

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

  public void updateFruit(FruitRequest request) {
    Fruit fruit = fruitRepository.findByName(request.getName())
        .orElseThrow(IllegalArgumentException::new);

    fruit.updateSoldStatus();
    fruitRepository.save(fruit);
  }


  public FruitStatResponse statResponse(String name) {
    List<Fruit> fruits = fruitRepository.findAllByName(name);
    if (fruits.isEmpty()) {
      throw new IllegalArgumentException("해당 과일을 찾을 수 없습니다.");
    }

    long sales = fruits.stream()
        .filter(Fruit::isSold)
        .mapToLong(Fruit::getPrice)
        .sum();

    long notSales = fruits.stream()
        .filter(f -> !f.isSold())
        .mapToLong(Fruit::getPrice)
        .sum();

    return new FruitStatResponse(sales, notSales);
  }

}

 

문제 2

 

예시에서 정해준 데이터를 통해 응답을 도출해야하기 때문에 해당 데이터를 DB에 넣어주겠습니다.

H2 DataBase

 

이전 과제를 진행하면서 MySQL -> H2 DB로 변경했기 때문에 H2 DB를 활용해서 구성해줍니다.

 

 

Response Dto

public class FruitCountResponse {

  private Long count;

  public FruitCountResponse(Long count) {
    this.count = count;
  }

  public Long getCount() {
    return count;
  }

}

 

Repository 클래스

public interface FruitRepository extends JpaRepository<Fruit, Long> {
  long countByName(String name);
}

Service 클래스

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

Controller 클래스

@RestController
public class FruitControllerV2 {

  private final FruitServiceV2 fruitServiceV2;

  public FruitControllerV2(FruitServiceV2 fruitServiceV2) {
    this.fruitServiceV2 = fruitServiceV2;
  }

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

}

 

응답 결과 By PostMan

 

 

문제 3

 

Response Dto 생성

public class FruitInfoResponse {

  private String name;

  private Long price;

  private LocalDate warehousingDate;

  //생성자, Getter 생략
  
}

 

Repository 클래스

public interface FruitRepository extends JpaRepository<Fruit, Long> {
  List<Fruit> findAllByPriceLessThanEqual(Long price);

  List<Fruit> findAllByPriceGreaterThanEqual(Long price);
}

Service 클래스

public List<FruitInfoResponse> getFruits(String option, Long price) {
  List<Fruit> fruits;

  if ("GTE".equals(option)) {
    fruits = fruitRepository.findAllByPriceGreaterThanEqual(price);
  } else if ("LTE".equals(option)) {
    fruits = fruitRepository.findAllByPriceLessThanEqual(price);
  } else {
    throw new IllegalArgumentException("해당 과일을 찾을 수 없습니다.");
  }

  return fruits.stream()
      .filter(f -> !f.isSold())
      .map(f -> new FruitInfoResponse(f.getName(), f.getPrice(), f.getWarehousingDate()))
      .collect(Collectors.toList());
}

Controller 클래스

@RestController
public class FruitControllerV2 {

  @GetMapping("/api/v1/fruit/list")
  public List<FruitInfoResponse> getFruits(@RequestParam String option, @RequestParam Long price) {
    return fruitServiceV2.getFruits(option, price);
  }

}

 

응답 결과 By PostMan

 

 

Reference

자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]

 

 

본 포스트는 작성자가 공부한 내용을 바탕으로 작성한 글입니다.
잘못된 내용이 있을 시 언제든 댓글로 피드백 부탁드리겠습니다.
항상 정확한 내용을 포스팅하도록 노력하겠습니다.

반응형

댓글