[Spring] Spring MVC 주요 어노테이션

2025. 3. 16. 07:25·개발/Spring

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) 등록
      • 허용/비허용 필드 설정
    • 사용법: 메서드 레벨에 사용.
    • 예시
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
'개발/Spring' 카테고리의 다른 글
  • [Spring] 예외처리
  • [Spring]Model vs RedirectAttributes
  • [Spring] SpEL
  • [Spring] xml 설정 파일 예시
함수형 인간
함수형 인간
잘 까먹는 개발자의 두뇌 확장 장치
  • 함수형 인간
    개발 기록 노트
    함수형 인간
  • 글쓰기 관리
  • 전체
    오늘
    어제
    • 글 목록 (84)
      • 기타 (1)
      • 개발 (82)
        • Java (6)
        • Javascript (1)
        • Spring (20)
        • jQuery (0)
        • Git (0)
        • servlet (11)
        • JSP (6)
        • HTML (0)
        • CSS (10)
        • SQL (9)
        • JSTL (3)
        • Mybatis (4)
        • Design Patterns (0)
        • HTTP (2)
        • Devtools (0)
        • IntelliJ (5)
        • JDBC (1)
        • Lombok (3)
        • Logging (1)
      • 책 리뷰 (0)
  • hELLO· Designed By정상우.v4.10.3
함수형 인간
[Spring] Spring MVC 주요 어노테이션
상단으로

티스토리툴바