[Spring] @RequestParam이란?

artp·2025년 5월 21일

spring

목록 보기
5/11
post-thumbnail

@RequestParamHTTP 요청 파라미터(Query String, Form Field)를 컨트롤러 메서드의 파라미터로 직접 바인딩해주는 Spring MVC 애노테이션입니다.

흐름

  1. 클라이언트가 요청 전송
    • 브라우저, Postman, JS 등에서 GET 또는 POST 요청을 보냅니다.
    • 전송되는 데이터는 쿼리스트링(?key=value)이나 form 필드의 key=value 형식입니다.
  2. Spring DispatcherServlet이 요청을 수신
    • 클라이언트 요청은 스프링의 DispatcherServlet이 먼저 가로챕니다.
    • 어떤 컨트롤러가 처리할지 핸들러 매핑을 통해 결정합니다.
  3. HandlerMethodArgumentResolver가 동작
    • 컨트롤러 메서드의 파라미터를 하나씩 분석하여,
      @RequestParam이 붙은 파라미터를 RequestParamMethodArgumentResolver가 처리합니다.
  4. 요청 파라미터 추출 및 변환
    • HttpServletRequest.getParameter("keyword") 등으로 파라미터 값을 꺼냅니다.
    • 문자열로 받은 값을 int, boolean, List<String> 등으로 자동 타입 변환합니다.
    • 변환 실패 시 TypeMismatchException 발생
  5. 컨트롤러 메서드에 값 주입
    • 파라미터 이름 또는 @RequestParam("파라미터명")에 해당하는 값을 찾아 바인딩합니다.
    • 값이 없고 required=true일 경우 → 400 Bad Request 예외 발생
    • defaultValue가 지정되어 있다면 해당 값을 사용
  6. 바인딩된 값으로 컨트롤러 메서드 실행
    • 파라미터들이 모두 채워진 상태로 메서드가 호출됩니다.
GET /search?keyword=spring&page=2
@GetMapping("/search")
public String search(@RequestParam("keyword") String keyword,
                     @RequestParam(value = "page", required = false, defaultValue = "1") int page) {
    // DispatcherServlet이 아래처럼 처리
    // keyword = request.getParameter("keyword") → "spring"
    // page = request.getParameter("page") → "2" → int 변환
}

실제 사용 예시 (HTML 폼과 컨트롤러)

HTML 폼

<form action="/search" method="get">
  <input type="text" name="keyword">
  <input type="number" name="page" value="1">
  <button type="submit">검색</button>
</form>
  • 사용자가 keyword, page 값을 입력하고, GET 방식으로 서버에 요청
  • 아래와 같은 요청이 만들어짐:
GET /search?keyword=스프링&page=1

컨트롤러

@GetMapping("/search")
public String search(@RequestParam String keyword,
                     @RequestParam(defaultValue = "1") int page,
                     Model model) {
    model.addAttribute("keyword", keyword);
    model.addAttribute("page", page);
    return "searchResult";
}

파일 업로드에도 사용 가능

<form action="/upload" method="post" enctype="multipart/form-data">
  <input type="file" name="file">
  <button type="submit">업로드</button>
</form>
  • enctype="multipart/form-data" 설정은 파일 업로드에 필수
  • 이 설정이 없으면 파일 전송이 되지 않음
@PostMapping("/upload")
public String upload(@RequestParam("file") MultipartFile file) {
    System.out.println("업로드된 파일명: " + file.getOriginalFilename());
    return "uploadSuccess";
}

@RequestParam 상세 속성

속성설명예시
value요청 파라미터 이름@RequestParam("page") int page
required필수 여부 (기본값: true)@RequestParam(required = false)
defaultValue기본값 지정@RequestParam(defaultValue = "1")
profile
donggyun_ee

0개의 댓글