SPRING/Spring MVC

[SpringMVC] @ModelAttribute 와 Model

IT록흐 2023. 8. 17. 23:33
반응형

 

 

[SpringMVC] HTTP 요청 파라미터 - @ModelAttribute

[SpringMVC] HTTP 요청 파라미터 - @RequestParam [SpringMVC] 요청(Request)의 종류 ( GET, POST, JSON ) [SpringMVC] 웹서비스에서 Request(요청)가 처리되는 원리 ( + Servlet ) JAVA Runtime Enviroment(JRE)는 하나의 프로세스, 다

lordofkangs.tistory.com

 

 

지난 포스팅에서 @ModelAttribute에 대해서 알아보았다. @ModelAttribute는 Get이나 Post 방식으로 들어온 Request 데이터를 특정 객체에 담아 파라미터로 넘겨받는 어노테이션이다.

 

@ModelAttribute 파라미터 선언 

 

    @PostMapping("/add")
    public String addItemV1(@ModelAttribute Item item, Model model){
    
        itemRepository.save(item);        
        model.addAttribute("item", item); 
        
        return "basic/item";
    }

 

@ModelAttribute에는 Model 객체에 addAttribute하는 과정을 자동화하는 기능이 있다. 그래서 위 코드처럼 model.addAttribute 메소드를 직접 호출 안해줘도 Spring이 자동으로 해준다. 

 

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

 

@ModelAttribute에 value 값으로 "item"을 넣으면, Spring은 자동으로 Model 객체에 "item"을 key로 하여 item 객체를 등록한다. 다시 말하여, 자동으로 model.addAttribute("item", item); 을 실행한다. 그러므로 Controller에는 Model 관련 코드를 작성하지 않아도 된다. 

 

    @PostMapping("/add")
    public String addItemV3(@ModelAttribute Item item){

        itemRepository.save(item);

        return "basic/item";
    }

 

그런데 굳이 value값을 넣지 않아도 Spring이 Item(클래스 타입명)의 앞문자를 소문자로 바꾼 "item"을 key명으로 하여 Model에 추가한다. 

 

    @PostMapping("/add")
    public String addItemV4(Item item){ //@ModelAttribute도 생략가능
    
        itemRepository.save(item);
        return "basic/item";
        
    }

 

더 단순하게는 @ModelAttribute를 생략해도 된다. 원래 @ModelAttribute가 없는데 파라미터로 클래스 타입이 오면, Spring이 자동으로  GET이나 POST 방식으로 들어온 데이터를 담은 객체를 생성하여 넘긴다. 동시에 Model에도 추가를 하는 것이다. 

 

 

@ModelAttribute의 메소드 선언

 

@ModelAtttibute는 파라미터 뿐만 아니라 메소드에도 선언이 가능하다. 

 

@Controller
@RequestMapping("/form/items")
@RequiredArgsConstructor
public class FormItemController {

    private final ItemRepository itemRepository;

    @ModelAttribute("regions")  // @ModelAttribute 메소드에 선언
    public Map<String,String> regions(){
        Map<String,String> regions = new LinkedHashMap<>();
        regions.put("SEOUL","서울");
        regions.put("BUSAN","부산");
        regions.put("JEJU","제주");

        return regions;
    }
    
    @ModelAttribute //@ModelAttribute 메소드에 선언
    public void setAttributes(Model model) {
        model.addAttribute("key", "value");
    }

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

 

 

@ModelAttribute에 설정된 value값을 key값으로, 메소드의 반환값을 value로 하여 Model 객체에 추가한다. 그럼 어떤 Model에 추가할까? Controller에 선언된 모든 메소드의 Model에 공통으로 추가된다. @ModelAttribute가 선언된 메소드는 Controller의 메소드가 실행되기 전에 먼저 실행되어 Model에 미리 추가해놓는다. @ModelAttribute는 여러 개 선언되어도 되고 반환타입 없이 Model을 파라미터로 받아 설정해도 된다. 

 

 


 

 

참고자료

 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., 원

www.inflearn.com

 

[Spring] @ModelAttribute 파라미터에서 사용 방법 및 원리

@ModelAttribute 는 클라이언트로부터 일반 HTTP 요청 파라미터나 multipart/form-data 형태의 파라미터를 받아 객체로 사용하고 싶을 때 이용된다. 사용 방법 @ModelAttribute 는 parameter, method 레벨로 두 가지의

blog.karsei.pe.kr

 

반응형