실제 개발을 하면 1. 요청 파라미터를 받아서, 2. 필요한 객체를 만들고, 3. 그 객체에 값을 넣어주어야 한다.
보통 다음과 같이 코드를 작성할 것이다.
@ResponseBody
@RequestMapping("/model-attribute-v1")
public String modelAttributeV1(@RequestParam String username, @RequestParam int age){ //1
HelloData data = new HelloData(); //2
data.setUsername(username); //3
data.setAge(age);
log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
return "ok";
}
스프링은 이 과정을 완전히 자동화해주는 @ModelAttribute 기능을 제공한다.
먼저 요청 파라미터를 바인딩 받을 객체를 만들자.
import lombok.Data;
@Data
public class HelloData {
private String username;
private int age;
}
- @Data
- @Getter , @Setter , @ToString , @EqualsAndHashCode , @RequiredArgsConstructor 를 자동으로 적용
- @ModelAttribute 적용
- HelloData 객체가 생성되고, 요청 파라미터의 값도 모두 들어가 있다!
- model.addAttribute(helloData) 코드도 함께 자동 적용된다.
@ResponseBody
@RequestMapping("/model-attribute-v1")
public String modelAttributeV1(@ModelAttribute HelloData helloData) {
log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
return "ok";
}
스프링MVC는 @ModelAttribute가 있으면 다음을 실행한다.
- HelloData 객체를 생성한다.
- 요청 파라미터의 이름으로 HelloData 객체의 프로퍼티를 찾는다.(username과 age) 그리고 해당 프로퍼티의 setter를 호출해서 파라미터의 값을 입력(바인딩) 한다.
- 예) 파라미터 이름이 username이면, setUsername() 메서드를 찾아서 호출하면서 값을 입력
- 프로퍼티
- 객체에 getUsername() , setUsername() 메서드가 있으면, 이 객체는 username 이라는 프로퍼티를 가지고 있다. username 프로퍼티의 값을 변경하면 setUsername() 이 호출되고, 조회하면 getUsername() 이 호출된다.
- 바인딩 오류
- age=abc 처럼 숫자가 들어가야 할 곳에 문자를 넣으면 BindException 이 발생한다. (바인딩 오류)
- @ModelAttribute 생략 가능
@ResponseBody
@RequestMapping("/model-attribute-v2")
public String modelAttributeV2(HelloData helloData) {
log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
return "ok";
}
그런데 @RequestParam 도 생략할 수 있으니 혼란이 생길 수 있다! 그래서 스프링은 해당 생략시 다음과 같은 규칙을 적용한다.
- String , int , Integer 같은 단순 타입 = @RequestParam 사용
- 그 외 나머지 = @ModelAttribute 사용 (argument resolver 로 지정해둔 타입은 @ModelAttribute 적용되지않음)
728x90
반응형
'Spring Tutorial' 카테고리의 다른 글
[스프링MVC 기본 기능 8] HTTP 요청 메시지 - JSON (0) | 2023.08.23 |
---|---|
[스프링MVC 기본 기능 7] HTTP 요청 메시지 - 단순 텍스트 (0) | 2023.08.23 |
[스프링MVC 기본 기능 5] HTTP 요청 파라미터 - @RequestParam (0) | 2023.08.22 |
[스프링MVC 기본 기능 4] HTTP 요청 파라미터 (GET, POST) (0) | 2023.08.21 |
[스프링MVC 기본 기능 3] HTTP 요청 - 헤더 조회 (0) | 2023.08.21 |