상품 수정

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

  1. 컨트롤러에서 어설프게 엔티티를 생성❌

  2. 트랜잭션이 있는 서비스 계층식별자( id )와 변경할 데이터를 명확하게 전달(파라미터 or dto)

  3. 트랜잭션이 있는 서비스 계층에서 영속 상태의 엔티티를 조회하고, 엔티티의 데이터를 직접 변경

  4. 트랜잭션 커밋 시점에 변경 감지가 실행됩니다.

구현할 내용

  1. 컨트롤러 : ItemController 클래스 컨트롤러 상에서 봤을 때는 지금까지 회원 등록, 상품 등록했던 것들과 동일하게 구현하면 된다. 여기서 핵심은 상품을 수정할 때 POST 로 넘어온 객체 데이터로 새로운 객체를 생성, 셋팅해서 itemService.saveItem(newItem)으로 한다. ItemService는 단순히 ItemRepository에 위임하는 클래스로, 실질적으로는 ItemRepository의 save함수가 동작한다!!! ItemRepository 클래스의 save(Item item)

  2. public void save(Item item){
        //JPA에 저장하기 전까지는 id값이 없다.새로 생성하는 객체라는 뜻
        if(item.getId() == null){//처음에는 id라는 게 없기 때문에.
            em.persist(item);
        } else{//이미 DB에 등록된 것이라는 뜻.
            em.merge(item);
        }
    }

① @GetMapping : 상품 수정 폼 조회

@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 : 상품 데이터 수정!⭐️⭐️⭐️⭐️⭐️

@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";
    }

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

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

Last updated