@GetMapping("/items/{itemId}/edit")
public String updateItemForm(@PathVariable("itemId") Long itemId, Model model){
BookForm form = new BookForm((Book) itemService.findOne(itemId));
model.addAttribute("form", form);
return "items/updateItemForm";
}
그냥 폼.
생성자는 그냥 내가 만들어 봤음.
Book을 BookForm으로.
그걸 템플릿에 뿌려줌.
글번호/edit
이런 형식은 자주 있는 형식인듯.
아무 사이트 글에서 저렇게 edit 붙였더니 로그인 페이지로 이동되었음.
그 후 내 아이디로 로그인 하고 다시 edit 붙여봤더니 Forbidden 이러면서 잘못된 접근이라고 함.
edit 하는 데 세션 등의 검증 로직이 필요한 듯.
로그인 상태가 아니라면 로그인 페이지로 이동시키고, 로그인 중이라면 검증 후 수정 가능하게끔
지금은 연습이니 넘어감.
@PostMapping("/items/{itemId}/edit")
public String updateItem(@PathVariable("itemId") Long itemId, BookForm form){
Book book = new Book();
book.setId(form.getId());
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";
}
Post로 할 시, 정보들을 BookForm으로 자동으로 담아서,
Book으로 바꾸고,
ItemService에서 Book을 저장시킴.
나는 id를 노출시키는 게 어떨까 싶었는데, 주문번호가 id 같음.
네이버에서 내가 주문한 것의 주문번호에 +1해서 쳐봤더니 얘네는 아예 검증 실패 시 빈페이지 넘기도록 해 놨음.
여기서
itemService.saveItem()
결국 itemRepository의 save()를 호출하는 건데,
public void save(Item item){
if(item.getId() == null){
em.persist(item);
}else{
em.merge(item);
}
}
이렇게 되어 있음.
id가 있으면 persist가 아니라 merge함.
merge에 대한 설명은 다음장.
<!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">
<!-- 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>
'스프링데이터 + JPA > 웹 애플리케이션 개발' 카테고리의 다른 글
26. 상품 주문 (0) | 2023.11.11 |
---|---|
25. 변경감지와 병합 (0) | 2023.11.11 |
23. 상품 등록 (0) | 2023.11.10 |
22. 회원 목록 조회 (0) | 2023.11.10 |
21. 회원 등록 (0) | 2023.11.09 |