스프링/스프링 MVC 패턴

상품 웹 사이트 - 도메인 개발

chanhee01 2023. 2. 16. 14:27

상품 목록을 보여주고 새로운 상품을 만들고 수정할 수 있는 웹 사이트를 만들어보았다.

 

Item Class

@Data // 실무에서는 @Getter @Setter 쓰고 Data는 잘 안씀
public class Item {

    private Long id;
    private String itemName;
    private Integer price;
    private Integer quantity;

    public Item() {

    }

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

Item 클래스를 만들었는데, id는 상품을 생성할 때마다 1부터 하나씩 증가하도록 설정할 것이다. 나머지 값들은 생성자를 이용해서 생성을 할 때 사용자가 입력할 수 있도록 할 것이다.

 

 

 

 

Item Repository

@Repository
public class ItemRepository {

    private static final Map<Long, Item> store = new HashMap<>();
    private static long sequence = 0L;

    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();
    }
}

item 저장소이다. 웹 사이트에서 아이템이름, 가격, 수량을 입력하고 저장버튼을 누르면 저장되는 기능을 만들고, 아이템을 수정하기 위한 findById와 아이템 목록 전체를 보여주는 findAll 메서드, 수정을 할 수 있는 update 메서드이다.

 

 

 

 

 

 

public class ItemRepositoryTest {

    ItemRepository itemRepository = new ItemRepository();

    @AfterEach
    void afterEach() {
        itemRepository.clearStore();
    }

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

        // when
        Item saveItem = itemRepository.save(item);

        // then
        Item findItem = itemRepository.findById(item.getId());
        assertThat(findItem).isEqualTo(saveItem);
    }

    @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);
        assertThat(result).contains(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", 2000, 30);
        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());
    }
}

위의 도메인 코드들이 잘 실행되는지 확인해주는 테스트코드이다.

이전 게시글에서 정리한 내용도 있고, 그렇게 어렵지 않은 코드들이기에 이해하는데 크게 어렵지 않았다.

 

우선 도메인은 이렇게 만들게 되었고, 이제 사용자가 직접 입력되면 서버에 자동으로 저장되고, 웹 사이트 이동을 자유자제로 할 수 있도록 설계해야한다.