[ Spring-Boot ] @Controller 에서 파라미터 받는 방법

[ Spring-Boot ] @Controller 에서 파라미터 받는 방법

날짜: 2024년 9월 2일

1. @RequestParam

@RequestParam: 요청 파라미터 → 메서드 매개변수로 바인딩할 때 사용

  1. GET 요청의 쿼리 파라미터 처리할 때
  2. POST 요청의 폼 데이터를 처리할 때

1-1. GET 요청의 쿼리 파라미터 처리

GET /search?query=spring&sort=asc

서버에 search라는 경로로 요청을 보내면서, querysort라는 두 개의 쿼리 파라미터를 전달

@Controller
public class SearchController {
    @GetMapping("/search")
    public String search(@RequestParam(name = "query") String query,
                         @RequestParam(name = "sort", required = false, defaultValue = "desc") String sort,
                         Model model) {
        model.addAttribute("query", query);
        model.addAttribute("sort", sort);
        return "searchResults";
    }
}
  • @RequestParam(name = "query") String query:
    URL의 query 파라미터 값을 메서드의 query 매개변수에 바인딩
  • @RequestParam(name = "sort", required = false, defaultValue = "desc") String sort:
    URL의 sort 파라미터 값을 sort 매개변수에 바인딩
  • ⇒ 해당 파라미터는 선택사항, 값이 없을 경우 기본값으로 desc가 설정

1-2. POST 요청의 폼 데이터 처리

POST 요청은 주로 데이터를 HTTP 요청 본문에 포함하여 전송하며, 특히 폼을 통해 데이터를 제출할 때 주로 사용한다.

이 경우 application/x-www-form-urlencoded, multipart/form-data와 같은 컨텐츠 타입이 사용

HTML 폼 예시

<form action="/register" method="post">
    <input type="text" name="username" />
    <input type="password" name="password" />
    <input type="submit" value="Register" />
</form>

사용자가 usernamepassword를 입력한 후 제출하면, 브라우저가 해당 데이터를 POST 요청으로 서버에 전송한다.

@RequestParam을 사용한 POST 요청 처리 예시

@Controller
public class UserController {

    @PostMapping("/register")
    public String register(@RequestParam(name = "username") String username,
                           @RequestParam(name = "password") String password,
                           Model model) {
        model.addAttribute("username", username);
        model.addAttribute("password", password);
        return "registrationSuccess";
    }
}
  • @RequestParam(name = "username") String username:
    폼에서 전송된 username 필드의 값을 메서드의 username 매개변수에 바인딩
  • @RequestParam(name = "password") String password:
    폼에서 전송된 password 필드의 값을 메서드의 password 매개변수에 바인딩

사용자가 폼을 제출 시

  • POST 요청으로 전송된 usernamepassword 데이터가 메서드의 parameter로 전달

1-3. @RequestParam의 다양한 속성

  • name/value:
    • HTTP 요청 파라미터의 이름을 지정.
    • 생략할 경우, 메서드 매개변수 이름과 동일한 파라미터 검색
  • required:
    • 파라미터가 필수인지 여부를 지정.
    • 기본값은 true이며, 파라미터가 없으면 MissingServletRequestParameterException이 발생
  • defaultValue:
    • 파라미터가 없을 때 사용할 기본값을 지정.
    • 이 값이 설정되면 required는 자동으로 false로 간주.

1-4. 예외 처리

@RequestParam에서 필수 파라미터가 누락되었을 때는 예외가 발생 가능

  • 기본값 설정: defaultValue를 통해 기본값을 제공하여 예외를 방지할 수 있습니다.
  • 예외 처리: 컨트롤러에서 @ExceptionHandler를 사용하여 예외를 처리할 수 있습니다.

2. @PathVariable

@PathVariable은 URL 경로의 변수 값을 메서드 매개변수로 바인딩할 때 사용

RESTful URL 설계에서 주로 사용

사용 예시

@Controller
public class MyController {

    @GetMapping("/user/{userId}")
    public String getUser(@PathVariable("userId") Long userId, Model model) {
        model.addAttribute("userId", userId);
        return "userDetail";
    }
}
  • @PathVariable("userId"):
    URL 경로에서 {userId}에 해당하는 값을 받아 userId 매개변수에 바인딩

3. @RequestBody

@RequestBody:

HTTP Request Body를 읽어와 자바 객체로 변환하여 메서드 매개변수로 바인딩할 때 사용.

⇒ 주로 JSON이나 XML 형식의 데이터를 처리할 때 사용

사용 예시

@Controller
public class MyController {

    @PostMapping("/users")
    public String createUser(@RequestBody User user, Model model) {
        // User 객체는 요청 본문에서 생성
        model.addAttribute("user", user);
        return "userCreated";
    }
}
  • @RequestBody:
  • HTTP RequestBody을 읽어 User 객체로 변환. 이를 위해 HttpMessageConverter가 사용

ObjectMapper의 동작 방식


4. @ModelAttribute

@ModelAttribute:

Request Parameter, Form-Data를 객체로 바인딩하여 메서드 매개변수로 전달하거나, Model에 자동으로 추가하는 데 사용

POST 요청의 application/x-www-form-urlencoded 또는 multipart/form-data 타입의 데이터를 처리하는 경우에도 사용

사용 예시

@Controller
public class MyController {

    @PostMapping("/register")
    public String registerUser(@ModelAttribute User user, Model model) {
        // User 객체는 요청 파라미터에서 생성
        model.addAttribute("user", user);
        return "registrationSuccess";
    }
}
  • @ModelAttribute:
  • Request Param을 바탕으로 객체를 생성하고, 해당 객체를 모델에 자동으로 추가합니다.

5. HttpServletRequestHttpServletResponse

HttpServletRequestHttpServletResponse 객체를 직접 사용하여 요청과 응답 처리 가능

⇒ 서블릿 API를 사용하여 더 낮은 수준의 HTTP 요청/응답 처리

사용 예시

@Controller
public class MyController {

    @GetMapping("/request")
    public String handleRequest(
        HttpServletRequest request, 
        HttpServletResponse response) {
        String param = request.getParameter("paramName");
        response.setHeader("Custom-Header", "value");
        return "requestHandled";
    }
}
  • HttpServletRequest:
  • 요청에서 파라미터를 직접 가져오거나, 요청 정보를 읽어올 때 사용
  • HttpServletResponse:
  • 응답에 헤더를 설정하거나, 직접 응답을 작성할 때 사용

요약

  • 단일 요청 파라미터 처리: @RequestParam
  • URL 경로 변수 처리: @PathVariable
  • 요청 본문 처리 (JSON 등): @RequestBody
  • 폼 데이터 처리: @ModelAttribute
  • 낮은 수준의 요청/응답 처리: HttpServletRequest, HttpServletResponse