Spring MVC 주요 어노테이션
1. 컨트롤러 및 요청 매핑 (Controller & Request Mapping)
- @Controller
- 역할: 해당 클래스를 Spring MVC의 컨트롤러로 지정. 이 어노테이션이 붙은 클래스는 클라이언트의 요청을 처리하고 응답을 생성하는 역할.
- 사용법: 클래스 레벨에 사용.
- 예시:
Java
@Controller
public class MyController {
// ...
}
- @RequestMapping
- 역할: 요청 URL과 컨트롤러 메서드를 매핑.
- 사용법: 클래스 레벨 또는 메서드 레벨에 사용.
- value (또는 path): URL 패턴을 지정.
- method: HTTP 메서드 (GET, POST, PUT, DELETE 등)를 지정. (기본값은 모든 메서드)
- params: 요청 파라미터 조건을 지정.
- headers: 요청 헤더 조건을 지정.
- consumes: 요청의 Content-Type을 제한.
- produces: 응답의 Content-Type을 지정.
- 예시:
Java
@Controller
@RequestMapping("/users") // 클래스 레벨 매핑
public class UserController {
@RequestMapping(method = RequestMethod.GET) // /users (GET)
public String listUsers() { ... }
@RequestMapping(value = "/{id}", method = RequestMethod.GET) // /users/{id} (GET)
public String getUser(@PathVariable("id") int id) { ... }
@RequestMapping(method = RequestMethod.POST, consumes = "application/json") // /users (POST, JSON)
public String createUser(@RequestBody User user) { ... }
}
- @GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping
- 역할: @RequestMapping의 단축 형태. 각 HTTP 메서드에 특화된 매핑을 제공.
- 사용법: 메서드 레벨에 사용.
- 예시:
Java
@Controller
@RequestMapping("/products")
public class ProductController {
@GetMapping("/{id}") // /products/{id} (GET)
public String getProduct(@PathVariable int id) { ... }
@PostMapping // /products (POST)
public String createProduct(@RequestBody Product product) { ... }
@PutMapping("/{id}")
public String updateProduct(@PathVariable int id, @RequestBody Product product){ ... }
@DeleteMapping("/{id}")
public String deleteMapping(@PathVariable int id){ ... }
@PatchMapping("/{id}")
public String patchMapping(@PathVariable int id, @RequestBody Product product){ ... }
}
- @PathVariable
- 역할: URL 경로의 일부를 변수로 추출.
- 사용법: 메서드 파라미터에 사용.
- 예시:
Java
@GetMapping("/users/{userId}/posts/{postId}")
public String getPost(@PathVariable("userId") int userId, @PathVariable Long postId) {
// userId: URL의 {userId} 부분, postId: URL의 {postId} 부분
...
}
- @RequestParam
- 역할: 요청 파라미터(쿼리 스트링, 폼 데이터)를 메서드 파라미터에 바인딩.
- 사용법: 메서드 파라미터에 사용.
- value (또는 name): 파라미터 이름을 지정. (생략 가능)
- required: 필수 파라미터 여부를 지정. (기본값: true)
- defaultValue: 파라미터가 없을 때 사용할 기본값을 지정.
- 예시:
Java
@GetMapping("/search")
public String search(@RequestParam("query") String keyword,
@RequestParam(value = "page", required = false, defaultValue = "1") int page) {
// keyword: "query" 파라미터 값, page: "page" 파라미터 값 (없으면 1)
...
}
- @RequestHeader
- 역할: HTTP 요청 헤더 값을 메서드 파라미터에 바인딩.
- 사용법: 메서드 파라미터에 사용.
- value : 헤더 이름을 지정
- required: 필수 헤더 여부. (기본값 true)
- defaultValue: 헤더가 없을 때 기본 값
예시:
Java
@GetMapping("/info")
public String getInfo(@RequestHeader("User-Agent") String userAgent,
@RequestHeader(value = "Accept-Language", required = false) String language){...}
- @CookieValue
- 역할: 쿠키 값을 메서드 파라미터에 바인딩.
- 사용법: 메서드 파라미터에 사용.
- 예시:
Java
@GetMapping("/profile")
public String getProfile(@CookieValue("sessionId") String sessionId) {
...
}
- @RequestBody
- 역할: HTTP 요청 본문(body)의 내용을 객체로 변환하여 메서드 파라미터에 바인딩. (주로 JSON, XML 형태의 데이터를 처리할 때 사용)
- 사용법: 메서드 파라미터에 사용.
- 예시:
Java
@PostMapping("/users")
public String createUser(@RequestBody User user) {
// 요청 본문의 JSON 데이터를 User 객체로 변환
...
}
- @ResponseBody
- 역할: 메서드의 반환 값을 HTTP 응답 본문(body)에 직접 씀. (주로 JSON, XML 형태의 데이터를 응답할 때 사용)
- 사용법: 메서드 레벨 또는 클래스 레벨에 사용. (@RestController를 사용하면 클래스 내 모든 메서드에 @ResponseBody가 적용된 것과 동일)
- 예시:
Java
@GetMapping("/users/{id}")
@ResponseBody
public User getUser(@PathVariable int id) {
// User 객체를 JSON 형태로 변환하여 응답 본문에 씀
...
}
- @RestController
- 역할: @Controller와 @ResponseBody를 합쳐놓은 어노테이션. 이 어노테이션이 붙은 클래스의 모든 메서드는 @ResponseBody가 적용된 것처럼 동작. (RESTful API를 만들 때 유용)
- 사용법: 클래스 레벨에 사용.
예시:
Java
@RestController
@RequestMapping("/api/users")
public class UserApiController {
@GetMapping("/{id}")
public User getUser(@PathVariable int id) { ... } // JSON 응답
@PostMapping
public User createUser(@RequestBody User user) { ... } // JSON 응답
}
- @ModelAttribute
- 역할:
- 메서드 레벨: 해당 메서드의 반환 값을 Model에 자동으로 추가. (여러 핸들러 메서드에서 공통으로 사용하는 데이터를 설정할 때 유용)
- 파라미터 레벨: HTTP 요청 파라미터들을 객체(Command Object/ Form Object)에 바인딩하거나, 세션에 있는 Model Attribute를 가져옵니다.
- 사용법 : 메서드 또는 메서드 파라미터에 사용
- 역할:
Java
// 메서드 레벨
@ModelAttribute("categories") // "categories"라는 이름으로 Model에 추가
public List<Category> populateCategories() {
return categoryService.getAllCategories();
}
// 파라미터 레벨
@PostMapping("/products")
public String createProduct(@ModelAttribute("product") Product product, BindingResult result) {
// product 객체에 요청 파라미터 바인딩.
// "product"라는 이름의 Model Attribute가 세션에 있으면, 요청 파라미터와 병합(merge). 없으면 새로 생성
if (result.hasErrors()) {
return "productForm";
}
...
}
- @SessionAttributes
- 역할: Model에 저장된 특정 속성들을 HTTP 세션에 저장하고 관리. (여러 요청에 걸쳐 데이터를 유지해야 할 때 사용)
- 사용법: 클래스 레벨.
- value 또는 names: 세션에 저장할 Model 속성 이름(들).
- types: 세션에 저장할 Model 속성의 타입(들).
- 예시:
Java
@Controller
@SessionAttributes("userForm") // "userForm"이라는 이름의 Model 속성을 세션에 저장
public class UserController { ... }
- @SessionAttribute
- 역할: 세션에 저장된 특정 속성 값을 메서드 파라미터에 바인딩.
- 사용법: 메서드 파라미터에 사용.
- 예시:
Java
@GetMapping("/checkout")
public String checkout(@SessionAttribute("shoppingCart") ShoppingCart cart) {
// "shoppingCart"라는 이름으로 세션에 저장된 객체를 가져옴
...
}
2. 뷰 및 모델 (View & Model)
- @ModelAttribute (메서드 레벨)
- 역할: 메서드의 반환 값을 Model에 자동으로 추가. (여러 핸들러 메서드에서 공통으로 사용하는 데이터를 설정할 때 유용)
- 사용법: 메서드 레벨에 사용.
- 예시:
Java
@Controller
public class MyController {
@ModelAttribute("commonData") // "commonData"라는 이름으로 Model에 추가
public CommonData getCommonData() {
// ...
}
@GetMapping("/page1")
public String page1() {
// "commonData"를 뷰에서 사용 가능
...
}
}
- Model, ModelMap, ModelAndView
- 역할: 뷰에 전달할 데이터를 저장하는 객체.
- Model: 인터페이스. 가장 일반적으로 사용.
- ModelMap: Model 인터페이스의 구현체 (Map 형태).
- ModelAndView: 데이터(Model)와 뷰 이름(View Name)을 함께 저장. (예전 방식. 요즘은 Model과 뷰 이름을 따로 반환하는 방식이 선호됨.)
- 사용법: 컨트롤러 메서드의 파라미터로 선언
- 역할: 뷰에 전달할 데이터를 저장하는 객체.
Java
@GetMapping("/hello")
public String hello(Model model) {
model.addAttribute("message", "Hello, Spring!"); // "message"라는 이름으로 데이터 추가.
return "hello"; // View 이름 반환
}
@GetMapping("/data")
public ModelAndView data() {
ModelAndView mav = new ModelAndView("dataView"); // 뷰 이름 설정
mav.addObject("data", someData); // "data"라는 이름으로 데이터 추가.
return mav;
}
3. 예외 처리 (Exception Handling)
- @ExceptionHandler
- 역할: 컨트롤러 내에서 발생하는 예외를 처리하는 메서드를 정의.
- 사용법: 메서드 레벨에 사용.
- value: 처리할 예외 타입(들)을 지정. (생략하면 메서드 파라미터의 예외 타입이 사용됨)
- 예시:
Java
@Controller
public class MyController {
@ExceptionHandler(MyCustomException.class) // MyCustomException 처리
public String handleMyCustomException(MyCustomException ex, Model model) {
model.addAttribute("error", ex.getMessage());
return "errorPage";
}
@ExceptionHandler(Exception.class) // 다른 모든 예외 처리.
public String handleException(Exception e){
return "error";
}
}
- @ControllerAdvice
- 역할: 여러 컨트롤러에서 공통으로 발생하는 예외를 처리하는 클래스를 정의. (전역 예외 처리)
- 사용법: 클래스 레벨에 사용합니다. @ExceptionHandler, @ModelAttribute, @InitBinder 메서드를 포함할 수 있다.
- 예시:
Java
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public String handleGlobalException(Exception ex) {
// ...
}
}
- @ResponseStatus
- 역할: 예외 발생 시 응답 상태 코드를 지정.
- 사용법: @ExceptionHandler 메서드 또는 예외 클래스에 사용.
- 예시:
Java
@ResponseStatus(HttpStatus.NOT_FOUND) // 404 Not Found
public class ResourceNotFoundException extends RuntimeException {
// ...
}
@Controller
public class MyController{
@ExceptionHandler(ResourceNotFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND) // 예외 핸들러에서도 지정 가능.
public String handleResourceNotFound(){...}
}
4. 데이터 바인딩 및 유효성 검사 (Data Binding & Validation)
- @Valid
- 역할: Bean Validation API (JSR-303/JSR-380)를 사용하여 객체의 유효성을 검사.
- 사용법: @RequestBody 또는 @ModelAttribute와 함께 메서드 파라미터에 사용.
- 예시:
Java
public class User {
@NotBlank // javax.validation.constraints.NotBlank (Bean Validation 어노테이션)
private String username;
@Min(18) // javax.validation.constraints.Min
private int age;
// ...
}
@PostMapping("/users")
public String createUser(@Valid @RequestBody User user, BindingResult result) {
if (result.hasErrors()) {
// 유효성 검사 오류 처리
...
}
// ...
}
- BindingResult
- 역할: 유효성 검사 결과 (오류 정보)를 저장하는 객체입니다.
- 사용법: @Valid 어노테이션이 붙은 객체 바로 다음에 오는 파라미터로 선언합니다.
Java
public class User {
@NotBlank // javax.validation.constraints.NotBlank (Bean Validation 어노테이션)
private String username;
@Min(18) // javax.validation.constraints.Min
private int age;
// ...
}
@PostMapping("/users")
public String createUser(@Valid @RequestBody User user, BindingResult result) {
if (result.hasErrors()) {
// 유효성 검사 오류 처리
...
}
// ...
}
- @InitBinder
- 역할: WebDataBinder를 초기화하는 메서드를 정의. (데이터 바인딩, 유효성 검사 전에 호출됨)
- 데이터 타입 변환 (커스텀 PropertyEditor 등록)
- 유효성 검사기(Validator) 등록
- 허용/비허용 필드 설정
- 사용법: 메서드 레벨에 사용.
- 예시
- 역할: WebDataBinder를 초기화하는 메서드를 정의. (데이터 바인딩, 유효성 검사 전에 호출됨)
Java
@Controller
public class MyController {
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.addValidators(new MyCustomValidator()); // 커스텀 Validator 등록
}
}
'개발 > Spring' 카테고리의 다른 글
[Spring] 예외처리 (0) | 2025.03.27 |
---|---|
[Spring]Model vs RedirectAttributes (0) | 2025.03.16 |
[Spring] SpEL (0) | 2025.03.16 |
[Spring] xml 설정 파일 예시 (0) | 2025.03.16 |
[Spring] 날짜 파라미터 처리하기 (0) | 2025.03.14 |