지난 포스팅에서 @RequestMapping을 다루어 보았다. @RequestMapping은 Handler(Controller)임을 명시하는 어노테이션으로, 하나의 Handler(Controller)에 여러 개의 메소드를 선언할 수 있다는 점이 장점이었다. 이런 이유로 현재 가장 많이 사용되고 있는 Controller 유형이다. @RequestMapping을 메소드에 선언하면, 요청으로 들어 온 URL과 메소드를 매핑할 수 있고 메소드에 담긴 비즈니스 로직도 실행 가능해진다.
@RequestMapping은 URL하고만 매핑되는 것이 아니다. Request의 다양한 속성과 매핑되어, 특정 조건에만 호출되어 비즈니스 로직이 실행되도록 제어 할 수 있다.
1) method
HTTP는 GET, POST, PUT , PATCH, DELETE 와 같은 요청 메소드를 가진다. 특정 요청 메소드에만 비즈니스 로직을 실행할 수 있도록 @RequstMapping에 설정할 수 있다.
@RestController
@RequestMapping("/api/users")
public class UserController {
@RequestMapping(value = "/{id}", method = RequestMethod.GET) // Get 방식
public String getUser(@PathVariable Long id) {
return "Getting user with ID: " + id;
}
@RequestMapping(method = RequestMethod.POST)// Post 방식
public String createUser(@RequestBody String userJson) {
return "Creating user with JSON data: " + userJson;
}
@RequestMapping(value = "/{id}", method = RequestMethod.PUT) // Put 방식
public String updateUser(@PathVariable Long id, @RequestBody String userJson) {
return "Updating user with ID " + id + " and JSON data: " + userJson;
}
@RequestMapping(value = "/{id}", method = RequestMethod.PATCH)//Patch 방식
public String partiallyUpdateUser(@PathVariable Long id, @RequestBody String partialUserJson) {
return "Partially updating user with ID " + id + " using JSON data: " + partialUserJson;
}
@RequestMapping(value = "/{id}", method = RequestMethod.DELETE) // Delete 방식
public String deleteUser(@PathVariable Long id) {
return "Deleting user with ID: " + id;
}
}
@RequstMapping의 method 속성에 RequetMethod가 제공하는 열거형 데이터로 GET,POST 등의 요청 메서드를 설정한다. 이로써 설정된 요청 메소드로 들어온 요청만이 해당 메소드의 비즈니스 로직을 실행할 수 있다. 그러나 이렇게 method 속성에 설정하는 방식은 번잡해보이고 보기에 좋지 못하다.
@RestController
@RequestMapping("/api/users")
public class UserController {
@GetMapping("/{id}") // GET 방식
public String getUser(@PathVariable Long id) {
return "Getting user with ID: " + id;
}
@PostMapping // POST 방식
public String createUser(@RequestBody String userJson) {
return "Creating user with JSON data: " + userJson;
}
@PutMapping("/{id}") // PUT 방식
public String updateUser(@PathVariable Long id, @RequestBody String userJson) {
return "Updating user with ID " + id + " and JSON data: " + userJson;
}
@PatchMapping("/{id}") // PATCH 방식
public String partiallyUpdateUser(@PathVariable Long id, @RequestBody String partialUserJson) {
return "Partially updating user with ID " + id + " using JSON data: " + partialUserJson;
}
@DeleteMapping("/{id}") // DELETE 방식
public String deleteUser(@PathVariable Long id) {
return "Deleting user with ID: " + id;
}
}
Spring WEB은 @GetMapping, @PostMapping 같은 요청메서드를 직관적으로 알 수 있는 어노테이션을 제공한다. 그럼 @GetMapping 어노테이션 소스를 확인해보자.
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@RequestMapping(method = RequestMethod.GET) // GET 요청 메서드 설정
public @interface GetMapping {
//중략...
}
@GetMapping 은 @RequestMapping 어노테이션을 가지고 있다. method 속성에 RequestMethod.Get이 설정되어 있다. 이와 같이, Spring WEB은 직관적으로 요청메서드를 명시하기 위해 요청메서드 전용 @RequestMapping 어노테이션을 제공하고 있다.
2. consumes, produces
특정 미디어 타입에만 비즈니스 로직이 실행되도록 매핑할 수 있다. 만약 헤더가 Content-Type 기반 헤더이면 consumes 속성에, Accept 기반 헤더이면 produces 속성에 원하는 미디어 타입을 설정하면 된다.
consumes
@PostMapping(value = "/mapping-consume", consumes = "application/json")
public String mappingConsumes() {
log.info("mappingConsumes");
return "ok";
}
미디어 타입이 일치하지 않으면 415 상태코드(Unsupported Media Type)를 반환한다.
- 예시
consumes = "text/plain"
consumes = {"text/plain", "application/*"}
consumes = MediaType.TEXT_PLAIN_VALUE
produces
@PostMapping(value = "/mapping-produce", produces = "text/html")
public String mappingProduces() {
log.info("mappingProduces");
return "ok";
}
미디어 타입이 일치하지 않으면 406 상태코드(Not Acceptable)를 반환한다.
- 예시
produces = "text/plain"
produces = {"text/plain", "application/*"}
produces = MediaType.TEXT_PLAIN_VALUE
produces = "text/plain;charset=UTF-8"
3. headers
HTTP 헤더의 특정 조건과 매핑하는 속성이다.
@GetMapping(value = "/mapping-header", headers = "mode=debug")
public String mappingHeader() {
log.info("mappingHeader");
return "ok";
}
참고자료
'SPRING > Spring MVC' 카테고리의 다른 글
[SpringMVC] HTTP 요청 파라미터 - @RequestParam (0) | 2023.08.11 |
---|---|
[SpringMVC] HTTP 요청 파라미터 - @RequestHeader (0) | 2023.08.11 |
[SpringMVC] @RequestMapping, @Controller (0) | 2023.08.10 |
[SpringMVC] HandlerAdapter (0) | 2023.08.10 |
[SpringMVC] MVC 패턴 구현하기(4) - Adapter (0) | 2023.08.09 |