HTTP 요청 데이터
client에서 server로 data를 전달하는 방법 1. query parameter 2. http 폼 데이터 3. RequestBody
1. GET + Query Parameter(=Query String) -> HttpServletRequest 사용
http://localhost:8080/request-params?key1=value1&key2=value2
@Slf4j
@Controller
public class RequestParamController {
@GetMapping("/request-params")
public void params(
HttpServletRequest request,
HttpServletResponse response
) throws IOException {
String key1Value = request.getParameter("key1");
String key2Value = request.getParameter("key2");
log.info("key1Value={}, key2Value={}", key1Value, key2Value);
response.getWriter().write("success");
}
}
- response.getWriter().write()
- HttpServletResponse를 사용해서 응답값을 직접 다룰 수 있다.
- @Controller 지만 @ResponseBody를 함께 사용한 것과 같다.
2. POST + HTML Form(x-www-form-urlencoded) -> http RequestBody에 전달
POST /form-data
content-type: application/x-www-form-urlencoded
key1=value1&key2=value2
3. http RequestBody
- 데이터(JSON, TEXT, XML 등)를 직접 HTTP Message Body에 담아서 전달한다.
- 주로 @RestController에서 사용하며, 대부분 JSON 형식으로 데이터를 전달한다.
- POST, PUT, PATCH Method에서 사용한다.
- GET, DELETE Method는 Body에 데이터를 담는것을 권장하지 않는다.
package com.example.springbasicannotation.controller;
import com.example.springbasicannotation.entity.Board;
import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.servlet.ServletInputStream;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.util.StreamUtils;
import org.springframework.web.bind.annotation.PostMapping;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
@Slf4j
@Controller
public class RequestBodyController {
// JSON을 객체로 변환해주는 Jackson 라이브러리
private ObjectMapper objectMapper = new ObjectMapper();
@PostMapping("/request-body")
public void requestBody(
HttpServletRequest request,
HttpServletResponse response
) throws IOException {
ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
log.info("messageBody={}", messageBody);
Board board = objectMapper.readValue(messageBody, Board.clss);
log.info("board.getTitle()={}, board.getContent()={}", board.getTitle(), board.getContent());
response.getWriter().write("success");
}
}
Spring 요청 데이터
RequestParam
Spring 기초 4주차에 정리한대로 url에서 파라미터 값과 이름을 함께 전달하면 RequestParam을 사용해서 파라미터 값에 쉽게 접근할 수 있다.
1. required 속성 설정
@RequestParam(required = true) String name, // 필수
@RequestParam(required = false) int age // 필수가 아님
파라미터를 필수로 받을지 안받을지를 required=true/false로 지정할 수 있다.
디폴트 값은 true인데 true 상태에서 url에 파라미터가 없는 경우 400 에러가 발생한다.
2. Map 사용
파라미터를 map 형태(key=value)로 조회할 수 있다.
MultiValueMap 형태(key=[value1, value2])로 조회할 수 있다.
ex) http://localhost:8080/v6/request-param?name=sparta&age=100
@ResponseBody
@GetMapping("/v6/request-param")
public String requestParamV6(
@RequestParam Map<String, String> map
) {
// logic
log.info("name={}", map.get("name"));
log.info("age={}", map.get("age"));
return "success";
}
http://localhost:8080/v6/request-param?name=sparta&name=wonuk&name=tutor&age=100
@ResponseBody
@GetMapping("/v6/request-param")
public String requestParamV6(
@RequestParam MultiValueMap<String, String> map
) {
// logic
log.info("name={}", map.get("name"));
log.info("age={}", map.get("age"));
return "success";
}
@ModelAttribute
http 요청의 파라미터를 객체에 바인딩해서 해당 객체를 컨트롤러 매서드의 매개변수로 전달하거나 모델에 추가하는데 사용된다.
public class User {
private String name;
private String email;
// getter, setter
}
@Controller
public class UserController {
@PostMapping("/submitForm")
public String submitForm(@ModelAttribute User user) {
// user 객체는 폼에서 전달된 데이터로 자동 바인딩됨
return "userInfo";
}
}
<form method="POST" action="/submitForm">
<input type="text" name="name" />
<input type="email" name="email" />
<button type="submit">Submit</button>
</form>
name과 email 필드가 자동으로 User 객체의 속성에 바인딩된다.
http 요청 파라미터의 이름과 객체의 필드명이 일치해야 한다.
HttpEntity
역할
- Http Request Body Message를 직접 조회한다
- Request 뿐만 아니라 Response도 사용할 수 있도록 만들어준다.
- Response Header 또한 사용할 수 있다.
- Request Parameter를 조회하는 기능들과는 아무 관계가 없다.
- View를 반환하지 않는다.
HttpEntity와 RequestEntity, ResponseEntity의 차이
- HttpEntity는 요청과 응답 모두에서 사용 가능한 일반적인 클래스.
- RequestEntity: HttpEntity를 상속받으며, HTTP 요청에서만 사용됩니다. 추가적으로 HTTP 메서드와 URL 정보까지 포함한다.
- ResponseEntity: HttpEntity를 상속받으며, HTTP 응답에서만 사용됩니다. HTTP 상태 코드(status code)를 포함한다.
@Controller
public class RequestBodyStringController {
@PostMapping("/v4/request-body-text")
public HttpEntity<String> requestBodyTextV4(RequestEntity<String> httpEntity) {
// HttpMessageConverter가 동작해서 아래 코드가 동작하게됨
String body = httpEntity.getBody();
// url, method 사용 가능
return new ResponseEntity<>("response = " + body, HttpStatus.CREATED); // Body Data, 상태코드
}
}
@RequestBody, @ResponseBody
HttpEntity를 사용하는 것보다 Spring에서 @RequestBody, @ResponseBody 어노테이션을 사용하면 각각 Request, Response 객체의 Body에 편하게 접근하여 사용할 수 있다.
@Controller // @RestController = @Controller + @ResponseBody
public class RequestBodyStringController {
@ResponseBody
@PostMapping("/v5/request-body-text")
public String requestBodyTextV5(
@RequestBody String body,
@RequestHeader HttpHeaders headers
) {
// HttpMessageConverter가 동작해서 아래 코드가 동작하게됨
String bodyMessage = body;
return "request header = " + headers + " response body = " + bodyMessage;
}
}
@RequestBody @ResponseBody 차이점
특징 | @RequestBody | @ResponseBody |
역할 | HTTP 요청 본문을 Java 객체로 변환 | Java 객체를 HTTP 응답 본문으로 변환 |
데이터 흐름 방향 | 클라이언트 → 서버 | 서버 → 클라이언트 |
주요 용도 | 요청 데이터(예: JSON, XML)를 매핑 | 응답 데이터(예: JSON, XML)를 반환 |
적용 위치 | 컨트롤러 메서드의 매개변수 | 컨트롤러 메서드의 반환값 |
기술 사용 | HttpMessageConverter를 사용해 본문 데이터를 객체로 변환 | HttpMessageConverter를 사용해 객체를 본문 데이터로 변환 |
- 요약
- 요청 파라미터, HTML Form Data에 접근하는 경우
- @RequestParam, @ModelAttribute 를 사용한다. (생략 가능)
- Http Message Body에 접근하는 경우
- @RequestBody를 사용한다. (JSON, XML, TEXT) (생략 불가능) , HttpEntity도 사용 가능(값을 꺼내서 사용해야 함. httpEntity.getBody())
- 요청 파라미터, HTML Form Data에 접근하는 경우
Spring 응답 데이터
server에서 client로 data를 전달하는 방법
1. 정적 리소스
경로: src/main/resources ->/static
2. view Template
경로: src/main/resources/templates
3. http message body
직접 http response message를 만들어서 전달한다.
- HTTP Message Body
- HttpServletResponse 사용
- ResponseEntity<> 사용
- @ResponseBody(TEXT, JSON) 사용
- ResponseEntity<Object>(JSON)
정리
- 요청
- @RequestParam, @ModelAttribute, @RequestBody
- 응답
- 정적 리소스, View Template(@Controller), @ResponseBody, ResponseEntity<Object>
'코딩 > 자바' 카테고리의 다른 글
[Spring] 기초 6주차 (0) | 2025.01.23 |
---|---|
[Spring] HTTP API 설계 기본 (0) | 2025.01.23 |
[Spring] 기초 4주차 (1) | 2025.01.22 |
[Spring] 기초 2주차 (0) | 2025.01.21 |
[Spring] 기초 1주차 (0) | 2025.01.21 |