Gom3rye

스프링부트] POJO 상품 등록 기능 구현하기 본문

웹 개발

스프링부트] POJO 상품 등록 기능 구현하기

Gom3rye 2023. 6. 20. 13:33
  1. 상품 등록 테스트 케이스 만들기
    1. @Test
      void 상품등록() 테스트 케이스 만들기
    2. 거기서 productService.addProduct(request); 로 상품 등록을 해주기
      productService는 addProduct라는 메서드에서 AddProductRequest를 전달받아서 상품을 등록하는 기능을 개발하는 것
    3. 따라서 final AddProductRequest request; 로 변수 선언 해주고 클래스가 없으니까 private class AddProductRequest{} 를 만들어주기
    4. final AddProductRequest request = new AddProductRequest("상품명", 1000, DiscountPolicy.NONE); 으로 초기화를 해주고 이때 필요한 DiscountPolicy는 private enum으로 만들어준다.
    5. 이때 상품명, 1000, discountPolicy 같은 경우는 name, price, discountPolicy로 바꾸고 final String name = "상품명", final DiscountPolicy discountPolicy = DiscountPolicy.NONE; 으로 바꿔주고 생성자가 없으니 Option+Enter로 Create constructor를 눌러서 생성해준다.
    6. 이때 validation check를 위해 Assert.hasText(name, "상품명은 필수입니다."); Assert.isTrue(price>0, "상품 가격은 0보다 커야 합니다."); Assert.notNull(discountPolicy, "할인 정책은 필수입니다."); 를 넣어준다.
    7. 그리고 Option+Enter를 눌러서 parameter binding을 해준다.  
    8. AddProductRequest 클래스를 private record AddProductRequest 로 record 타입으로 변경해준다.
    9. productService와 addProduct가 없으니까 만들어준다.
    10. void setUp() 으로 productService = new ProductService(); 로 초기화해준다.
    11. 테스트 돌려보면 addProduct 구현하지 않아서 fail뜰 것
    12. public void addProduct(final AddProductRequest requset) { new Product(request.name(), request.price(), request.discountPolicy()) } 로 생성을 해주고 Option+Enter 눌러서 product를 저장해준다. (productPort.save(product); 로)
    13. But product가 없으니까 만들어주고 생성자도 만들어준다. (private class Product {})
    14. parameter binding 해주고 validation check 해주고
    15. productPort도 없으니까 만들어주기
      => 이렇게 만들어주면 좋은 점 : addProduct를 하기 위해 필요한 기능들만 만들어줄 수 있다.
      => interface로 만들고 구현은 어댑터에서 하겠다. (private interface ProductPort { public void save(final Product product) };
      => private final ProductPort productport; 로 final을 넣어서 생성자를 주입받게 해주고 productPort는 필드로 만들어준다.
    16. 그리고 save를 구현해주는데 이게 어댑터가 될 것이다. 그러면 여기서 productRepository가 메모리에 product를 저장을 하겠다. ( @Override public void save(final Product product) { productRepository.save(product); )
    17. ProductRepository는 메모리에 저장을 하는 거니까 우선은 class로 만들어준다.
    18. 그 안에 product.assignId(++sequence);로 아이디를 저장해주고 product.getId()와 product를 받아서 저장소에 넣어준다. (persistence.put(product.getId(), product))
      * 이때 sequence는 private Long sequence = 0L; 로 만들어주고 초기화 해준다.
      * persistence는 private Map<Long, Product> persistence = new HashMap<>(); 으로 만들어주고 초기화 해준다.
    19. product에 없는 함수 만들어주기
      Ex) assignId, Getter
    20. Repository도 생성자로 주입을 받도록 한다. (final 사용)
      => productService에 addProduct라는 요청을 보내면 productService에서 product를 생성해서 productPort에게 저장을 하라고 시킨다. 그럼 그 productPort의 구현체인 어댑터에서 이걸 메모리로 저장을 하는 것이다.
      (이후에 JPA를 사용하게 되면 어댑터에서 JPA Repository로 변경을 하면 된다.)
    21. 클래스들을 다 Inner 클래스로 만들었으니까 DiscountPolicy부터 Product, ProductPort, ProductRepository, ProductAdapter, ProductService도 빼준다.
    22. 테스트가 잘 돌아가는 것을 확인했으니까 void 상품등록(){} 여기에서 final AddProductRequest request = 상품등록요청_생성(); 으로 바꿔준다.

다음 시간에는 스프링 빈을 이용해서 스프링 빈으로 등록하고 그걸 이제 스프링부트 테스트로 동작하도록 하는 실습을 해볼 것이다.

728x90
반응형