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