우리는 MVC 패턴을 쓰기 때문에 항상 컨트롤러를 통해 뷰가 호출되어야 한다.(뷰 템플릿: Thymeleaf)
먼저 Item 객체를 생성한다. @Data 어노테이션을 통해 Lombok 의존성을 주입할 수도 있지만, Lombok에는 Getter와 Setter를 제외한 다른 기능들이 불필요하게 추가될 수 있다. 그러므로 @Getter, @Setter만 따로 추가하였다.
@Getter @Setter
public class Item {
private long id;
private String itemName;
// quantity, price가 Null로 들어갈 수 있기 때문에 Int가 아닌 Integer로 선언
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을 담고 있는 ItemRepository이다.
@Repository
public class ItemRepository {
// 멀티스레드 환경에서 여러개가 동시에 store에 접근하는 경우 HashMap을 사용하면 안된다.
private static final Map<Long, Item> store = new HashMap<>(); // static
private static long sequence = 0L; // static
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());
}
// 현재 id가 사용이 안되고 있다.
// itemName, price, quantity를 담는 별도의 객체를 생성하는 것이 적절하다.(*ParamDTO*)
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();
}
}
이제 생성한 Repository에 대한 테스트 코드를 작성한다. (단축키: [Command + Shift + T])
public class ItemRepositoryTest {
ItemRepository itemRepository = new ItemRepository();
// 테스트 종료 시 Repository를 비움으로써 발생할 수 있는 이슈를 해결한
@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(savedItem.getId());
// 검증(Assertions.core.api)
// Assertions.assertThat(findItem).isEqualTo(savedItem);
// [option + Enter] -> static import가 들어가서 코드가 간결해진다
assertThat(findItem).isEqualTo(savedItem);
}
@Test
void findAll() {
// given
Item item1 = new Item("itemA", 10000, 10);
Item item2 = new Item("itemB", 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("itemA", 10000, 10);
Item savedItem = itemRepository.save(item);
Long itemId = savedItem.getId();
// when
Item updateParam = new Item("itemB", 20000, 20);
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());
}
}
'🌱 Spring > MVC ①' 카테고리의 다른 글
[Spring] 상세, 추가, 수정 (PathVariable, ModelAttribute, Redirect) (0) | 2023.07.31 |
---|---|
[Spring] Thymeleaf View로 변경 (0) | 2023.07.27 |
[Spring] HTTP Message Converter (0) | 2023.07.24 |
[Spring] HTTP 응답 _ HTTP API, 메시지 바디에 직접 입력 (0) | 2023.07.24 |
[Spring] HTTP 응답 _ 정적 리소스, 뷰 템플릿 (0) | 2023.07.24 |