티스토리 뷰
프레임워크/SpringBoot
[SpringBoot] HTTP 요청 다루기(@RequestBody, @RequestParam, @ModelAttribute)
제로빈 2025. 4. 8. 14:07Spring Boot는 RESTful API와 웹 애플리케이션 개발을 쉽게 만들어주는 강력한 프레임워크입니다. 클라이언트로부터 데이터를 받을 때 자주 사용되는 어노테이션인 @RequestBody, @RequestParam, @ModelAttribute는 각각의 역할과 사용 시나리오가 다릅니다. 이 포스팅에서는 이 세 가지 어노테이션의 차이점을 명확히 짚어보고, HTTP 요청의 속성과 연관 지어 어떻게 동작하는지 알아보겠습니다. 또한, 각 어노테이션에 대한 간단한 예제 코드를 통해 실무에서 어떻게 활용할 수 있는지 살펴보겠습니다.
1. @RequestBody(@ResponseBody)
설명
- @RequestBody: HTTP 요청의 본문(body)에 포함된 데이터를 Java 객체로 변환합니다. 주로 JSON이나 XML 형식의 데이터를 처리하며, POST나 PUT 같은 HTTP 메서드와 잘 어울립니다. HTTP 요청 본문은 클라이언트가 서버로 데이터를 보낼 때 사용되며, Content-Type 헤더(예: application/json)에 따라 데이터 형식이 결정됩니다.
- @ResponseBody: 컨트롤러 메서드의 반환 값을 HTTP 응답 본문으로 직접 전송합니다. View를 렌더링하지 않고, JSON이나 XML 같은 형식으로 클라이언트에 데이터를 반환할 때 사용됩니다. 이는 RESTful API에서 주로 활용되며, Accept 헤더를 통해 클라이언트가 원하는 응답 형식을 지정할 수 있습니다.
예제
- 컨트롤러
@RestController // @Controller + @ResponseBody를 포함
public class UserController {
@PostMapping("/users")
public User createUser(@RequestBody User user) {
// 요청 본문에서 받은 데이터를 처리
return user; // @ResponseBody로 인해 JSON으로 반환
}
}
class User {
private String id;
private String gender;
private String bitrh;
// Getter, Setter 생략
}
- HTTP 요청
POST /users HTTP/1.1
Host: localhost:8080
Content-Type: application/json
{"id": "zerobin", "gender": "m", "birth": "1220"}
- HTTP 응답
HTTP/1.1 200 OK
Content-Type: application/json
{"id": "zerobin", "gender": "m", "birth": "1220"}
- @RequestBody: 클라이언트가 보낸 JSON 데이터를 User 객체로 변환합니다.
- @ResponseBody: 메서드에서 반환된 User 객체를 다시 JSON으로 직렬화하여 응답 본문에 담아 보냅니다.
@RestController는 @Controller와 @ResponseBody를 결합한 어노테이션으로, 모든 메서드에 @ResponseBody가 기본 적용됩니다.
2. @RequestParam(@PathVariable)
설명
- @RequestParam: URL의 쿼리 파라미터나 폼 데이터에서 개별 값을 추출합니다. 주로 GET 요청에서 쿼리 문자열을 처리하거나, POST 요청에서 application/x-www-form-urlencoded 형식의 데이터를 받을 때 사용됩니다. HTTP에서 쿼리 파라미터는 URL에 ? 뒤에 key-value 쌍으로 추가되며, 간단한 데이터 전송에 적합합니다.
- @PathVariable: URL 경로에 포함된 변수를 추출합니다. RESTful API에서 자원의 식별자를 가져올 때 주로 사용되며, GET, DELETE, PUT 등 다양한 HTTP 메서드와 잘 어울립니다. HTTP에서 경로 변수는 URL 구조를 통해 데이터를 전달하는 방식으로, 깔끔하고 직관적인 API 설계를 돕습니다.
예제
- 컨트롤러
@RestController
public class UserController {
@GetMapping("/users/{username}/detail")
public String getUserDetail(
@PathVariable String username,
@RequestParam String gender,
@RequestParam int birth) {
return "User Detail - Username: " + username +
", Gender: " + gender +
", Birth: " + birth;
}
}
- HTTP 요청
GET /users/zerobin/detail?gender=m&birth=1220 HTTP/1.1
Host: localhost:8080
- HTTP 응답
"User Detail - Username: zerobin, Gender: m, Birth: 1220"
- @PathVariable은 URL 경로에 포함된 변수를 추출합니다. 주어진 URL에서 /users/zerobin/detail 부분을 보면, zerobin이 경로 변수로 사용될 수 있습니다. 이는 RESTful API에서 자원을 식별하는 데 유용하며, 주로 고유 식별자나 특정 엔드포인트를 나타낼 때 사용됩니다.
- @RequestParam은 URL의 쿼리 파라미터에서 값을 추출합니다. 주어진 URL에서 ?gender=m&birth=1220 부분은 쿼리 파라미터로, gender와 birth라는 키에 각각 m과 1220 값이 포함되어 있습니다. 이는 검색 조건이나 추가 정보를 전달할 때 적합합니다.
3. @ModelAttribute
설명
- @ModelAttribute는 주로 HTML 폼 데이터를 객체로 바인딩할 때 사용됩니다. GET/POST 요청에서 복잡한 데이터를 한 번에 객체로 매핑하며, Spring MVC에서 View와 Controller 간 데이터를 전달하는 데 유용합니다. HTTP에서는 주로 application/x-www-form-urlencoded 형식의 폼 데이터를 처리하며, 객체의 필드 이름과 폼의 입력 이름이 일치해야 합니다.
예제
- 컨트롤러
@Controller
public class UserController {
@PostMapping("/users")
public String createUser(@ModelAttribute User user) {
return "User created: " + user.getId();
}
}
class User {
private String id;
private String gender;
private String bitrh;
// Getter, Setter 생략
}
- HTTP 요청
POST /users HTTP/1.1
Host: localhost:8080
Content-Type: application/x-www-form-urlencoded
id=zerobin&gender=m&birth=1220
- HTTP 응답
User created: zerobin
- 복잡한 데이터를 객체로 맵핑할 수 있습니다.
정리
어노테이션 | 역할 | 데이터 위치 | HTTP 메서드 | 데이터 형식 | 사용 예시 |
@RequestBody
|
요청 본문(body)을 객체로 매핑
|
요청 본문
|
POST, PUT
|
JSON, XML
(application/json) |
REST API 데이터 수신
|
@ResponseBody |
반환 값을 응답 본문으로 전송
|
응답 본문
|
모든 메서드
|
JSON, XML
(application/json) |
REST API 데이터 반환
|
@RequestParam |
쿼리 파라미터나 폼 데이터 추출
|
쿼리 파라미터/폼
|
GET, POST
|
쿼리 문자열, URL-encoded
|
검색 조건, 간단한 입력
|
@PathVariable |
URL 경로 변수 추출
|
URL 경로
|
GET, DELETE,
PUT |
경로에 포함된 값
|
자원 식별 (ID 등)
|
@ModelAttribute |
폼 데이터를 객체로 바인딩
|
폼 데이터
|
POST
|
URL-encoded
(폼 데이터) |
회원가입 폼 처리
|
- @RequestBody와 @ResponseBody: RESTful API에서 요청과 응답을 JSON/XML로 주고받을 때 핵심적인 역할을 합니다. HTTP의 Content-Type과 Accept 헤더에 따라 데이터 형식이 결정됩니다.
- @RequestParam과 @PathVariable: 둘 다 GET 요청과 잘 어울리지만, @RequestParam은 유연한 필터링에, @PathVariable은 자원 식별에 강점을 가집니다.
- @ModelAttribute: Spring MVC에서 폼 데이터를 처리하며, HTTP POST 요청과 application/x-www-form-urlencoded 형식에 적합합니다.
감사합니다.
'프레임워크 > SpringBoot' 카테고리의 다른 글
[SpringBoot] 문자열과 파일 동시에 업로드하기(With Vue) (0) | 2025.03.28 |
---|---|
[SpringBoot] RabbitMQ 튜토리얼 (0) | 2025.03.10 |
[SpringBoot] RestErrorAdvice 설정하는 방법(SpringSecurity+JWT) (0) | 2025.01.16 |
[SpringBoot] Docker 배포 가이드 (2) | 2024.12.30 |
[SpringBoot] JPA + GraphQL 연동 예제 (2) | 2024.12.23 |
최근에 올라온 글
- Total
- Today
- Yesterday