본문 바로가기
Spring Tutorial

[스프링MVC -상품 관리 웹 개발 5] 상품 등록 처리 - @ModelAttribute

by 미소5 2023. 8. 31.

[스프링MVC - 상품 관리 웹 페이지 만들기 4] 상품 등록 폼 (tistory.com)

 

[스프링MVC - 상품 관리 웹 페이지 만들기 4] 상품 등록 폼

컨트롤러 로직 추가 /** 상품 등록 폼*/ @GetMapping("/add") public String addForm() { return "basic/addForm"; //단순히 뷰 템플릿만 호출 } 뷰 템플릿(templates) /resources/templates/basic/addForm.html 상품 등록 폼 상품 입력

joly156.tistory.com

 

이제 상품 등록 폼에서 전달된 데이터로  실제 상품을 등록 처리해보자.

 


  1. 요청 파라미터 형식을 처리해야 하므로 @RequestParam 을 사용
@PostMapping("/add")
public String addItemV1(@RequestParam String itemName,
 	 		@RequestParam int price,
 	 		@RequestParam Integer quantity,
	 		Model model) {
 
 	 Item item = new Item();	//Item 객체 생성
 	 item.setItemName(itemName);
	 item.setPrice(price);
	 item.setQuantity(quantity);
     
     //itemRepository를 통해 저장
	 itemRepository.save(item);		
     
     //저장된 item을 모델에 담아서
	 model.addAttribute("item", item);		//모델에 "item" 이름으로 저장된다
     
	 return "basic/item";	//뷰에 전달
 
}
  • @RequestParam String itemName
    • itemName 요청 파라미터 데이터(뷰템플릿에서 name="itemName")를 해당 변수에 받는다.

 


  • 뷰 템플릿(templates)
    • /resources/templates/basic/item.html

[스프링MVC - 상품 관리 웹 페이지 만들기 3] 상품 상세 (tistory.com)

 

[스프링MVC - 상품 관리 웹 페이지 만들기 3] 상품 상세

컨트롤러 로직 추가 /** 상품 상세(조회) */ @GetMapping("/{itemId}") public String item(@PathVariable Long itemId, Model model) { Item item = itemRepository.findById(itemId); //PathVariable 로 넘어온 상품ID로 item 조회하고 model.addA

joly156.tistory.com

 


2.  @ModelAttribute 을 사용

  • @RequestParam으로 변수를 하나하나 받아서 Item을 생성하지않고, @ModelAttribute를 사용해서 한번에 처리
@PostMapping("/add")
public String addItemV2(@ModelAttribute("item") Item item) {
    itemRepository.save(item);
    //model.addAttribute("item", item); //대상 객체는 모델에 자동 등록
    return "basic/item";
}
  1.  @ModelAttribute의 기능 - 요청 파라미터 처리
    • Item 객체를 생성하고, 요청 파라미터의 값을 프로퍼티 접근법(setXxx)으로 입력해준다.
  2.  @ModelAttribute의 기능 - Model 추가
    • 모델(Model)에 @ModelAttribute 로 지정한 객체를 자동으로 넣어준다.
      • model.addAttribute("item", item) 가 주석처리 되어 있어도 잘 동작하는 것을 확인할 수 있다.
    • 모델에 데이터를 담을 때, 이름은? @ModelAttribute에 지정한 name(value) 속성을 사용한다.
      • 만약 다음과 같이 @ModelAttribute의 이름을 다르게 지정하면 다른 이름으로 모델에 포함된다.
      • @ModelAttribute("hello") Item item  → 이름을 hello 로 지정
      • model.addAttribute("hello", item);  → 모델에 hello 이름으로 저장

 


/**@ModelAttribute 이름 생략 가능*/
@PostMapping("/add")
public String addItemV3(@ModelAttribute Item item) {
    itemRepository.save(item);
    //model.addAttribute(item); //자동 추가 //model에 저장되는 name은 클래스명 첫글자만 소문자
    return "basic/item";
}
  • @ModelAttribute 의 이름을 생략할 수 있다.
    • @ModelAttribute의 이름을 생략하면?  모델에 저장될 때 클래스명을 사용한다. 이때 클래스의 첫글자만 소문자로 변경해서 등록한다.
    • 예) @ModelAttribute 클래스명 → 모델에 자동 추가되는 이름
      • Item → item

 


/** @ModelAttribute 자체 생략 가능*/
@PostMapping("/add")
public String addItemV4(Item item) {
    itemRepository.save(item);
    //model.addAttribute(item) //자동 추가
    return "basic/item";
}

 


이 상품 등록 처리 컨트롤러에는 심각한 문제가 있다. 상품 등록을 완료하고 웹 브라우저의 새로고침 버튼을 클릭하면. 상품이 계속해서 중복 등록된다!

 

[스프링MVC 상품 관리 웹 페이지 7] PRG - Post/Redirect/Get (tistory.com)

 

[스프링MVC 상품 관리 웹 페이지 7] PRG - Post/Redirect/Get

[스프링MVC 상품 관리 웹 페이지 5] 상품 등록 처리 - @ModelAttribute (tistory.com) [스프링MVC 상품 관리 웹 페이지 5] 상품 등록 처리 - @ModelAttribute [스프링MVC - 상품 관리 웹 페이지 만들기 4] 상품 등록 폼

joly156.tistory.com

 

 

 



[스프링MVC 기본 기능 5] HTTP 요청 파라미터 - @RequestParam (tistory.com)

 

[스프링MVC 기본 기능 5] HTTP 요청 파라미터 - @RequestParam

[스프링MVC 36] 스프링 MVC 기본 기능: HTTP 요청 파라미터 - 쿼리 파라미터, HTML Form (tistory.com) [스프링MVC 36] 스프링 MVC 기본 기능: HTTP 요청 파라미터 - 쿼리 파라미터, HTML Form [스프링 MVC 10] 서블릿: HT

joly156.tistory.com

 

728x90
반응형