스프링데이터 + JPA/웹 애플리케이션 개발

24. 상품 수정

sdafdq 2023. 11. 10. 08:19
@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