@ModelAttribute
@RequestParam
@RequestBody
다음 세가지의 애노테이션(annotation)들은 스프링 프레임워크에서 클라이언트로부터 전송된 데이터를 컨트롤러의 메서드 파라미터(객체, DTO)로 바인딩하는 역할을 한다.
HTTP 요청 파라미터를 전달받아 메서드의 파라미터로 바인딩한다.
URL 쿼리 파라미터나 FORM 데이터의 개별 값을 메서드의 파라미터로 전달합니다.
선택적으로 defaultValue를 지정하여 파라미터가 없을 경우의 기본값을 설정할 수 있습니다.
🔍 예시
<form action="/submit" method="post"> <input type="text" name="name" /> <input type="text" name="age" /> <input type="submit" value="Submit" /> </form>
@PostMapping("/submit") public String handleSubmit(@RequestParam String name, @RequestParam int age) { // 여기서 'name'과 'age' 파라미터는 Form에서 전송된 데이터를 받아옵니다. // 로직 처리... return "response"; } // GET http://yourdomain.com/greeting?name=John // => return value : "Hello, John!" // GET http://yourdomain.com/greeting // => return value : "Hello, World!" @GetMapping("/greeting") @ResponseBody public String greeting(@RequestParam(name="name", defaultValue="World") String name) { return "Hello, " + name + "!"; }
HTTP 요청의 Body 부분을 메서드의 파라미터로 바인딩한다.
🔍 예시
// request POST /requestBody HTTP/1.1 Content-Type: application/json { "title": "My Title", "content": "This is content" } @PostMapping("/requestBody") public ResponseEntity<Board> requestBody(@RequestBody Board board) { // @RequestBody는 MessageConverter를 통해 Json 형태의 HTTP Body를 Java 객체로 변환시킨다. return ResponseEntity.ok(board); }
Form 데이터나 URL 파라미터를 객체로 바인딩합니다.
클라이언트에서 전송된 키-값 쌍의 데이터를 지정된 타입의 객체로 바인딩하고, 이 객체를 Model에 추가합니다.
주로 Form에서 전송된 데이터를 도메인 객체에 바인딩하는 데 사용됩니다.
컨트롤러의 메서드 파라미터 앞에 사용하거나, 메서드 레벨에서 사용할 수 있습니다.
🔍 예시
POST /modelAttribute HTTP/1.1 Content-Type: application/x-www-form-urlencoded title=My+Title&content=This+is+content @PostMapping("/modelAttribute") public ResponseEntity<Board> modelAttribute(@ModelAttribute Board board) { // @ModelAttribute는 폼(form) 형태의 HTTP Body와 요청 파라미터들을 객체에 바인딩시킨다. return ResponseEntity.ok(board); }
@RequestParam : URL의 쿼리 파라미터나 Form 데이터의 개별 값을 메서드의 파라미터로 바인딩합니다.
@ModelAttribute : Form 데이터나 URL 파라미터를 객체로 바인딩하며, 선택적으로 Model에 추가하여 View에서 사용할 수 있게 합니다.
@RequestBody : HTTP 요청 본문(주로 JSON이나 XML 데이터)을 Java 객체로 역직렬화하여 메서드의 파라미터로 바인딩합니다.