HTTP 요청 파라미터 - @ModelAttribute
@ModelAttribute는 요청 정보를 객체로 변환해줄 뿐만 아니라, 이 객체를 Model에 넣어줄 수도 있다! @ModelAttribute("name") : "name"이라는 이름으로 객체를 Model에 넣는다! name을 생략가능한데 이 때는 클래스명의 첫 글자를 소문자로 바꾼 것을 이름으로 Model에 넣는다! @ModelAttribute 자체도 생략가능. 주의 요망! primitive type, argument resolver 이외의 것을 생략하면(객체라고 생각하면 편함) 메시지 바디가 아니라 요청 파라미터를 처리한다! 메시지 바디의 데이터(API)를 조회, 처리하고 싶으면 명시해주어야한다! 그리고 요청 파라미터인 경우에도 명시해주는 것이 좋다!
실제 개발을 하면 요청 파라미터를 받아서 필요한 객체를 만들고 그 객체에 값을 넣어주어야 한다. 보통 다음과 같이 코드를 작성할 것이다.
=>스프링은 이 과정을 완전히 자동화해주는 @ModelAttribute 기능을 제공한다.
스프링MVC는 @ModelAttribute 가 있으면 다음을 실행한다.
HelloData 객체를 생성한다.
요청 파라미터의 이름으로 HelloData 객체의 프로퍼티를 찾는다. 그리고 해당 프로퍼티의 setter를 호출해서 파라미터의 값을 입력(바인딩) 한다. ex) 예) 파라미터 이름이 username 이면 setUsername() 메서드를 찾아서 호출하면서 값을 입력한다.
프로퍼티
getXXX, setXXX 과 같은 것들이 프로퍼티이다. ex) 객체에 getUsername() , setUsername() 메서드가 있으면, 이 객체는 username 이라는 프로퍼티를 가지고 있다.
바인딩 오류
age=abc 처럼 숫자가 들어가야 할 곳에 문자를 넣으면 BindException 이 발생한다. 이런 바인딩 오류를 처리하는 방법은 검증 부분에서 다룬다.
@RequestParam과 마찬가지로 @ModelAttribute 도 애노테이션을 생략할 수 있다. 스프링은 해당 생략시 다음과 같은 규칙을 적용한다.
String , int , Integer 같은 단순 타입 = @RequestParam
나머지 = @ModelAttribute (argument resolver 로 지정해둔 타입 외)
Last updated
Was this helpful?