본문 바로가기
Spring Tutorial

[스프링MVC -상품 관리 웹 개발 1] 상품 도메인 개발

by 미소5 2023. 8. 28.

서비스 제공 흐름


  • 요구사항
    • 상품 도메인 모델
      • 상품 ID, 상품명, 가격, 수량
    • 상품 관리 기능
      • 상품 목록, 상품 상세, 상품 등록, 상품 수정

 


핵심 비즈니스 로직 (상품 도메인) 을 개발해보자.


  • 상품 객체
//@Data
@Getter @Setter
public class Item {

 	private Long id;
 	private String itemName;
 	private Integer price;
 	private Integer quantity;
    //null일 경우 포함하기 위해 Integer
    
    
 	public Item() {
 	}
    
 	public Item(String itemName, Integer price, Integer quantity) {
 	this.itemName = itemName;
 	this.price = price;
	this.quantity = quantity;
 	}
    
}
  • @Data는 @Getter , @Setter , @ToString , @EqualsAndHashCode , @RequiredArgsConstructor 를 자동으로 적용
    • 핵심 도메인 모델에 사용하기에는, 매우 위험

 


  • 상품 저장소
@Repository
public class ItemRepository {

 	private static final Map<Long, Item> store = new HashMap<>(); //static 사용
    /* HashMap은 동시성 문제가 고려되어 있지 않음 (실무에서는 ConcurrentHashMap 사용 고려) */
    
 	private static long sequence = 0L; //static 사용
    /* 실무에서는 AtomicLong 사용 고려 */
    
    
 	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();
	 }
 
}
  • 실무에서는 ItemParamDto와 같은 클래스 ( 객체 ) 를 만들어 파라미터 값(itemName, price, quantity) 업데이트

 

 


  • 상품 저장소 테스트
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);     //size는 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, 30);
        itemRepository.update(itemId, updateParam);

        Item findItem = itemRepository.findById(itemId);
        //then
        //업데이트된 값과 조회된 값이 같다
        assertThat(findItem.getItemName()).isEqualTo(updateParam.getItemName());
        assertThat(findItem.getPrice()).isEqualTo(updateParam.getPrice());
        assertThat(findItem.getQuantity()).isEqualTo(updateParam.getQuantity());
    }

}

 


+상품 서비스 HTML

 

  • HTML을 편리하게 개발하기 위해 부트스트랩 사용!

https://getbootstrap.com/docs/5.0/getting-started/download/

 

Download

Download Bootstrap to get the compiled CSS and JavaScript, source code, or include it with your favorite package managers like npm, RubyGems, and more.

getbootstrap.com

  • 여기서 Compiled CSS and JS 항목을 다운로드
  • 압축을 풀고, bootstrap.min.css 를 복사해서 resources/static/css/bootstrap.min.css 에 추가!

 


<link href="../css/bootstrap.min.css" rel="stylesheet">

 


부트스트랩(Bootstrap)은 웹사이트를 쉽게 만들 수 있게 도와주는 HTML, CSS, JS 프레임워크이다. 하나의 CSS로 휴대폰, 태블릿, 데스크탑까지 다양한 기기에서 작동한다. 다양한 기능을 제공하여 사용자가 쉽게 웹사이트를 제작, 유지, 보수할 수 있도록 도와준다.

 

 


  • lombok이 제공하는 @Getter , @Setter 가 다음 코드 자동 추가
public class HelloData {
 private String username;
 private int age;
 //==== lombok 생성 코드 ====//
 public String getUsername() {
 return username;
 }
 public void setUsername(String username) {
 this.username = username;
 }
 public int getAge() {
 return age;
 }
 public void setAge(int age) {
 this.age = age;
 }
}

 


 

728x90
반응형