쌓고 쌓다

@ModelAttribute ? 본문

프로그래밍/spring

@ModelAttribute ?

승민아 2023. 8. 12. 12:07

예를 들어, 회원 객체를 만들기 위해

요청 파라미터로 필드 값을 받아 객체를 초기화하는 과정을 거친다.

 

먼저 HelloData 클래스를 보자.

HelloData

@Data
public class HelloData {
    private String username;
    private int age;
}

 @Data에는 Getter,Setter, toString 등 존재하여 편하게 사용할 수 있다.

 

 

요청 파라미터로 들어온 이름, 나이를 객체를 생성하여 값을 넣어주는 과정을 거친다.

@ResponseBody
@RequestMapping("/model-attribute-v1")
public String modelAttributeV1(@RequestParam String username, @RequestParam int age) {
    HelloData helloData = new HelloData();
    helloData.setUsername(username);
    helloData.setAge(age);
    return"ok";
}

 

위의 과정을 스프링 @ModelAttribute로 자동화 할 수 있다.

@ResponseBody
@RequestMapping("/model-attribute-v2")
public String modelAttributeV2(@ModelAttribute HelloData helloData) {
    log.info("helloData = {}", helloData);
return"ok";
}

스프링은 @ModelAttribute가 있다면 아래의 과정을 거친다.

  1. HelloData 객체를 생성한다.
  2. 요청 파라미터 이름으로 HelloData의 프로퍼티를 찾아 해당 프로퍼티 setter를 호출해 값을 바인딩한다.
  3. 바인딩할때 age에는 숫자가 들어가야하나 문자처럼 다른 타입이 들어간다면 BindException이 발생한다.

 

@ModelAttribute 생략

@ResponseBody
@RequestMapping("/model-attribute-v3")
public String modelAttributeV3(HelloData helloData) {
    log.info("helloData = {}", helloData);
return"ok";
}

이 어노테이션도 생략할 수 있다. @RequestParam도 생략이 가능하기에 헷갈릴 수 있는데

스프링은 아래의 규칙을 갖는다.

String, int, Integer 같은 단순 타입이면 => @RequestParam

그외 => @ModelAttribute

 

@ModelAttribute는 model.addAttribute(helloData)도 생성

model.addAttribute("helloData", helloData);

@ModelAttribute를 사용하면 위의 코드가 자동으로 적용된다.

 

<h1 th:text="${helloData.username}"></h1>
<h1 th:text="${helloData.age}"></h1>

따로 Model에 넣어주지 않았는데도 모델에 값이 들어가 있다.

 

모델에 담을 이름을 바꾸고싶다면

@ModelAttribute(name = "TEST") HelloData helloData

@ModelAttribute가 생략되면 (+name 속성이 생략되어도 마찬가지)

클래스명의 첫 글자를 소문자로 바꿔 모델이 담는다.

HelloData -> helloData로 모델이 담김.

주의! 파라미터명이 아닌 클래스명으로 모델에 담는다.

 

 

<h1 th:text="${TEST.username}"></h1>
<h1 th:text="${TEST.age}"></h1>

name 속성값을 변경하여 모델에 담길 이름을 바꿀 수 있다.

 

정리하자면 @ModelAttribute는 파라미터 이름으로 객체 생성과 값의 초기화를 자동으로 해주는 어노테이션이며

모델에 값을 자동으로 넣는다.

Comments