@ResponseBody
@RequestMapping("/request-param-v3")
public String requestParamV3(
@RequestParam String username,
@RequestParam int age
) {
log.info("username={}, age={}", username, age);
HelloData data = new HelloData();
data.setUserName(username);
data.setAge(age);
return "ok";
}
실제 개발을 하면 요청 파라미터를 받아서 필요한 객체를 만들고 값을 넣어주어야 한다.
보통은 위 코드처럼 데이터를 넣어주는 작업을 해야한다.
스프링은 위와 같은 과정을 자동화해주는 @ModelAttribute 기능을 제공한다.
먼저 요청 파라미터를 바인딩 받을 객체를 만들어본다.
HelloData
package hello.springmvc.basic;
import lombok.Data;
@Data
public class HelloData {
private String username;
private int age;
}
롬복 @Data
: @Getter, @Setter, @ToString, @EqualAndHashCode, @RequiredArgsConstructor 를 자동으로 적용해준다.
@ModelAttribute 적용 - modelAttributeV1
@ResponseBody
@RequestMapping("/model-attribute-v1")
public String modelAttributeV1(@ModelAttribute HelloData helloData) {
log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
log.info("helloData={}", helloData);
return "ok";
}
HelloData 객체가 생성되고, 요청 파라미터의 값도 모두 들어가 있다.
스프링 MVC는 @ModelAttribute 가 있으면 다음을 실행한다.
1) HelloData 객체를 생성한다.
2) 요청 파라미터의 이름으로 HelloData 객체의 프로퍼티를 찾는다. 그리고 해당 프로퍼티의 setter를 호출해서 파라미터의 값을 입력(바인딩) 한다.
3) 예) 파라미터 이름이 username이면, setUserName() 메서드를 찾아서 호출하면서 값을 입력한다.
프로퍼티
객체에 getUserName(), setUserName() 메서드가 있으면, 이 객체는 username 이라는 프로퍼티를 가지고 있다.
username 프로퍼티의 값을 변경하면 setUserName()이 호출되고, 조회하면 getUserName()이 호출된다.
class HelloData {
getUsername();
setUsername();
}
바인딩 오류
age=abc 처럼 숫자가 들어가야 할 곳에 문자를 넣으면 BIndException이 발생한다.
@ModelAttribute 생략 - modelAttributeV2
@ResponseBody
@RequestMapping("/model-attribute-v2")
public String modelAttributeV2(HelloData helloData) {
log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
log.info("helloData={}", helloData);
return "ok";
}
@ModelAttribute는 생략할 수 있다.
그런데 @RequestParam도 생략할 수 있으니 혼란이 발생할 수 있다.
스프링은 해당 생략 시 다음과 같은 규칙을 적용한다.
1) String, int, Integer 같은 단순 타입 = @RequestParam
2) 나머지 = @ModelAttribute (argument resolver로 지정해둔 타입 외에)
'스프링 > 스프링 웹' 카테고리의 다른 글
[Spring] HTTP 요청 메시지 - JSON (0) | 2023.06.12 |
---|---|
[Spring] HTTP 요청 메시지 - 단순 텍스트 (0) | 2023.06.12 |
[Spring] HTTP 요청 파라미터 - @RequestParam (0) | 2023.06.09 |
[Spring] HTTP 요청 파라미터 - 쿼리 파라미터, HTML Form (0) | 2023.06.09 |
[Spring] HTTP 요청 - 기본, 헤더 조회 ( MultiValueMap 등) (0) | 2023.06.08 |
댓글