URL 끝에 ?key1=value1&key2=value2 형태로 데이터를 전송합니다.
데이터 길이에 제한이 있고(보통 2048자 이하), 캐싱이 가능합니다. 그리고 URL에 데이터가 노출되기 때문에 보안 측면에서 취약합니다.
@GetMapping("/request-params")
public void params(HttpServletRequest request) {
String value1 = request.getParameter("key1");
String value2 = request.getParameter("key2");
}
@GetMapping("/request-params")
public String params(
@RequestParam("key1") String value1,
@RequestParam(value = "key2",
required = false, // 필수 여부, 기본값은 true
defaultValue = "default") String value2) {
// logic 처리
}
HTTP Body에 key1=value1&key2=value2 형태로 전송합니다. 파일 업로드가 불가능합니다. 페이지 이동시 주로 사용하는 형태입니다.
@GetMapping("/form-data")
public void formData(HttpServletRequest request) {
String value1 = request.getParameter("key1");
String value2 = request.getParameter("key2");
}
@PostMapping("/form-data")
public String formData(@ModelAttribute UserForm form) {
// form.getKey1(), form.getKey2() 사용
}
필드명과 파라미터명이 일치해야 하며, 검증을 위한 @Valid와 함께 사용이 가능합니다.
HTTP Body에 구조화된 데이터를 전송합니다. 대용량 데이터 처리가 가능하고, REST API에서 주로 사용합니다.
@PostMapping("/request-body")
public void requestBody(HttpServletRequest request) throws IOException {
ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
// JSON 수동 파싱
User user = objectMapper.readValue(messageBody, User.class);
}
@PostMapping("/request-body")
public ResponseEntity<User> requestBody(@RequestBody User user) {
// user 객체 직접 사용
return ResponseEntity.ok(user);
}
Spring의 HttpMessageConverter가 JSON을 객체로 변환합니다. GET요청에는 사용이 불가능합니다.
| 어노테이션 | 사용 시나리오 | 데이터 위치 | 특징 |
|---|---|---|---|
| @RequestParam | 쿼리 파라미터, 폼 데이터 | URL 또는 Body | 단일 값 처리, 기본값 설정 가능 |
| @ModelAttribute | HTML 폼 데이터 | Body (key = value) | 객체 바인딩, 검증 가능 |
| @RequestBody | JSON/XML 등 구조화된 데이터 | Body (raw data) | 객체 자동 변환, setter가 불필요, Jackson 라이브러리 사용 |
@RequestParam: 단일 값 추출@ModelAttribute: 객체 바인딩(setter/생성자 사용)@RequestBody: 메시지 컨버터(Jackson)을 통해 JSON을 객체로 변환@ResponseBody로 데이터 직접 반환(JSON)자료 및 코드 출처: 스파르타 코딩클럽