# 상품 수정

엔티티를 변경할 때는 항상 변경 감지를 사용하자!

1. **컨트롤러**에서 어설프게 엔티티를 생성❌
2. **트랜잭션이 있는 서비스 계층**에 **식별자( id )와 변경할 데이터를 명확하게 전달**(파라미터 or dto)
3. **트랜잭션이 있는 서비스 계층**에서 **영속 상태의 엔티티를 조회**하고, **엔티티의 데이터를 직접 변경**
4. **트랜잭션 커밋 시점에 변경 감지가 실행**됩니다.

구현할 내용

1. 컨트롤러 : ItemController 클래스\
   컨트롤러 상에서 봤을 때는 지금까지 회원 등록, 상품 등록했던 것들과 동일하게 구현하면 된다. 여기서 핵심은 상품을 수정할 때 POST 로 넘어온 객체 데이터로 새로운 객체를 생성, 셋팅해서 itemService.saveItem(newItem)으로 한다.\
   ItemService는 단순히 ItemRepository에 위임하는 클래스로, 실질적으로는 ItemRepository의 save함수가 동작한다!!!\
   ItemRepository 클래스의 save(Item item)
2. ```java
   public void save(Item item){
       //JPA에 저장하기 전까지는 id값이 없다.새로 생성하는 객체라는 뜻
       if(item.getId() == null){//처음에는 id라는 게 없기 때문에.
           em.persist(item);
       } else{//이미 DB에 등록된 것이라는 뜻.
           em.merge(item);
       }
   }
   ```

① @GetMapping : 상품 수정 폼 조회

```java
@GetMapping("/items/{itemId}/edit")
    public String updateItemForm(@PathVariable("itemId") Long itemId,Model model){
        Book item = (Book)itemService.findOne(itemId);
        //multiline select
        BookForm form = new BookForm();
        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);
        return "items/updateItemForm";
    }
```

② @PostMapping : 상품 데이터 수정!⭐️⭐️⭐️⭐️⭐️

```java
@PostMapping("/items/{itemId}/edit")
    public String updateItem(@ModelAttribute("form") BookForm form){//"form"은 updateItemForm에서 넘어올 때 객체 이름?!<form th:object="${form}" method="post"> 혹은 디폴트이름
        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";
    }
```

&#x20; 2\. 타임리프 템플릿\
폼 구성 : 회원등록, 상품등록과 거의 동일.\
상품 수정 페이지 접속 시에 렌더링하는 폼 페이지=> GetMapping 컨트롤러로 구현\
모델에서 "form" 데이터를 객체로 사용하고, POST 방식으로 HTML Form 데이터 전송하겠다.\
\<form th:object="${form}" method="post">

```
<form th:object="${form}" method="post">
```
