[Spring] HTTP 요청 파라미터 - @RequestParam,@ModelAttribute

4675 단어 SpringSpring

HTTP 요청 데이터 조회

@Slf4j
@Controller
public class RequestParamController {

    @RequestMapping("/request-param-v1")
    public void requestParamV1(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String username = request.getParameter("username");
        int age = Integer.parseInt(request.getParameter("age"));
        log.info("usename={}, age={}",username,age);

        response.getWriter().write("ok");
    }

    @ResponseBody
    @RequestMapping("/request-param-v2")
    public String requestParamV2(@RequestParam("username") String memberName, @RequestParam("age") int memberAge){
        log.info("usename={}, age={}",memberName,memberAge);
        return "ok";
    }

}

@ResponseBody를 사용함으로서 뷰 조회가 아닌 "ok" 라는 문자를 HTTP 응답 메시지에 담아 반환한다.

👩‍💻 @RequestParam

단일 파라미터를 전달 받을 때 사용하는 어노테이션

파라미터 필수 여부 - requestParamRequired

@ResponseBody
    @RequestMapping("/request-param-required")
    public String requestParamRequired(@RequestParam(required = true) String username,
                                       @RequestParam(required = false) int age){
        log.info("usename={}, age={}",username,age);
        return "ok";
    }
  • 파라미터 필수 여부
  • 기본값은 true이다.
  • required = true 일 경우 무조건 값이 있어야한다.
  • required = false는 생략가능하다.

💦주의! - 기본형(primitive)에 null 입력

@RequestParam(required = false) int age)로 age는 필수 여부가 false이지만 생략하게 되면 500 예외가 발생한다.
이러한 경우는 null을 int에 입력하는 것이 불가능하기 때문에
👉 null을 받을 수 있는 Integer로 변경하거나,
👉 defaultValue를 사용해야한다.

💦주의! - 파라미터 이름만 있고 값이 없는 경우


username만 있고 값이 없는 경우는 null이 아닌 ""(빈문자)로 들어 온다!

👩‍💻 defaultValue

@ResponseBody
    @RequestMapping("/request-param-default")
    public String requestParamDefault(@RequestParam(required = true, defaultValue = "guest") String username,
                                       @RequestParam(required = false, defaultValue = "-1") int age){
        log.info("usename={}, age={}",username,age);
        return "ok";
    }
  • 파라미터에 값이 없는 경우 defaultValue를 사용하면 기본값을 적용할 수 있다.
  • defaultValue는 빈 문자의 경우에도 적용된다.
    📌실습해보기

👩‍💻 requestParamMap

@ResponseBody
    @RequestMapping("/request-param-map")
    public String requestParamMap(@RequestParam Map<String,Object> paramMap){
        log.info("usename={}, age={}",paramMap.get("username"),paramMap.get("age"));
        return "ok";
    }
  • requestParamMap을 사용하여 파라미터를 Map으로 조회할 수 있다.

📌실습해보기

👩‍💻 @ModelAttribute

  • HTTP Request에 포함된 파라미터를 지정한 클래스의 객체로 바인딩한다.
  • @ModelAttribute의 name으로 정의한 객체를 View 페이지에서 사용할 수 있다.
   @ResponseBody
    @RequestMapping("/model-attribute-v1")
    public String modelAttributeV1(@ModelAttribute HelloData helloData){
        log.info("usename={}, age={}",helloData.getUsername(),helloData.getAge());
        return "ok";
    }
  1. HelloData 객체를 생성한다.
  2. 요청 파라미터 이름으로 HelloData 객체의 프로퍼티를 찾는다. 그리고 해당 프로퍼티의 setter을 호출해서 값을 입력(바인딩)한다.
  • ex) 파라미터이름이 username일 경우 setUsername() 메서드를 찾아서 호출하면서 값을 입력한다.

@ModelAttibute는 생략 가능하다.
그런데 @RequestParam도 생략 가능하기 때문에 혼란이 발생한다.
🔑 스프링은 해당 생략시 다음과 같은 규칙을 적용한다!

  • String,int,Integer 같은 단순 타입 ➡ @RequestParam
  • 나머지 = @ModelAttribute

좋은 웹페이지 즐겨찾기