[Spring] MVC 패턴 웹 페이지 6 - 상품 등록 처리하기 @ModelAttribute

2025. 6. 25. 14:27·Project/Web

이번에는 @ModelAttribute를 통해 실제 상품 등록을 처리해보자

 

[Spring] MVC 패턴 웹 페이지 5 - 상품 등록 폼

이전글에 이어 이번엔 상품 등록 폼을 만들어보자 ! [Spring] MVC 패턴 웹 페이지 4 - 상품 상세 페이지이전 글에 이어 상품 상세 컨트롤러와 뷰를 만들어본다. [Spring] MVC 패턴 웹 페이지 3 - HTML, 그리

bdisappointed.tistory.com


로직 설명

이전에 우리가 작성한 HTML 코드는 다음과 같다

<form action="item.html" th:action method="post">

즉, 폼 데이터로 메시지 바디에 쿼리 파라미터를 전달하는 형식으로 POST 메시지가 전송된다.

-> 즉 우리는 메시지 바디의 내용을 편하게 조회할 수 있는 @RequestParam 을 쓰면 편리하게 아이템에 정보를 매핑할 수 있게 된다.

 


컨트롤러 수정

/add 경로에 POST 메서드를 추가했다.

package hello.itemservice.web.basic;

import hello.itemservice.domain.item.Item;
import hello.itemservice.domain.item.ItemRepository;
import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import java.util.List;

@Controller
@RequestMapping("/basic/items")
@RequiredArgsConstructor // 생성자 만들어줌 + 생성자가 하나니까 AutoWired도 발생
public class BasicItemController {

    private final ItemRepository itemRepository;

    @GetMapping
    public String items(Model model) {
        List<Item> items = itemRepository.findAll();
        model.addAttribute("items", items);
        return "basic/items";
    }

    @GetMapping("/{itemId}") // 해당 URI로 들어오는 쿼리를 변수로 쓸 수 있다
    public String item(@PathVariable Long itemId, Model model) {
        Item item = itemRepository.findById(itemId);
        model.addAttribute("item", item);
        return "basic/item";
    }

    @GetMapping("/add")
    public String addForm() {
        return "basic/addForm";
    }


    @PostMapping("/add")
    public String addItemV1(@RequestParam String itemName,
                       @RequestParam int price,
                       @RequestParam int quantity,
                       Model model) {

        Item item = new Item();
        item.setItemName(itemName);
        item.setPrice(price);
        item.setQuantity(quantity);

        itemRepository.save(item);

        model.addAttribute("item", item);

        return "/basic/item";
    }



    // 테스트용 데이터
    @PostConstruct
    public void init() {

        itemRepository.save(new Item("itemA", 10000, 10));
        itemRepository.save(new Item("itemB", 20000, 20));
        itemRepository.save(new Item("itemC", 30000, 30));
    }
}

최초에 /add URL로 접근하게 되면, GET 메서드에 의해 회원 등록 폼이 나타나게 되고, 해당 폼에서 데이터를 입력하고 저장을 하게 되면 현재 주소에 메시지 바디가 실린 POST 형태의 메시지가 전송되게 된다. -> 즉 이전의 item.html 파일을 그래도 사용할 수 있게 되었다.

 


자동으로 객체의 필드를 채워주는 @ModelAttribute

@RequestParam 으로 파라미터를 조회 하여 객체에 직접 매핑해주는 방법도 좋은 방법이지만, @ModelAttribute 를 통해 더 쉽게 객체에 파라미터를 매핑할 수 있다.

package hello.itemservice.web.basic;

import hello.itemservice.domain.item.Item;
import hello.itemservice.domain.item.ItemRepository;
import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import java.util.List;

@Controller
@RequestMapping("/basic/items")
@RequiredArgsConstructor // 생성자 만들어줌 + 생성자가 하나니까 AutoWired도 발생
public class BasicItemController {

    private final ItemRepository itemRepository;

    @GetMapping
    public String items(Model model) {
        List<Item> items = itemRepository.findAll();
        model.addAttribute("items", items);
        return "basic/items";
    }

    @GetMapping("/{itemId}") // 해당 URI로 들어오는 쿼리를 변수로 쓸 수 있다
    public String item(@PathVariable Long itemId, Model model) {
        Item item = itemRepository.findById(itemId);
        model.addAttribute("item", item);
        return "basic/item";
    }

    @GetMapping("/add")
    public String addForm() {
        return "basic/addForm";
    }


    @PostMapping("/add")
    public String addItemV2(@ModelAttribute("item") Item item, Model model) {

        itemRepository.save(item);

        model.addAttribute("item", item); // @ModelAttribute가 자동 추가 + 생략 가능

        return "/basic/item";
    }



    // 테스트용 데이터
    @PostConstruct
    public void init() {

        itemRepository.save(new Item("itemA", 10000, 10));
        itemRepository.save(new Item("itemB", 20000, 20));
        itemRepository.save(new Item("itemC", 30000, 30));
    }
}

@ModelAttribute 를 통해 자동으로 Item 객체를 생성하고, 프로퍼티 접근법으로 필드를 자동으로 입력해준다.

또한, 파라미터로 Model을 받으면 해당 Model 객체에 자동으로 생성한 객체를 넣어준다. 즉, model.addAttribute로 등록하지 않아도 자동으로 모델에 등록이 되어진다.

주의할 점은, 모델에 데이터를 담을 때는 객체의 이름이 반드시 필요하다. 이때 사용하는 것이 @ModelAttribute의 name= 옵션이다.

 

    @PostMapping("/add")
    public String addItemV3(@ModelAttribute Item item) {
        itemRepository.save(item);
        return "/basic/item";
    }

    @PostMapping("/add")
    public String addItemV4(Item item) {
        itemRepository.save(item);
        return "/basic/item";
    }

참고로 위와 같이 적어도 된다.

v3와 같은 경우에는 모델 에트리뷰트의 이름을 생략하면 대상 타입 클래스명의 제일 앞 글자를 소문자로 변환하여 저장한다. (Item -> item) -> 이게 제일 나은 방법 같음

v4 와 같은 경우에는 그냥 에노테이션 자체를 생략할 수 있는데, 내 생각엔 그렇게 좋은 방법은 아닌 것 같다. 목적이 너무 불명확함 !

'Project > Web' 카테고리의 다른 글

[Spring] MVC 패턴 웹 페이지 8 - PRG 패턴 적용하기 (새로고침 문제)  (0) 2025.06.25
[Spring] MVC 패턴 웹 페이지 7 - 상품 수정 하기 + 리다이렉션 처리  (0) 2025.06.25
[Spring] MVC 패턴 웹 페이지 5 - 상품 등록 폼  (0) 2025.06.25
[Spring] MVC 패턴 웹 페이지 4 - 상품 상세 페이지  (0) 2025.06.25
[Spring] MVC 패턴 웹 페이지 3 - HTML, 그리고 Thymeleaf  (0) 2025.06.25
'Project/Web' 카테고리의 다른 글
  • [Spring] MVC 패턴 웹 페이지 8 - PRG 패턴 적용하기 (새로고침 문제)
  • [Spring] MVC 패턴 웹 페이지 7 - 상품 수정 하기 + 리다이렉션 처리
  • [Spring] MVC 패턴 웹 페이지 5 - 상품 등록 폼
  • [Spring] MVC 패턴 웹 페이지 4 - 상품 상세 페이지
xuv2
xuv2
집에 가고 싶다
  • xuv2
    xuvlog
    xuv2
  • 전체
    오늘
    어제
    • 전체 글 모아보기 (170) N
      • 잡담 (9)
      • 도전 , 자격증 (2)
      • Error (5)
      • Java (23)
      • Spring (39) N
        • Core (10)
        • MVC (20)
        • Thymeleaf (9) N
      • DataBase (6)
        • Database Modeling (4)
        • SQL (2)
      • HTTP (11)
      • Network (17)
      • Software Engineering (3)
      • Operating System (3)
      • Algorithm (16)
      • Project (18)
        • Web (9)
        • iOS (8)
        • Python (1)
      • A.I (13)
      • Linux (5)
  • 블로그 메뉴

    • 홈
  • 링크

    • Github
  • 인기 글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
xuv2
[Spring] MVC 패턴 웹 페이지 6 - 상품 등록 처리하기 @ModelAttribute
상단으로

티스토리툴바