지난 포스팅에서 GET, POST 같은 방식으로 요청이 들어오는 경우, @RequestParam 어노테이션으로 요청 데이터를 가져오는 과정을 다루어 보았다.
Handler, 즉 Controller는 Request 객체에 직접 의존하지 않고 HandlerAdapter에게 파라미터로 필요한 데이터를 명시하는 방법을 사용한다. 이로써 Controller는 오로지 비즈니스 로직에 필요한 데이터만 전달받을 수 있게 된다. 여기서 필요한 데이터를 구체적으로 명시하기 위해 어노테이션을 사용하는데, 대표적으로 @RequestParam과 @ModelAttribute가 있다.
@RequestParam은 String, int, Integer 같은 단순한 타입의 데이터를 가져올 때 사용한다. @ModelAttribute는 조금더 복잡한 이유로 사용된다.
Controller
@RequestMapping("/request-attribute")
public String modelAttributeV0(@RequestParam String username,@RequestParam int age){
HelloData helloData = new HelloData(); // 객체 생성
helloData.setUsername(username);
helloData.setAge(age);
// [ 비즈니스 로직... ]
return "OK";
}
보통 Request에서 데이터를 가져오면, 비즈니스 로직에 들어가기 전에 데이터를 토대로 객체를 생성한다. Spring WEB은 이 과정을 자동화하는 어노테이션을 제공하는데, 그것이 @ModelAttribute이다. Request의 데이터를 토대로 객체를 생성하여 파라미터로 전달하는 것이다.
Controller
@RequestMapping("/request-attribute")
public String modelAttributeV1(@ModelAttribute HelloData helloData){
//[ 비즈니스 로직 ]
return "OK";
}
@ModelAttribute로 표시된 파라미터를 보면 HelloData를 확인할 수 있다. HelloData의 필드는 Request의 데이터와 일치하는 이름으로 되어 있다.
HelloData
@Data
public class HelloData {
private String username;
private int age;
}
HelloData 객체가 자동으로 생성될 때 Setter 함수로 데이터를 주입받는다. 그러므로 @ModelAttribute의 파라미터로 사용되는 객체는 반드시 setter 함수가 있어야 한다. @Data는 getter와 setter를 만들어주는 어노테이션이다.
Controller
@RequestMapping("/request-attribute")
public String modelAttributeV1(HelloData helloData){
//[ 비즈니스 로직 ]
return "OK";
}
@ModelAttribute가 생략된 형태도 가능하다. String,int, Integer가 아니라 특정 객체를 매개변수로 한다면 @ModelAttribute가 생략되어도 @ModelAttribute로 선언된 것으로 디폴트로 인식하고 요청 데이터를 주입하여 객체를 생성하고 파라미터로 넘긴다.
정리하면, GET, POST 같은 방식으로 들어온 데이터를 특정한 객체로 받고 싶다면 매개변수를 특정 객체로 지정하고 @ModelAttribute로 표시를 남겨야 한다. 이때 특정한 객체는 반드시 Setter 함수가 있어야 한다. 그리고 @ModelAttribute는 생략 가능하다.
참고자료
'SPRING > Spring MVC' 카테고리의 다른 글
[SpringMVC] HTTP 응답 - Controller 반환타입 (0) | 2023.08.14 |
---|---|
[SpringMVC] HTTP 요청 메시지 - TEXT, JSON (0) | 2023.08.12 |
[SpringMVC] HTTP 요청 파라미터 - @RequestParam (0) | 2023.08.11 |
[SpringMVC] HTTP 요청 파라미터 - @RequestHeader (0) | 2023.08.11 |
[SpringMVC] @RequestMapping의 다양한 속성 (0) | 2023.08.10 |