바인딩 어노테이션 정리

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