T_era
Client에서 Server로 데이터 전달 방식 정리 본문
1. Query Parameter (Query String)
- HTTP Method: GET
- 전달 방식: URL의 ? 뒤에 key=value 형태로 데이터를 연결하며, 복수의 파라미터는 &로 구분한다.
- 예시: http://localhost:8080/request-params?key1=value1&key2=value2
- HttpServletRequest 사용: request.getParameter("key") 메서드를 통해 각 파라미터 값을 획득한다.
@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()를 사용하여 응답을 직접 작성하며, @Controller이지만 @ResponseBody를 병용한 것과 동일한 결과를 나타낸다.
2. HTTP Form Data (x-www-form-urlencoded)
- HTTP Method: POST
- 전달 방식: HTTP Request Body에 key=value 형태로 데이터를 담아 전송하며, Content-Type은 application/x-www-form-urlencoded로 설정된다.
- HttpServletRequest 사용: request.getParameter("key") 메서드를 통해 파라미터 값을 획득한다. Query Parameter와 동일한 접근 방식을 취한다.
@Slf4j
@Controller
public class RequestBodyController {
@PostMapping("/form-data")
public void requestBody(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");
}
}
- HttpServletRequest.getParameter("key")는 Query Parameter와 HTML Form Data 양쪽 모두에서 데이터 추출이 가능하다.
3. HTTP Request Body
- HTTP Method: POST, PUT, PATCH (GET, DELETE는 Body 데이터 전송을 권장하지 않는다)
- 전달 방식: JSON, TEXT, XML 등 다양한 형식의 데이터를 HTTP Message Body에 직접 담아 전송한다. @RestController에서 주로 사용되며, JSON 형식이 일반적이다.
- HttpServletRequest 사용: request.getInputStream()을 통해 Request Body의 내용을 직접 읽어 처리해야 한다.
@Slf4j
@Controller
public class RequestBodyController {
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.class);
log.info("board.getTitle()={}, board.getContent()={}", board.getTitle(), board.getContent());
response.getWriter().write("success");
}
}
- ObjectMapper: JSON 데이터를 Java 객체로 변환하거나, Java 객체를 JSON 데이터로 변환하는 Jackson 라이브러리의 클래스이다.
- request.getInputStream(): HTTP 요청 Body의 입력 스트림을 획득한다.
- StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8): 입력 스트림의 내용을 UTF-8 형식의 문자열로 변환한다.
- objectMapper.readValue(messageBody, Board.class): JSON 형식의 문자열(messageBody)을 Board 클래스의 객체로 변환한다.
@Getter
@Setter
public class Board {
private String title;
private String content;
}
'Programing > Spring' 카테고리의 다른 글
| HTTP Message Body (요청) (0) | 2025.05.07 |
|---|---|
| @RequestParam과 @ModelAttribute (0) | 2025.05.07 |
| MultiValueMap (0) | 2025.05.06 |
| MediaMapping의 속성별 차이점 (0) | 2025.05.06 |
| 특정 파라미터 및 헤더 매핑 (0) | 2025.05.06 |