본문 바로가기

Spring

[인프런 워밍업 클럽] BE 6번째 과제 - Controller - Service - Repository로 분리하기

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)

 

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

Java와 Spring Boot, JPA, MySQL, AWS를 이용해 서버를 개발하고 배포합니다. 웹 애플리케이션을 개발하며 서버 개발에 필요한 배경지식과 이론, 다양한 기술들을 모두 학습할 뿐 아니라, 다양한 옵션들

www.inflearn.com

 

728x90