본문 바로가기
Spring Tutorial

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

by 미소5 2024. 10. 12.

서비스 제공 흐름


  • 요구사항
    • 상품 도메인 모델
      • 상품 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());
    }

}

 

 


  • 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;
 }
}

 

 


상품 서비스 HTML

 

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

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

 


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

  1. 해당 링크에서 Compiled CSS and JS 항목을 다운로드
  2. 압축을 풀고, bootstrap.min.css를 복사해서 resources/static/css 폴더에 추가
    • resources/static/css/bootstrap.min.css 
  3. html <head>에 다음 코드 추가
<link href="../css/bootstrap.min.css" rel="stylesheet">

 


[스프링MVC -상품 관리 웹 개발 2] 상품 목록 - 타임리프 (tistory.com)

 

[스프링MVC -상품 관리 웹 개발 2] 상품 목록 - 타임리프

컨트롤러 로직 @Controller @RequestMapping("/basic/items") @RequiredArgsConstructor//final이 붙은 멤버변수만 사용한 생성자 자동 생성 public class BasicItemController { private final ItemRepository itemRepository; /** 상품 목록 */

joly156.tistory.com

 

[스프링MVC -상품 관리 웹 개발 3] 상품 상세 (tistory.com)

 

[스프링MVC -상품 관리 웹 개발 3] 상품 상세

컨트롤러 로직 추가 /** 상품 상세(조회) */ @GetMapping("/{itemId}") public String item(@PathVariable Long itemId, Model model) { Item item = itemRepository.findById(itemId); //PathVariable 로 넘어온 상품ID로 item 조회하고 model.addA

joly156.tistory.com

[스프링MVC -상품 관리 웹 개발 4] 상품 등록 폼 (tistory.com)

 

[스프링MVC -상품 관리 웹 개발 4] 상품 등록 폼

컨트롤러 로직 추가 /** 상품 등록 폼*/ @GetMapping("/add") public String addForm() { return "basic/addForm"; //뷰 템플릿 호출 (내부 호출) } 단순히 뷰 템플릿만 호출 뷰 템플릿(templates) /resources/templates/basic/addForm.

joly156.tistory.com

[스프링MVC -상품 관리 웹 개발 6] 상품 수정 (tistory.com)

 

[스프링MVC -상품 관리 웹 개발 6] 상품 수정

컨트롤러 로직 추가 /** 상품 수정 폼 컨트롤러 */ @GetMapping("/{itemId}/edit") public String editForm(@PathVariable Long itemId, Model model) { Item item = itemRepository.findById(itemId); //수정에 필요한 정보 조회 model.addAttrib

joly156.tistory.com

 

 

728x90
반응형