[ Spring ]/SpringMVC 1편

[Spring] MVC 웹 페이지 만들기

쿠릉쿠릉 쾅쾅 2022. 3. 19. 02:07
728x90

 

 

 

 

 

 

 

도메인 개발

📌 Item 도메인 객체 (Item.java)

package hello.itemservice.item;

import lombok.Getter;
import lombok.Setter;

@Getter @Setter
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;
    }
}
  • @Data는 위험하다. 핵심 도메인 객체(DB에서 꺼내온 객체)에는 @Data를 쓰기엔 위험하다. 그러나 DTO 객체(가공된 객체)는 써도 된다.
    • @ToString의 경우 객체의 양방향 연관관계(a -> b, b ->a)가 있을 때 무한 루프로 호출될 수 있다.
    • Equals와 hashCode도 모든 필드를 다 기준으로 잡기 때문의 주의해야 합니다.
  • 도메인 객체는 @Getter, @Setter을 기본으로 쓰고 필요하면 더 추가해서 쓸 것.

 

📌 ItemDTO 객체

package hello.itemservice.domain.dto;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
@Getter
public class ItemParamDTO {
    private final String itemName;
    private final Integer price;
    private final Integer quantity;

}

 

📌 Item 저장소

package hello.itemservice.domain.repository;

import hello.itemservice.domain.dto.ItemParamDTO;
import hello.itemservice.domain.item.Item;
import org.springframework.stereotype.Repository;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

@Repository
public class ItemRepository {

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

    public Item save(Item item) {
        item.setId(++sequence);
        store.put(item.getId(), item);
        return item;
    }

    public Item findById(Long itemId) {
        return store.get(itemId);
    }

    public List<Item> findAll() {
        return new ArrayList<>(store.values());
    }

    public void update(Long itemId, ItemParamDTO itemParamDTO) {
        Item findItem = findById(itemId);

        findItem.setItemName(itemParamDTO.getItemName());
        findItem.setPrice(itemParamDTO.getPrice());
        findItem.setQuantity(itemParamDTO.getQuantity());
    }

    public void clearStore() {
        store.clear();
    }
}

 

📌 도메인 테스트 코드

package hello.itemservice.domain.repository;

import hello.itemservice.domain.dto.ItemParamDTO;
import hello.itemservice.domain.item.Item;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Test;

import java.util.List;

import static org.assertj.core.api.Assertions.assertThat;


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

    }

    @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
        ItemParamDTO itemParamDTO = new ItemParamDTO("item2", 2000, 30);
        itemRepository.update(itemId, itemParamDTO);

        // then
        Item findItem = itemRepository.findById(itemId);

        assertThat(findItem.getItemName()).isEqualTo(itemParamDTO.getItemName());
        assertThat(findItem.getPrice()).isEqualTo(itemParamDTO.getPrice());
        assertThat(findItem.getQuantity()).isEqualTo(itemParamDTO.getQuantity());

    }

}

 

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

728x90