바인딩 어노테이션 정리
2025. 4. 10. 00:15ㆍ개인 공부
맨날 사용하지만 가끔씩 헷갈릴 때가 있어서 정리해두면 생각을 하던 찰나 생각난 김에 정리하기로 했다.
| 애노테이션 | 설명 | 예시 |
|---|---|---|
@RequestParam |
요청 파라미터(쿼리 스트링, 폼 데이터)를 개별 변수로 바인딩 | @RequestParam("name") String name → ?name=sangyun |
@PathVariable |
URL 경로 변수 바인딩 | @PathVariable("id") Long id → /users/10 |
@ModelAttribute |
요청 파라미터를 객체에 바인딩 (폼 처리 시 주로 사용) | @ModelAttribute UserDTO user |
@RequestBody |
JSON 요청 데이터를 객체로 변환 (HttpMessageConverter 사용) | @RequestBody UserDTO user |
@ResponseBody |
반환값을 JSON 등으로 직렬화하여 응답 | @ResponseBody String result |
@RequestHeader |
HTTP 요청 헤더 값을 변수에 바인딩 | @RequestHeader("User-Agent") String ua |
@CookieValue |
쿠키 값을 변수에 바인딩 | @CookieValue("sessionId") String sessionId |
@RequestPart |
multipart/form-data에서 특정 파트 바인딩 (파일 업로드 등) | @RequestPart("file") MultipartFile file |
Q1. ModelAttribute, RequestBody, ResponseBody의 차이는?
1. @ModelAttribute
- HTML 폼 전송 / URL 쿼리 파라미터에 적합
- 요청 파라미터를 setter 기반으로 객체에 하나하나 바인딩
- 생략해도 기본 적용됨
@PostMapping("/users")
public String addUser(@ModelAttribute UserDTO user) {
// name=John&age=20 → user.setName("John"), user.setAge(20)
return "userView";
}
주로 form 전송 + application/x-www-form-urlencoded일 때 사용
2. @RequestBody
- JSON 형식으로 전송된 요청 바디 전체를 객체로 파싱
- HttpMessageConverter가 내부적으로 Jackson 같은 걸 이용해서 변환
- 생략하면 동작 안 함 (명시 필수)
@PostMapping("/api/users")
public void addUser(@RequestBody UserDTO user) {
// JSON 본문 → user 객체로 매핑됨
}
주로 application/json 요청 처리할 때 사용
3. @ResponseBody
- 반환값을 JSON/XML 등으로 변환해서 HTTP 응답 본문으로 전달
- REST API 컨트롤러에서 필수
- @RestController에 포함되어 있음 (@Controller + @ResponseBody)
@GetMapping("/api/user")
@ResponseBody
public UserDTO getUser() {
return new UserDTO("John", 20); // → JSON으로 변환되어 응답
}Q2. Model과 ModelAttribute의 차이
기능은 명확히 다르나 명칭이 비슷해서 가끔씩 헷갈렸던 것 같다
1. Model
- org.springframework.ui.Model
- 컨트롤러에서 View로 데이터를 넘길 때 사용
- 키-값 형태로 데이터를 담음
- Model model로 컨트롤러 메서드 파라미터에 선언하면 자동 주입됨
@GetMapping("/user")
public String userPage(Model model) {
UserDTO user = userService.getUser();
model.addAttribute("user", user); // View에 전달됨
return "user-view"; // user-view.html에서 ${user.name} 가능
}
2. @ModelAttribute
- 요청 파라미터를 자바 객체(DTO 등)에 자동으로 바인딩해주는 애노테이션
- 메서드 파라미터에 붙이면 form 데이터, 쿼리 스트링 등을 객체로 바인딩
- 메서드 자체에 붙이면 모든 요청에서 공통으로 View에 전달 가능
@PostMapping("/user")
public String saveUser(@ModelAttribute UserDTO user) {
// name=John&age=20 → user.setName("John"), user.setAge(20)
return "user-result";
}
| 구분 | Model |
@ModelAttribute |
|---|---|---|
| 정체 | 인터페이스 (객체) | 애노테이션 |
| 역할 | View에 데이터를 전달할 때 사용 | 요청 파라미터를 객체에 바인딩할 때 사용 |
| 주요 위치 | 컨트롤러 메서드 파라미터 또는 내부에서 사용 | 컨트롤러 메서드 파라미터 또는 메서드 자체에 붙임 |
| 대표 예시 | model.addAttribute("user", user); |
@ModelAttribute UserDTO user |
요약
- Model은 "View로 넘길 값들을 담는 바구니"
- @ModelAttribute는 "요청 데이터를 자동으로 객체에 바인딩하는 도우미"
'개인 공부' 카테고리의 다른 글
| CS 공부 - 3 (1) | 2024.05.21 |
|---|---|
| @Controller와 @RestController의 차이점 (0) | 2024.05.17 |
| CS 공부 - 2 (0) | 2024.05.13 |
| CS 공부 - 1 (0) | 2024.05.08 |
| java stream()이란? (0) | 2024.03.13 |