HTTP 데이터를 객체로 처리하는 방법
클라이언트가 서버로 요청을 보낼 때 HTTP 요청을 사용는데, 이때 데이터는 보통 URL 쿼리스트링, HTML Form 데이터 혹은 JSON 같은 형태로 전달된다. 단순히 문자열로 들어오는 데이터를 일일이 파라미터로 받으면 코드가 길어지고 유지보수가 어려워지는데, Spring에서는 이런 문제를 해결하기 위해 HTTP의 데이터를 서버에서 Java의 객체로 저장하는 기능을 제공한다.
이후 설명할 @ModelAttribute와 @RequestBody는 각각 쿼리/폼 데이터와 JSON 요청 바디를 객체로 매핑하는 대표적인 방법이다.
@ModelAttribute
Client(브라우저)에서 URL 쿼리 파라미터(ex.?name=개발자&age=30)에서 데이터를 서버로 보내 Java 객체와 매핑하는 방식
💡Query String 방식
@GetMapping("/user")
public String getUser(
@RequestParam String name,
@RequestParam int age,
@RequestParam String address,
@RequestParam String phone,
@RequestParam String email
) {
...
}
➡️ 여러 데이터를 @RequestParam으로 받아오는 경우
- ?name=Robbie&age=95 처럼 데이터가 두 개만 있다면 괜찮지만 여러 개 있다면 @RequestParam 어너테이션으로 데이터를 하나 씩 받아오기 힘들 수 있다.
@GetMapping("/user")
public String getUser(@ModelAttribute User user) {
...
}
- 이때 @ModelAttribute 애너테이션을 사용하면 Java의 객체로 데이터를 받아올 수 있다.
public class User {
private String name;
private int age;
private String address;
private String phone;
private String email;
// getter/setter
}
- 파라미터에 선언한 Star 객체가 생성되고, 오버로딩된 생성자 혹은 Setter 메서드를 통해 요청된 name & age의 값이 저장된다.
- 이때, 쿼리 파라미터의 key명과 객체의 필드명이 일치해야한다.
💡form 태그 POST
<form method="POST" action="/hello/request/form/model">
<div>
이름: <input name="name" type="text">
</div>
<div>
나이: <input name="age" type="text">
</div>
<button>전송</button>
</form>
- POST는 Body에 데이터를 싣기 위해 HTML의 form 태그를 사용하여 서버에 HTTP 요청을 보낼 수 있다.
- 이때 해당 데이터는 HTTP Body에 name=Robbie&age=95 형태로 담겨져서 서버로 전달됩니다.
// [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);
}
- 해당 데이터를 Java의 객체 형태로 받는 방법은 @ModelAttribute 애너테이션을 사용한 후 Body 데이터를 받아올 객체 Star star를 선언한다.
- URL : POST http://localhost:8080/hello/request/form/model
💡@ModelAttribute 생략
Spring에서는 @ModelAttribute뿐만 아니라 @RequestParam도 생략이 가능한데, 이를 어떻게 구분할까?
- 간단하게 설명하자면 Spring은 해당 파라미터(매개변수)가 SimpleValueType이라면 @RequestParam으로 간주하고 아니라면 @ModelAttribute가 생략되어있다 판단
- SimpleValueType은 원시타입(int), Wrapper타입(Integer), Date등의 타입을 의미
@RequestBody
HTTP Body (JSON, XML 등 Raw 데이터)를 통해 서버에 데이터를 보내고, Java 객체로 변환하는 방식
💡Body JSON 데이터
- HTTP Body에 JSON 데이터를 담아 서버에 전달할 때 해당 Body 데이터를 Java의 객체로 전달 받을 수 있다.
- 이때, RequestBody를 통해 클라이언트로 전달되는 JSON의 key명과 객체의 필드명이 일치해야한다.
POST /users
Content-Type: application/json
{
"name": "개발자",
"age": 30
}
public class User {
private String name;
private int age;
// getter/setter
}
➡️ name과 age가 일치하므로 정상적으로 바인딩
출처
https://teamsparta.notion.site/1-15-HTTP-2252dc3ef5148148b4dce2608f91669a
챕터1-15 : HTTP 데이터를 객체로 처리하는 방법 | Notion
@ModelAttribute
teamsparta.notion.site
'심화 > Spring' 카테고리의 다른 글
| [Spring] MySQL과 IntelliJ 연동하기 (Mac) (0) | 2025.09.29 |
|---|---|
| [Spring] DTO란? (0) | 2025.09.26 |
| [Spring] PathVariable과 RequestParam (0) | 2025.09.24 |
| [Spring] Spring MVC란? (0) | 2025.09.23 |
| [Spring] HTTP란 무엇일까? (1) | 2025.09.22 |