
#상품 등록
상품 등록 폼에서 데이터를 입력하고 Submit 버튼을 클릭하면 /items/new를 POST 방식으로 요청
상품 저장이 끝나면 상품 목록 화면( redirect:/items )으로 리다이렉트
ItemController
/**
* 상품 등록 클릭시
*/
@GetMapping(value = "/items/new")
public String createForm(Model model) {
model.addAttribute("form", new BookForm()); //이렇게 넘겨줘서 html에서 추적가능
return "items/createItemForm";
}
/**
* 상품 등록 (submit)
*/
@PostMapping(value = "/items/new")
public String create(BookForm form) {
Book book = new Book();
book.setName(form.getName());
book.setPrice(form.getPrice());
book.setStockQuantity(form.getStockQuantity());
book.setAuthor(form.getAuthor());
book.setIsbn(form.getIsbn());
itemService.saveItem(book);
return "redirect:/items"; //저장된 책 목록으로
}
ItemService
/**
* 상품 등록
*/
@Transactional
public void saveItem(Item item) {
itemRepository.save(item);
}
ItemRepository
private final EntityManager em;
//item은 jpa에 저장하기 전까지 id값이 없다(=완전히 새로 생성하는 객체)
public void save(Item item) {
if ((item.getId() == null)) {
em.persist(item); //상품 신규 등록
} else { //만약에 db에 이미 있는 값이라면 수정
em.merge(item);
}
}
#상품 목록
ItemController
/**
* 상품 목록
*/
@GetMapping(value = "/items")
public String list(Model model) {
List<Item> items = itemService.findItems();
model.addAttribute("items", items);
return "items/itemList";
}
ItemService
/**
* 상품 목록
*/
public List<Item> findItems() {
return itemRepository.findAll();
}
ItemRepository
public List<Item> findAll() {
return em.createQuery("select i from Item i",Item.class).getResultList();
}
#상품수정
ItemController
/**
* 상품 수정 폼
* 폼에서 수정데이터 입력 후 ->수정되어야하니 form 있어야함
*/
@GetMapping("items/{itemID}/edit")
public String updateItemForm(@PathVariable("itemID") Long itemId, Model model) {
Book item = (Book) itemService.findOne(itemId); //item Id 받아서 수정
BookForm form = new BookForm(); //form을 수정할때 book엔티티가 아니라 form을 보낼거임
form.setId(item.getId());
form.setName(item.getName());
form.setPrice(item.getPrice());
form.setStockQuantity(item.getStockQuantity());
form.setAuthor(item.getAuthor());
form.setIsbn(item.getIsbn());
model.addAttribute("form", form); //updateItemForm으로 보낸다.
return "items/updateItemForm";
}
ItemService
/**
상품 수정할때 쓴다.
id받아서 수정하려고
*/
public Item findOne(Long itemId) {
return itemRepository.findOne(itemId);
}
ItemRepository
private final EntityManager em;
public Item findOne(Long id) {
return em.find(Item.class, id);
}
updateItemForm.html
submit 된 후
<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head th:replace="fragments/header :: header" />
<body>
<div class="container">
<div th:replace="fragments/bodyHeader :: bodyHeader"/>
<form th:object="${form}" method="post"> <!--post 방식으로 보내기-->
<!-- id -->
<input type="hidden" th:field="*{id}" />
<div class="form-group">
<label th:for="name">상품명</label>
<input type="text" th:field="*{name}" class="form-control" placeholder="이름을 입력하세요" />
</div>
<div class="form-group">
<label th:for="price">가격</label>
<input type="number" th:field="*{price}" class="form-control" placeholder="가격을 입력하세요" />
</div>
<div class="form-group">
<label th:for="stockQuantity">수량</label>
<input type="number" th:field="*{stockQuantity}" class="form-control" placeholder="수량을 입력하세요" />
</div>
<div class="form-group">
<label th:for="author">저자</label>
<input type="text" th:field="*{author}" class="form-control" placeholder="저자를 입력하세요" />
</div>
<div class="form-group">
<label th:for="isbn">ISBN</label>
<input type="text" th:field="*{isbn}" class="form-control" placeholder="ISBN을 입력하세요" />
</div>
<button type="submit" class="btn btn-primary">Submit</button>
</form>
<div th:replace="fragments/footer :: footer" />
</div> <!-- /container -->
</body>
</html>
ItemController
/**
* 상품 수정
*/
@PostMapping(value = "/items/{itemId}/edit") //post로 받았다.
public String updateItem(@ModelAttribute("form") BookForm form) { //th:object="${form}" 넘어오게 (이름은 상관없)
Book book = new Book();
book.setId(form.getId()); //form에 있는 걸로 수정해야
book.setName(form.getName());
book.setPrice(form.getPrice());
book.setStockQuantity(form.getStockQuantity());
book.setAuthor(form.getAuthor());
book.setIsbn(form.getIsbn());
itemService.saveItem(book);
return "redirect:/items";
}
ItemService
/**
* 상품 등록
*/
@Transactional
public void saveItem(Item item) {
itemRepository.save(item);
}
ItemRepository
private final EntityManager em;
//item은 jpa에 저장하기 전까지 id값이 없다(=완전히 새로 생성하는 객체)
public void save(Item item) {
if ((item.getId() == null)) {
em.persist(item); //상품 신규 등록
} else { //만약에 db에 이미 있는 값이라면 수정
em.merge(item);
}
}
상품 수정 폼 이동
1. 수정 버튼을 선택하면 /items/{itemId}/edit URL을 GET 방식으로 요청
2. 그 결과로 updateItemForm() 메서드를 실행하는데
이 메서드는 itemService.findOne(itemId) 를 호출해서 수정할 상품을 조회
3. 조회 결과를 모델 객체에 담아서 뷰( items/updateItemForm )에 전달
상품 수정 실행
상품 수정 폼 HTML에는 상품의 id(hidden), 상품명, 가격, 수량 정보 있음
1. 상품 수정 폼에서 정보를 수정하고 Submit 버튼을 선택
2. /items/{itemId}/edit URL을 POST 방식으로 요청하고 updateItem() 메서드를 실행
3. 이때 컨트롤러에 파라미터로 넘어온 item 엔티티 인스턴스는 현재 준영속 상태다.
따라서 영속성 컨텍스트 의 지원을 받을 수 없고 데이터를 수정해도 변경 감지 기능은 동작x
결과창
상품목록
수정 form
수정완료
'WEB JAVA SPRING > PROJECT' 카테고리의 다른 글
[Day-14] 회원등록/수정/조회 API (0) | 2023.08.25 |
---|---|
[Day-13] 변경감지와 병합, 상품주문, 주문 목록 검색, 주문 취소 (0) | 2023.08.25 |
[Day-11] 회원 등록, 목록 조회 (0) | 2023.08.25 |
[Day-10] 주문기능테스트, 부트스트랩적용 (0) | 2023.08.25 |
[Day-9] 주문 엔티티, 리파지토리, 서비스 (0) | 2023.08.25 |