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
'[ Spring ] > SpringMVC 1편' 카테고리의 다른 글
[Spring] HTTP 메시지 컨버터 (Message Converter) (0) | 2022.02.26 |
---|---|
[Spring] HTTP 응답을 보내는 방법 (정적 리소스 / 뷰 템플릿 / HTTP 메시지 ) (0) | 2022.02.26 |
[Spring] HTTP 요청을 받는 방법 (요청 파라미터 / HTTP 요청 메시지) (0) | 2022.02.25 |
[Spring] HTTP request 헤더 조회 (0) | 2022.02.25 |
[Spring] 기본 매핑 / 요청 매핑 (0) | 2022.02.25 |