@RequestParam과 @ModelAttribute 모두 클라이언트로부터의 전달값을 핸들러의 매개변수로 매핑할 때 사용한다.
각각의 차이가 무엇인지 알아야한다.
@RequestParam
@RequestParam은 클라이언트에서 전송하는 전달값을 1:1로 매핑한다고 생각하면 된다.
예를 들어,
http://localhost:8080/name=kim?age=20
이런 식으로 전달값이 넘어왔다고 가정해보자.
우리는 HTTP Body에서 2개의 전달값을 추출할 수 있다. { "name" : "kim"과 "age" : 20 }이다.
이것들을 하나 하나 추출할 때 @RequestParam을 사용하는 것이다.
사용법을 확인해보면
@Controller
public class testController{
@GetMapping("/")
public class getPage(@RequestParam("name") String name, @RequestParam("age") int age){
System.out.println("이름 : " + name);
System.out.println("나이 : " + age);
return "test";
}
}
이런식으로 @ReqeustParam 뒤 괄호 안에 우리가 추출해야할 전달값의 이름을 넣어주고, 이를 받아줄 자바 변수를 뒤에 받아주면 된다.
이렇게 하나 하나 받는 경우도 좋지만 만약 받아야할 전달값이 5~6개이며, 이는 하나의 객체로 표현된다면?
@RequestParam으로 모두 사용하기에는 무리가 있다. 그래서 등장한 것이 @ModelAttribute이다.
@ModelAttribute
실제 개발을 하면 요청 파라미터를 받아서 필요한 객체를 만들고 그 객체에 값을 넣어주어야 한다. 위에서 사용한 @RequestParam을 사용한다면
@RequestParam String name;
@RequestParam int age;
ExData data = new ExData();
data.setName(name);
data.setAge(age);
이런식으로 표현될 것이다. 하지만 스프링은 이 과정을 완전히 자동화해주는 @ModelAttribute 기능을 제공한다.
먼저 요청 파라미터를 바인딩 받을 객체를 만들어야한다.
@Data
public class ExData{
private String name;
private int age;
}
@Data가 무엇인지 모르면 아래 글을 확인하면 좋을 듯 하다.
https://wonsjung.tistory.com/388?category=1013361
@Data
▶ @Data @Data 어노테이션은 @Getter / @Setter, @ToString, @EqualAndHashCode와 @RequiredArgsConstructor를 모두 다 합쳐놓은 큰 범주의 세트라고 할 수 있다. POJO(Plain Olde Java Objects)와 bean과 관련된..
wonsjung.tistory.com
바인딩 받을 객체를 만들었으니 이제 @ModelAttribute를 사용해보면
@ResponseBody
@RequestMapping("/model-attribute")
public String modelAttribute(@ModelAttribute ExData exData){
System.out.println("username = {}, age = {}", exData.getName(), exData.getAge());
return "ok";
}
ExData 객체가 생성되고, 요청 파라미터의 값도 모두 바인딩되어 존재한다.
스프링 MVC는 @ModelAttribute가 있으면 다음 과정을 실행한다.
- ExData객체를 생성한다.
- 요청 파라미터의 이름으로 ExData 객체의 프로퍼티를 찾는다. 그리고 해당 프로퍼티의 setter를 호출해서 파라미터의 값을 바인딩한다. setter를 호출하여 파라미터 값을 바인딩하므로 @Data를 사용하지 않으면 @Setter를 무조건 선언해주어야 한다.
'Spring > Lombok' 카테고리의 다른 글
빈 등록 어노테이션 @Bean @Configuration @Component (0) | 2022.05.15 |
---|---|
@PostConstruct @PreDestroy (0) | 2022.05.08 |
@Data (0) | 2022.05.03 |
@RestController @Requestbody @Responsebody (0) | 2022.05.03 |
@Transactional (0) | 2022.04.29 |