쌓고 쌓다
@ModelAttribute ? 본문
예를 들어, 회원 객체를 만들기 위해
요청 파라미터로 필드 값을 받아 객체를 초기화하는 과정을 거친다.
먼저 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가 있다면 아래의 과정을 거친다.
- HelloData 객체를 생성한다.
- 요청 파라미터 이름으로 HelloData의 프로퍼티를 찾아 해당 프로퍼티 setter를 호출해 값을 바인딩한다.
- 바인딩할때 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는 파라미터 이름으로 객체 생성과 값의 초기화를 자동으로 해주는 어노테이션이며
모델에 값을 자동으로 넣는다.
'프로그래밍 > spring' 카테고리의 다른 글
HTTP 메시지 컨버터? (0) | 2023.08.13 |
---|---|
HTTP 요청 메시지 바디에 TEXT, JSON 받기 (@RequestBody) (0) | 2023.08.12 |
[스프링 부트] 게시글 수정시 첨부파일 수정 방법 - 22 (0) | 2023.08.11 |
@RequestParam + required / defaultValue / Map (0) | 2023.08.10 |
[스프링 부트] 첨부파일(파일 업로드) 목록 수정 - 21 (0) | 2023.08.09 |
Comments