πŸ”™λ’€λ‘œκ°€κΈ°

ItemController에 updateItemForm GET/POST λ§€ν•‘ μΆ”κ°€

@GetMapping("/items/{itemId}/edit")
    public String updateItemForm(@PathVariable("itemId") Long itemId, Model model) {
        Book item = (Book) itemService.findOne(itemId);

        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("/items/{itemId}/edit")
    public String updateItem(@PathVariable Long itemId, @ModelAttribute("form") 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";
    }

@PathVariable μ–΄λ…Έν…Œμ΄μ…˜

@PathVariable μ–΄λ…Έν…Œμ΄μ…˜μ€ URL 경둜의 일뢀λ₯Ό λ©”μ†Œλ“œμ˜ λ§€κ°œλ³€μˆ˜λ‘œ κ°€μ Έμ˜¬ 수 있게 ν•΄μ€€λ‹€. URL κ²½λ‘œμ— μžˆλŠ” λ³€μˆ˜λ₯Ό λ©”μ†Œλ“œμ—μ„œ μ‚¬μš©ν•  수 μžˆλ„λ‘ ν•˜λŠ” κΈ°λŠ₯을 μ œκ³΅ν•œλ‹€.

μœ„ λ©”μ†Œλ“œμ—μ„œ **@PathVariable("itemId")**λŠ” λ‹€μŒκ³Ό 같은 μž‘λ™ 원리λ₯Ό κ°€μ§„λ‹€.

  1. URL κ²½λ‘œμ— μžˆλŠ” itemId λ³€μˆ˜λ₯Ό μ°ΎλŠ”λ‹€. 예λ₯Ό λ“€μ–΄, URL이 **/items/123/edit**라면 **itemId**λŠ” **123**이 λœλ‹€.
  2. itemId λ³€μˆ˜μ˜ 값을 ν•΄λ‹Ή 데이터 νƒ€μž…(Long)으둜 λ³€ν™˜ν•œλ‹€.
  3. λ³€ν™˜λœ 값을 λ©”μ†Œλ“œμ˜ λ§€κ°œλ³€μˆ˜(Long itemId)에 μ „λ‹¬ν•œλ‹€.

이λ₯Ό 톡해 λ©”μ†Œλ“œλŠ” URL κ²½λ‘œμ— μžˆλŠ” itemId 값을 μ‚¬μš©ν•˜μ—¬ ν•΄λ‹Ή μƒν’ˆμ˜ 정보λ₯Ό κ°€μ Έμ˜€κ³  μˆ˜μ •ν•˜κΈ° μœ„ν•œ μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆλ‹€. **@PathVariable**을 μ‚¬μš©ν•˜λ©΄ 동적인 URL 경둜λ₯Ό μ²˜λ¦¬ν•˜λŠ” 데 μœ μš©ν•˜λ©°, μ‚¬μš©μžκ°€ μš”μ²­ν•˜λŠ” λ¦¬μ†ŒμŠ€λ₯Ό 효과적으둜 식별할 수 μžˆλ‹€.

@ModelAttribute μ–΄λ…Έν…Œμ΄μ…˜

@ModelAttribute μ–΄λ…Έν…Œμ΄μ…˜μ€ HTTP μš”μ²­μ˜ 폼 데이터λ₯Ό μžλ°” 객체둜 λ°”μΈλ”©ν•˜κ³  λ©”μ†Œλ“œμ˜ λ§€κ°œλ³€μˆ˜λ‘œ μ „λ‹¬ν•˜λŠ” 역할을 ν•œλ‹€. 이λ₯Ό 톡해 폼 데이터λ₯Ό μ‰½κ²Œ μ²˜λ¦¬ν•  수 μžˆλ‹€.

μœ„ λ©”μ†Œλ“œμ—μ„œ **@ModelAttribute("form") BookForm form**의 μž‘λ™ μ›λ¦¬λŠ” λ‹€μŒκ³Ό κ°™λ‹€.

  1. ν΄λΌμ΄μ–ΈνŠΈκ°€ 폼을 톡해 데이터λ₯Ό μ„œλ²„λ‘œ μ „μ†‘ν•œλ‹€. 이 λ•Œ, 각 μž…λ ₯ ν•„λ“œμ˜ 이름과 값이 μ „μ†‘λœλ‹€.
  2. μŠ€ν”„λ§ MVCλŠ” μ „μ†‘λœ 폼 데이터λ₯Ό μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ @ModelAttribute μ–΄λ…Έν…Œμ΄μ…˜μ΄ 뢙은 λ§€κ°œλ³€μˆ˜λ₯Ό μ°ΎλŠ”λ‹€.
  3. **@ModelAttribute("form")**이 뢙은 BookForm 객체λ₯Ό μƒμ„±ν•œλ‹€.
  4. μŠ€ν”„λ§ MVCλŠ” μ „μ†‘λœ 폼 λ°μ΄ν„°μ˜ 이름과 값을 λΆ„μ„ν•˜κ³ , BookForm 객체의 μ μ ˆν•œ ν•„λ“œμ— μžλ™μœΌλ‘œ λ°”μΈλ”©ν•œλ‹€. 즉, 폼 λ°μ΄ν„°μ˜ 이름과 μΌμΉ˜ν•˜λŠ” BookForm 객체의 ν•„λ“œμ— 값을 ν• λ‹Ήν•œλ‹€.
  5. λ°”μΈλ”©λœ BookForm 객체λ₯Ό λ©”μ†Œλ“œμ˜ λ§€κ°œλ³€μˆ˜λ‘œ μ „λ‹¬ν•œλ‹€.

이λ₯Ό 톡해 λ©”μ†Œλ“œλŠ” μ „λ‹¬λœ BookForm 객체λ₯Ό μ‚¬μš©ν•˜μ—¬ μƒν’ˆ 정보λ₯Ό μˆ˜μ •ν•  수 μžˆλ‹€. **@ModelAttribute**λ₯Ό μ‚¬μš©ν•˜λ©΄ 폼 데이터λ₯Ό μ²˜λ¦¬ν•˜λŠ” 데 ν•„μš”ν•œ λ³΄μΌλŸ¬ν”Œλ ˆμ΄νŠΈ μ½”λ“œλ₯Ό 쀄일 수 있으며, μ½”λ“œμ˜ 가독성과 μœ μ§€λ³΄μˆ˜μ„±μ΄ ν–₯μƒλœλ‹€.

예λ₯Ό λ“€μ–΄, μœ„μ—μ„œ μ‚¬μš©ν•œ λ©”μ†Œλ“œλ₯Ό **@ModelAttribute**λ₯Ό μ‚¬μš©ν•˜μ§€ μ•Šκ³  μž‘μ„±ν•œλ‹€λ©΄ λ‹€μŒκ³Ό 같이 μ²˜λ¦¬ν•΄μ•Ό ν•œλ‹€.