-
HTTP 데이터를 객체로 처리하는 방법spring/스프링 입문 주차 2024. 1. 18. 12:03
@ModelAttribute
POST http://localhost:8080/hello/request/form/model// [Request sample] // POST http://localhost:8080/hello/request/form/model // Header // Content type: application/x-www-form-urlencoded // Body // name=Robbie&age=95 @PostMapping("/form/model") @ResponseBody public String helloRequestBodyForm(@ModelAttribute Star star) { return String.format("Hello, @ModelAttribute.<br> (name = %s, age = %d) ", star.name, star.age); }
- HTML의 form 태그를 사용하여 POST 방식으로 HTTP 요청을 보낼 수 있다.
- 이때 해당 데이터는 HTTP Body에 name=Robbie&age=95 형태로 담겨져서 서버로 전달된다.
- 해당 데이터를 Java의 객체 형태로 받는 방법은 @ModelAttribute 애너테이션을 사용한 후
Body 데이터를 Star star 객체를 선언한다.Query String 방식
GET http://localhost:8080/hello/request/form/param/model?name=Robbie&age=95// [Request sample] // GET http://localhost:8080/hello/request/form/param/model?name=Robbie&age=95 @GetMapping("/form/param/model") @ResponseBody public String helloRequestParam(@ModelAttribute Star star) { return String.format("Hello, @ModelAttribute.<br> (name = %s, age = %d) ", star.name, star.age); }
- ?name=Robbie&age=95 처럼 데이터가 두 개만 있다면 괜찮지만, 여러개 있다면
@RequestParam 애너테이션으로 하나 씩 받아오기 힘들 수 있다.
- 이때 @ModelAttribute 애너테이션을 사용하면 Java의 객체로 데이터를 받아올 수 있다.
- 파라미터에 선언한 Star 객체가 생성되고, 오버로딩된 생성자 혹은 Setter 메서드를 통해
요청된 name & age 의 값이 담겨진다.
@ModelAttribute 또한 생략이 가능하다
그렇다면 Spring은 생략된 @ModelAttribute 와 @RequestParam을 어떻게 구분할까?
간단하게 설명하면 Spring은 해당 파라미터(매개변수)가 SimpleValueType이라면 @RequestParam으로 간주하고,
아니라면 @ModelAttribute가 생략되어있다고 판단한다.
SimpleValueType은 원시타입(int), Wraper타입(Integer), Date등의 타입을 의미한다.
Body JSON 데이터
다음은 HTTP Body에 JSON 데이터를 전달 받았을 때, 데이터를 Java의 객체로 받는 방법을 알아보자.
POST http://localhost:8080/hello/request/form/json// [Request sample] // POST http://localhost:8080/hello/request/form/json // Header // Content type: application/json // Body // {"name":"Robbie","age":"95"} @PostMapping("/form/json") @ResponseBody public String helloPostRequestJson(@RequestBody Star star) { return String.format("Hello, @RequestBody.<br> (name = %s, age = %d) ", star.name, star.age); }
- HTTP Body에 {"name":"Robbie","age":"95"} JSON 형태로 데이터가 서버에 전달되었을 때
@RequestBody 애너테이션을 사용해 데이터를 객체 형태로 받을 수 있다.
데이터를 Java의 객체로 받아올 때 주의할 점이 있다.
- 해당 객체의 필드에 데이터를 넣어주기 위해 set or get 메서드 또는 오버로딩 된 생성자가 필요하다.
- 예를 들어 @ModelAttribute 사용하여 데이터를 받아올 때 해당 객체에 set메서드 혹은 오버로딩 된 생성자
가 없다면 받아온 데이터를 객체의 필드에 담을 수 없다.
- 이처럼 객체로 데이터를 받아올 때 데이터가 제대로 들어오지 않는다면 우선 해당 객체의 set or get 메서드
또는 오버로딩된 생성자의 유무를 확인하면 좋다.'spring > 스프링 입문 주차' 카테고리의 다른 글
IoC Container 와 Bean (0) 2024.01.22 JDBC란 무엇일까? (0) 2024.01.18 PathVariable과 ReqestParam (0) 2024.01.18 스프링에서 Jackson 형태로 반환하는 법 (0) 2024.01.18 Controller 이해하기 (0) 2024.01.17