Java

[Spring] @RequestParam과 @ModelAttribute의 차이점

@RequestParam

@GetMapping("/users")
public ResponseEntity<User> requestParam(@RequestParam("name") String userName) {
    return ResponseEntity.ok().body(new User(userName, "email"));
}

우선, @RequestParam은 쿼리스트링으로 들어온 파라미터들을 1:1로 받는다. 만약, 파라미터 타입이 잘못 들어오게 되면 400 Bad Request를 보낸다.

@ModelAttribute

@GetMapping("/insert")
public Object requestParam(@ModelAttribute("user") User user, BindingResult bindingResult) {
    if (bindingResult.hasErrors()){
     // error가 발생한 경우
    }

    // 별도 로직
    return user;
}

@ModelAttribute 는 도메인 객체나 DTO 파라미터를 바인딩해서 받는다. (객체로 받는다.) ModelAttribute는 타입 변환에 실패하더라도 작업은 계속 진행되고, 타입 변환 중 발생한 예외가 BindException 타입의 객체에 담겨서 컨트롤러로 전달된다. 그러므로 사용자의 입력값에 오류가 있을 때에는 이에 대한 처리를 컨트롤러에게 맡겨야한다.

그래서 @ModelAttribute 를 통해 정보를 전달받을 때에는 BindingResult 파라미터를 함께 사용해야한다. 함께 사용 시, 타입이 일치하지 않을 경우 예외를 던진다.