Spring MVC에서 HTTP 요청 파라미터를 처리하는 주요 애노테이션

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 예외가 발생할 수 있습니다. 특히 필수 파라미터가 누락되었을 경우입니다. 요청 본문 형식에 맞는 애노테이션을 정확히 선택해야 합니다.

태그: Spring MVC @RequestBody @RequestParam @PathVariable @ModelAttribute

6월 1일 20:13에 게시됨