HTTP 요청 메시지를 통해 데이터를 전달하는 세 가지 방법 중 GET, POST 메서드를 통해 요청하는 경우 사용하는 방식이다.
먼저 요청 파라미터를 바인딩 받을 객체를 만든다.
@Data 어노테이션은 @Getter, @Setter, @ToString, @EqualsAndHashCode, @RequiredArgsConstructor를 자동으로 적용해준다.
package hello.springmvc.basic;
import lombok.Data;
@Data
public class HelloData {
private String username;
private int age;
}
지금까지는 @RequestParam을 통해 username, age를 받고 새로운 객체를 선언한 다음에 그 값을 넣어줬었다.
@ResponseBody
@RequestMapping("/model-attribute-v1")
public String modelAttribute(@RequestParam String username, @RequestParam int age) {
HelloData helloData = new HelloData();
helloData.setUsername(username);
helloData.setAge(age);
log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
return "ok";
}
하지만 @ModelAttribute를 사용하면 코드를 매우 가볍게 바꿀 수 있다. @ModelAttribute의 작동 원리는 다음과 같다.
① 'HelloData' 객체를 생성한다.
② 요청 파라미터의 이름으로 'HelloData' 객체의 프로퍼티를 찾는다. 그리고 해당 프로퍼티의 setter를 호출하여 파라미터의 값을 바인딩한다.
파라미터 이름이 username이면 'setUsername()' 메서드를 찾아서 호출하면서 값을 입력한다. (@Data 어노테이션에 의해 Getter & Setter도 생성되어 있으므로, 객체에 getUsername() , setUsername() 메서드가 있다.)
// 중요
@ResponseBody
@RequestMapping("/model-attribute-v1")
public String modelAttribute(@ModelAttribute HelloData helloData) {
log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
return "ok";
}
@ModelAttribute, @RequestParam 생략? 스프링의 해석
String, int, Integer 같은 단순 타입의 경우 @RequestParam을 사용하지만, 나머지(직접 생성한 객체 등)는 @ModelAttribute를 사용한다.
# 예외 - Argument Resolver로 지정해둔 타입은 @ModelAttribute가 적용되지 않는다.
'🌱 Spring > MVC ①' 카테고리의 다른 글
[Spring] HTTP 응답 _ 정적 리소스, 뷰 템플릿 (0) | 2023.07.24 |
---|---|
[Spring] HTTP message body에 데이터 담아서 요청하기 (0) | 2023.07.24 |
[Spring] HTTP 요청 - 헤더 & 파라미터 조회(@RequestParam) (0) | 2023.07.22 |
[Spring] RequestMapping _ API 매핑 (0) | 2023.07.22 |
[Spring] Logging (0) | 2023.07.22 |