HTTP 요청의 콘텐츠 형식과 스프링 MVC의 처리 방식
스프링 MVC는 다양한 형식의 HTTP 요청을 처리할 수 있으며, 요청 본문의 인코딩 방식은 Content-Type 헤더에 의해 결정됩니다. 주요 형식은 다음과 같습니다:
application/x-www-form-urlencoded(기본 형식)multipart/form-data(파일 업로드 시 사용, 이진 데이터 전송)application/json,application/xml등 구조화된 데이터 형식
요청 본문의 데이터 형식은 클라이언트가 설정한 Content-Type 값에 따라 스프링이 적절한 매핑을 수행합니다.
요청 파라미터를 처리하는 주요 애노테이션
@PathVariable
URL 경로 내에 포함된 변수 값을 추출할 때 사용됩니다. 예를 들어, /user/123에서 123을 얻고 싶다면 다음과 같이 사용합니다:
@GetMapping("/user/{id}")
public String getUser(@PathVariable("id") Long userId) {
return "User ID: " + userId;
}
@RequestParam
쿼리 스트링(?key=value)이나 폼 데이터(application/x-www-form-urlencoded 또는 multipart/form-data)에서 파라미터를 추출합니다. 이는 서버에서 request.getParameter()로 접근하는 값들과 동일한 원리입니다.
@PostMapping("/search")
public String search(@RequestParam String keyword, @RequestParam(required = false) Integer page) {
return "검색어: " + keyword + ", 페이지: " + page;
}
@RequestBody
HTTP 요청 본문의 내용을 직접 객체로 바인딩합니다. 주로 application/json 또는 application/xml 형식으로 전송되는 데이터에 사용되며, GET 요청에는 사용 불가입니다.
@Data
public class UserDTO {
private String name;
private String email;
private Integer age;
}
@PostMapping("/register")
public void register(@RequestBody UserDTO userData) {
System.out.println("등록된 사용자: " + userData);
}
@ModelAttribute
폼 데이터나 요청 본문의 필드를 모델 객체로 바인딩하며, 컨트롤러 메서드의 파라미터로 사용됩니다. 일반적으로 폼 처리나 복잡한 객체 생성 시 유용합니다.
@PostMapping("/submit")
public String submitForm(@ModelAttribute UserDTO user) {
return "처리 완료: " + user.getName();
}
컨트롤러 메서드의 반환값 유형
기본적으로 @RequestMapping을 사용하면 반환값은 뷰 이름으로 해석되어 리다이렉트 또는 뷰 조회가 됩니다. 하지만 @ResponseBody를 추가하면 반환 값은 응답 본문에 직렬화되어 전송되며, 주로 JSON 형태의 데이터를 반환할 때 사용됩니다.
@GetMapping("/data")
@ResponseBody
public Map getData() {
Map result = new HashMap<>();
result.put("message", "Hello World");
result.put("status", "success");
return result;
}
주의사항
@RequestBody와 @RequestParam을 동시에 사용하면 MissingServletRequestParameterException 예외가 발생할 수 있습니다. 특히 필수 파라미터가 누락되었을 경우입니다. 요청 본문 형식에 맞는 애노테이션을 정확히 선택해야 합니다.