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에 넣어주겠습니다.
이전 과제를 진행하면서 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
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지]
본 포스트는 작성자가 공부한 내용을 바탕으로 작성한 글입니다.
잘못된 내용이 있을 시 언제든 댓글로 피드백 부탁드리겠습니다.
항상 정확한 내용을 포스팅하도록 노력하겠습니다.
'About Me > 인프런 워밍업 클럽' 카테고리의 다른 글
[인프런 워밍업 클럽 1기] BE 6일차 과제 (0) | 2024.05.13 |
---|---|
[인프런 워밍업 클럽 1기] BE 5일차 과제 (0) | 2024.05.09 |
[인프런 워밍업 클럽 1기] BE 4일차 과제 (0) | 2024.05.07 |
댓글