package com.codingbox.item;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ItemApplication {
public static void main(String[] args) {
SpringApplication.run(ItemApplication.class, args);
}
}
SpringApplication.run(ItemApplication.class, args);: 이 부분은 Spring Boot 애플리케이션을 시작하는 코드이다.
package com.codingbox.item.domain.web.dto;
import lombok.Getter;
import lombok.Setter;
@Getter @Setter
public class Item {
private Long id;
private String itemName;
private Integer price; // null일 수 있다.
private Integer quantity; // null일 수 있다.
public Item() {
super();
}
public Item(String itemName, Integer price, Integer quantity) {
super();
this.itemName = itemName;
this.price = price;
this.quantity = quantity;
}
}
lombok을 가져왔고 id,itemName,price,quantity로 구성
package com.codingbox.item.domain.web.repository;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.springframework.stereotype.Repository;
import com.codingbox.item.domain.web.dto.Item;
@Repository
public class ItemRepository {
private static final Map<Long, Item> store = new HashMap<>();
private static long sequence = 0L;
// 저장
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<Item>(store.values());
}
// 아이템 수정
public void update(Long itemId, Item updatParam) {
// item 먼저 찾는다
Item findItem = findById(itemId);
findItem.setItemName(updatParam.getItemName());
findItem.setPrice(updatParam.getPrice());
findItem.setQuantity(updatParam.getQuantity());
}
// store clear
public void clearStore() {
store.clear();
}
}
저장하기 위한 메서드들의 모임이다. save메서드에서 저장을 한다. 이때 id값이 하나씩 커지게 설정해 놓았다. ⭐(이걸 막는 과정도 html에서 구현하는데 조금 더 공부후 추가) 이거 아님 .
return "redirect:/basic/items/"+ item.getId();
}
이 코드를 통해서 redirect시켜서 계속 리셋시켜 인덱스가 올라가지 않게 하는 것
아이템을 찾는 메서드는 findById(하나만 검색), findAll(전체검색)으로 구성하였고 store라고 정의한 map 변수를 지우는 clearStore메서드로 마무리했다.
✍️제일 중요한 컨트롤러 부분이다.
코드가 너무 길어서 조금씩 잘라서 첨부한다.
@GetMapping
public String items(Model model) {
List<Item> items = itemRepository.findAll();
model.addAttribute("items", items);
return "basic/items";
}
일단 매핑을 해야한다. 위에서 정의해온 메서드를 끌고 오기위해 list객체를 생성했다.
@GetMapping("/{itemId}")
public String item(@PathVariable Long itemId, Model model) {
Item item = itemRepository.findById(itemId);
model.addAttribute("item", item);
return "basic/item";
}
파라미터를 두 개로 가져오는데, @PathVariable 어노테이션을 사용하여 itemId 매개변수에 바인딩한다. 그리고 Model 객체를 매개변수로 받는다.
model.addAttribute("item", item); 이 부분은 Model 객체에 "item"이라는 이름으로 추가해 데이터를 사용할 수 있게 한다.
@GetMapping("/add")
public String addForm() {
return "basic/addForm";
}
후에 있을 postmapping을 위해 getmapping해준다.
@PostMapping("/add")
public String saveItemV6(Item item,
RedirectAttributes redirectAttributes) {
Item savedItem = itemRepository.save(item);
//redirectAttributes.addAttribute("itemId", savedItem);
redirectAttributes.addAttribute("status", true);
return "redirect:/basic/items/"+ item.getId();
}
postmapping으로 데이터를 요청한다. 기존 레파지토리에서 save메서드를 호출해 저장 하고
redirect:"를 사용하여 리다이렉트를 수행한다. "/basic/items/{item.getId()}"로 리다이렉트된다. 이때 {item.getId()}는 새로 생성된 아이템의 ID를 나타내는데, 따라서 아이템이 성공적으로 생성되면 해당 아이템의 상세 페이지로 이동하게 설정해 놓았다.
<script th:inline="javascript">
if([[${param.status}]]){
alert("저장완료");
}else{
alert("저장실패");
}
</script>
후에 파라미터로 받아와서 요긴하게 사용한다.