Client에서 Server로 Data를 전달하는 방법은 Query Parameter, HTTP Form Data, HTTP Request Body 크게 세가지가 있다.
1. GET + Query Parameter(=Query String)
: URL의 쿼리 파라미터를 사용하여 데이터 전달하는 방법 / 주로 GET 요청에서 사용
HttpServletResponse를 사용해서 응답값을 직접 다룰 수 있다.
받는 방식 : RequestParam
2. POST + HTML Form(Content-Type 기본값: application/x-www-form-urlencoded)
: HTTP Request Body에 쿼리 파라미터 형태로 전달하는 방법 / HTML <form> 을 사용할 때 자동으로 생긴다.
데이터는 key=value&key2=value2 형태로 Body에 담긴다.
받는 방식 : RequestParam
3. HTTP Request Body(Content-Type: application/json일 경우 대표적)
: 보통 JSON이나 XML등 구조화된 데이터를 전송 / @RestController에서 주로 사용
POST, PUT, PATCH Method에서 사용한다.
받는 방식 : Request Body
간단하게 요청을 받는 방식을 보자면,
| 구분 | @RequestParam | HTML form | @RequestBody |
| 위치 | URL 또는 body | body | body |
| 형태 | key=value | key=value | JSON, XML 등 |
| Content-Type | x-www-form-urlencoded | x-www-form-urlencoded, multipart/form-data | application/json, text/plain 등 |
| Spring에서 받는 방식 | @RequestParam | @RequestParam | @RequestBody |
- @RequestParam은 URL 쿼리 파라미터나 HTML Form에서 간단한 key=value 데이터를 처리할 때 사용한다. GET 요청에서 주로 사용되며, URL에 데이터를 포함해서 보낼 때 사용된다.
- @RequestBody는 HTTP 요청 본문에서 복잡한 JSON 객체나 다른 데이터 형식을 처리할 때 사용된다. POST, PUT, PATCH 요청에서 주로 사용되며, 더 복잡한 데이터 구조나 큰 데이터를 처리할 때 적합하다.
따라서, 어떤 형식의 데이터를 주고받을지에 따라 @RequestParam 또는 @RequestBody를 선택하면 된다.
JSON과 TEXT는 데이터 구조에서의 차이가 있는데,
| 항목 | JSON | TEXT |
| Content-Type | application/json | text/plain |
| 데이터 구조 | 구조화된 객체 (Key-Value) | 단순 문자열 |
| 스프링 매핑 | 객체로 매핑 (@RequestBody) | 문자열로 매핑 (@RequestBody) |
| 사용 목적 | API 요청/응답, 데이터 교환 | 테스트용 메시지, 간단한 입력 |
추가적으로,
HttpServletRequest란?
- 클라이언트가 보낸 HTTP 요청의 전체 정보(주소, 파라미터, 헤더, 바디 등)를 담고 있는 객체
- 요청 메서드, URL, 파라미터, 헤더, 바디 등의 정보를 조회할 수 있다.
주요 기능
| 메서드 | 설명 |
| getMethod() | 요청 방식 (GET, POST 등) |
| getRequestURI() | 요청 URI (예: /user/1) |
| getParameter("name") | 요청 파라미터 (?name=Tom) 값 |
| getHeader("User-Agent") | 헤더 정보 조회 |
| getInputStream() | 요청 바디의 raw 데이터 읽기 |
| getCookies() | 쿠키 가져오기 |
| 상황 | 설명 |
| 세부 요청 정보가 필요할 때 | URL, 헤더, IP 주소 등 |
| 공통 처리 (ex: 필터, 인터셉터) | 요청을 가로채고 정보를 분석할 때 |
| 직접 HTTP 요청 데이터를 처리하고 싶을 때 | JSON 대신 raw body를 직접 읽거나 |
Spring에서는 보통 더 편리한 방식 (@RequestParam, @RequestHeader, @RequestBody 등)을 제공하지만,
복잡하거나 유연하게 처리할 때는 HttpServletRequest를 직접 써야 하는 경우도 많다.
HttpEntity란?
: Spring에서 **HTTP 요청이나 응답 전체(헤더 + 바디)**를 다루고 싶을 때 사용하는 클래스
| 상황 | 이유 |
| 클라이언트가 보낸 HTTP 요청의 헤더와 바디를 모두 처리하고 싶을 때 | 예: 토큰, 커스텀 헤더 등을 직접 읽고 싶을 때 |
| 서버에서 클라이언트로 보낼 응답에 바디와 헤더를 함께 설정하고 싶을 때 | 예: 응답 헤더에 커스텀 정보 포함 |
| RestTemplate이나 WebClient로 HTTP 요청을 보낼 때 | HttpEntity로 요청 전체를 구성 |
- httpEntity를 사용하면 읽기, 쓰기 기능을 따로 안해줘도 바로 입력받은 문자열을 그대로 내보내줄 수 있다.
- view를 반환하는게 아니라 데이터를 다룰 때 사용
- List 같은 형태!
RequestEntity<>
ResponseEntuty<>
위의 2가지가 httpEntity를 상속받은 객체이다.
@RequestBody vs HttpEntity
| 항목 | @RequestBody | HttpEntity |
| 처리 범위 | 바디만 처리 | 헤더 + 바디 모두 처리 |
| 사용 편의성 | 간단하고 직관적 | 더 세밀한 제어 가능 |
| 헤더 읽기 | ❌ 불가 | ✅ 가능 |
'Spring > 이론' 카테고리의 다른 글
| Spring Layered Architecture (0) | 2025.05.09 |
|---|---|
| Spring @PathVariable vs @RequestBody (0) | 2025.05.09 |
| Spring @RestController & ResponseEntity<T>에 대해 (0) | 2025.05.08 |
| Spring DTO에 대해 (0) | 2025.05.08 |
| Spring MVC 구조 (0) | 2025.05.08 |