- 요구사항
- 상품 도메인 모델
- 상품 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/
- 해당 링크에서 Compiled CSS and JS 항목을 다운로드
- 압축을 풀고, bootstrap.min.css를 복사해서 resources/static/css 폴더에 추가
- resources/static/css/bootstrap.min.css
- html <head>에 다음 코드 추가
<link href="../css/bootstrap.min.css" rel="stylesheet">
[스프링MVC -상품 관리 웹 개발 2] 상품 목록 - 타임리프 (tistory.com)
[스프링MVC -상품 관리 웹 개발 3] 상품 상세 (tistory.com)
[스프링MVC -상품 관리 웹 개발 4] 상품 등록 폼 (tistory.com)
[스프링MVC -상품 관리 웹 개발 6] 상품 수정 (tistory.com)
728x90
반응형
'Spring Tutorial' 카테고리의 다른 글
[Spring 입문 16] AOP 적용 (0) | 2024.08.11 |
---|---|
[Spring 입문 15] AOP가 필요한 상황 (0) | 2024.08.11 |
[Spring 입문 14] 스프링 DB 접근 기술: 스프링 데이터 JPA (0) | 2024.08.04 |
[Spring 입문 13] 스프링 DB 접근 기술: JPA (0) | 2024.08.04 |
[Spring 입문 12] 스프링 DB 접근 기술: 스프링 JdbcTemplate (0) | 2024.08.03 |