728x90
4번째 과제에서 만들었던 API를 Controller - Service - Reposiroty로 분리해보는 과제!
코드를 어떻게 작성했었는지는 아래의 링크에서 확인할 수 있다.
과제 4 : https://yestruly.tistory.com/89
🔑문제 1
🔑코드
- Controller
public class FruitController {
private final FruitService fruitService;
public FruitController(FruitService fruitService) {
this.fruitService = fruitService;
}
@PostMapping("")
public void registerFruit(@RequestBody FruitRequest request) {
fruitService.registerFruit(request);
}
- Service
@Service
public class FruitService {
private final FruitRepository fruitRepository;
public FruitService(FruitRepository fruitRepository) {
this.fruitRepository = fruitRepository;
}
- Repository
@Repository
public class FruitRepository {
private final JdbcTemplate jdbcTemplate;
public FruitRepository(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public void registerFruit(String name, LocalDate warehousingDate, long price){
String sql = "INSERT INTO fruit(name, warehousingDate, price) VALUES (?,?,?)";
jdbcTemplate.update(sql, name,warehousingDate, price);
}
- Postman테스트와 데이터베이스 저장 결과
분리한 코드로도 작동이 잘 되는걸 확인할 수 있었다!
🔑문제 2
🔑코드
- Controller
@PutMapping("")
public void updateFruit(@RequestBody FruitUpdateRequest request) {
fruitService.updateFruit(request);
}
- Sevice
public void updateFruit(FruitUpdateRequest request) {
if(fruitRepository.isFruitNotExist(request.getId())){
throw new IllegalArgumentException();
}
fruitRepository.updateFruit(request.getId());
}
- Repository
public boolean isFruitNotExist(long id){
String sql = "SELECT * FROM fruit WHERE id = ?";
return jdbcTemplate.query(sql, (rs, rowNum) ->
0, id).isEmpty();
}
public void updateFruit(long id) {
String updateSql = "UPDATE fruit SET isSell = ? WHERE id = ?";
jdbcTemplate.update(updateSql, true, id);
}
- PostMan 테스트 결과와 데이터 베이스 저장 결과
id가 7인 사과만 isSell이 1로 바뀐 것을 확인할 수 있다.
🔑문제 3
🔑코드
- Controller
@GetMapping("/stat")
public FruitPriceResponse getFruitSellPrice(@RequestParam String name) {
return fruitService.getFruitSellPrice(name);
}
- Service
public FruitPriceResponse getFruitSellPrice(String name) {
return fruitRepository.getFruitSellPrice(name);
}
- Repository
public FruitPriceResponse getFruitSellPrice(String name){
String sql = "SELECT "
+ "SUM(CASE WHEN isSell = true THEN price ELSE 0 END) AS salesAmount, \n"
+ "SUM(CASE WHEN isSell = false THEN price ELSE 0 END) AS notSalesAmount \n"
+ "FROM fruit \n"
+ "WHERE name = ?";
return jdbcTemplate.queryForObject(sql, (rs, rowNum) -> {
long salesAmount = rs.getLong("salesAmount");
long notSalesAmount = rs.getLong("notSalesAmount");
return new FruitPriceResponse(salesAmount, notSalesAmount);
}, name);
}
- PostMan 테스트 결과
결과가 잘 반환된 것을 확인할 수 있다.
확실히 분리하기 전보다 분리하고난 코드가 훨씬 깔끔하고 가독성있다고 느껴진다. 또, 이 클래스가 어떤 역할을 수행하는지도 좀 더 명확하게 드러나는 것 같다.
자바와 스프링 부트로 생애 최초 서버 만들기, 누구나 쉽게 개발부터 배포까지! [서버 개발 올인원 패키지] 강의 - 인프런 (inflearn.com)
728x90
'Spring' 카테고리의 다른 글
[인프런 워밍업 클럽] BE - 2주차 회고록 (0) | 2024.03.03 |
---|---|
[인프런 워밍업 클럽] 7번째 과제 - JPA 사용하기 (0) | 2024.02.27 |
[인프런 워밍업 클럽] BE - 1주차 회고록 (0) | 2024.02.25 |
[인프런 워밍업 클럽] BE 5번째 과제 - 클린 코드 (0) | 2024.02.23 |
[인프런 워밍업 클럽] BE 4번째 과제 - POST, GET, PUT API 만들기 (0) | 2024.02.22 |