판매 할 상품을 등록, 수정하여 목록을 볼 수 있는 상품 관리 서비스를 만들어보자 

 

 

 

도메인 모델

  • 상품 ID
  • 상품명
  • 가격
  • 수량

 

4가지 기능

  • 상품 목록
  • 상품 등록
  • 상품 수정
  • 상품 상세

 

 

 

상품 도메인 개발

 

Item - 상품 객체

@Getter @Setter
public class item {

    private Long id;
    private String itemName;
    private Integer price; //Integer은 null일 가능성이 있기때문
    private int quantity;

    //기본 생성자
    public item() {
    }

    public item(String itemName, Integer price, int quantity) {
        this.itemName = itemName;
        this.price = price;
        this.quantity = quantity;
    }
}

 

* @Data 를 쓰게 되면 getter,setter,required,Tostring...다 만들어줘서 위험하니까 필요한 getter,setter 만 쓴다 

 

 

 

 

 

ItemRepository - Item 저장소

@Repository //@Component 가 포함돼있어 컴포넌트 대상이 된다
public class ItemRepository {

    //Map<Long, Item> 상품의 id를 키로 사용하여 상품을 빠르게 검색하고 접근하기 위해
    private static final Map<Long, Item> store = new HashMap<>(); //static
    private static long sequence = 0L; //static

    //저장
    public Item save(Item item) {
        item.setId(++sequence);
        store.put(item.getId(),item);

        return item;
    }

    //조회
    public Item findById(Long id){
        return store.get(id);
    }

    //전체 조회
    public List<Item> findAll(){
        return new ArrayList<>(store.values());
    }

    //업데이트
    public void update(Long itemId, Item updateParam){
        Item findItem = findById(itemId);
        findItem.setItemName(updateParam.getItemName());
        findItem.setPrice(updateParam.getPrice());
        findItem.setQuantity(updateParam.getQuantity());
    }

    //테스트용 해시맵 데이터 날리기
    public void clearStore(){
        store.clear();
    }
}

 

 

 

테스트용 클래스 만들기

ItemRepositoryTest

 

ItemRepository 클래스에 클릭하고 ctrl + shift + T 하면 테스트용 자동완성이 된다 (JUnit5 라이브러리로 하기!) 

생성된것을 확인

 

 

 

먼저 저장 테스트

class ItemRepositoryTest {

    ItemRepository itemRepository = new ItemRepository();

    //테스트 끝날때마다 실행해준다 (깔끔하게 지워주기)
    @AfterEach
    void afterEach() {
        itemRepository.clearStore();
    }

    @Test
    void save(){
        //given
        Item item = new Item("itemA",10000,10);
        //when
        Item savedItem = itemRepository.save(item);
        //then
        Item findItem = itemRepository.findById(item.getId());
        assertThat(findItem).isEqualTo(savedItem); //조회한값=저장된값 테스트
    }
}

 

 


 

import org.assertj.core.api.Assertions;
Assertions.assertThat(findItem).isEqualTo(savedItem);

 

Assertions 에 커서를 두고 alt + enter 해서 Add on-demand~~ 클릭하면 앞으로 Assertions 생략해도 된다. 

 

 

 

 

두번째 전체 조회 테스트

@Test
void findAll(){
    //given
    Item item1 = new Item("item1",10000,10);
    Item item2 = new Item("item2",20000,20);

    itemRepository.save(item1);
    itemRepository.save(item2);
    
    //when
    List<Item> result = itemRepository.findAll();
    
    //then
    assertThat(result.size()).isEqualTo(2); //2개가 맞는지
    assertThat(result).contains(item1,item2); //item1과 item2 가 있는지

}

 

 

 

테스트 동작해보기 

색체크가 나오면 잘 동작한다는것!

 

 

 

 

세번째 업데이트 테스트 해보고 정상동작하는지 실행해보기

@Test
void updateItem(){
    //given
    Item item = new Item("item1",10000,10);

    Item savedItem = itemRepository.save(item);
    Long itemid = savedItem.getId();

    //when
    Item updateParam = new Item("item2", 20000, 20);
    itemRepository.update(itemid,updateParam);

    //then
    Item findItem = itemRepository.findById(itemid);
    assertThat(findItem.getItemName()).isEqualTo(updateParam.getItemName());
    assertThat(findItem.getPrice()).isEqualTo(updateParam.getPrice());
    assertThat(findItem.getQuantity()).isEqualTo(updateParam.getQuantity());
}

 

 

 

반응형
LIST

+ Recent posts