1. Question

Spring MVC에서 주로 사용하는 annotation의 용도는?

2. Answer

A. @Controller

  • 클래스가 Spring MVC Controller의 역할을 수행함을 나타낸다.

  • 클래스를 컨트롤러로 선언하고, Spring의 Web Context에서 관리되는 Bean으로 등록한다. 주로 View를 반환하는 메서드에 사용된다.

@Controller
public class WebPageController {
  @RequestMapping("/welcome")
  public String welcome() {
    // Returns the name of the view (welcome.html)
    return "welcome";
  }
}

B. @RestController

  • @Controller@ResponseBody를 합친 meta annotation으로, RESTful Controller를 정의할 때 사용한다.

  • 클래스의 모든 메서드에서 @ResponseBody annotation이 적용되는 것과 같은 효과를 낸다. 즉, 메서드가 반환하는 값은 View Resolver에 의해 처리되지 않고, HTTP response body에 직접 작성된다. 주로 JSON이나 XML과 같은 데이터를 반환하는 API 서비스에 사용된다.

@RestController
public class SimpleApiController {
  @GetMapping("/data")
  public Map<String, String> getData() {
    return Collections.singletonMap("key", "value");
  }
}

C. @RequestMapping

  • request URL, HTTP method, request parameter, header 등에 따라 메서드를 매핑하는 데 사용한다.

  • 특정 URL 경로에 메서드를 매핑하고, HTTP method(GET, POST, PUT, DELETE)를 지정할 수 있다. 또한 paramsheaders 속성을 사용하여 더 세부적인 매핑 조건을 지정할 수 있다.

@Controller
public class GreetingController {
  @RequestMapping(value = "/greet", method = RequestMethod.GET)
  public String greet(Model model) {
    model.addAttribute("message, "Hello, World!");
    return "greet";
  }
}

D. @GetMapping, @PostMapping, @PutMapping, @DeleteMapping

  • @RequestMapping의 특수 형태로, 각각 GET, POST, PUT, DELETE HTTP 메서드에 대한 request를 처리하는 메서드를 매핑할 때 사용한다.

  • @RequestMapping을 보다 간단하게 사용할 수 있도록 해주며, 코드의 가독성을 향상시킨다.

@RestController
public class UserController {
  @GetMapping("/users")
  public List<User> listUsers() {
    return userService.getAllUsers();
  }

  @PostMapping("/users")
  public User addUser(@RequestBody User user) {
    return userService.saveUser(user);
  }
}

E. @PathVariable

  • URL 경로의 일부를 메서드의 파라미터로 사용하고 싶을 때 사용한다.

  • 이 annotation을 파라미터 앞에 붙이면, 해당 파라미터가 URL 경로에서 변수로 지정된 부분을 자동으로 받아온다. 예를 들어, /users/{userId} 경로에서 {userId} 부분을 메서드의 파라미터로 받아올 수 있다.

@GetMapping("/users/{id}")
public User getUserById(@PathVariable("id") Long id) {
  return userService.getUserById(id);
}

F. @RequestParam

  • request parameter를 메서드의 파라미터로 바인딩할 때 사용한다.

  • HTTP request의 쿼리 파라미터나 폼 데이터를 메서드의 파라미터로 전달받고 싶을 때 사용한다. 파라미터가 필수인지 여부, 기본값 등을 지정할 수 있다.

@GetMapping("/search")
public ResponseEntity<List<User>> searchUsers(@RequestParam(value = "name", required = false) String name) {
  List<User> users = userService.searchUsersByName(name);
  return new ResponseEntity<>(users, HttpStatus.OK);
}

G. @RequestBody

  • HTTP request body를 객체로 변환하여 메서드의 파라미터로 전달받고 싶을 때 사용한다.

  • 주로 JSON 또는 XML과 같은 데이터를 받아서 해당 포맷의 데이터를 자바 객체로 자동 변환해준다. HttpMessageConverter를 통해 데이터 타입이 변환된다.

@PostMapping("/users")
public User createUser(@RequestBody User user) {
  return userService.addUser(user);
}

H. @ResponseBody

  • 메서드가 반환하는 객체를 HTTP response body로 전송하고자 할 때 사용한다.

  • 반환되는 값이 View를 거치지 않고 HTTP response 데이터로 직접 출력된다. 주로 JSON이나 XML 형태로 클라이언트에 데이터를 반환할 때 사용된다.

@GetMapping("/user/{id}")
@ResponseBody
public User getUser(@PathVariable("id") int userId) {
  return userService.getUserById(userId);
}

3. Detail

None

4. Reference

None

댓글남기기