SPRING/Spring MVC

[SpringMVC] @RequestMapping의 다양한 속성

IT록흐 2023. 8. 10. 22:35
반응형

 

 

[SpringMVC] @RequestMapping, @Controller

[SpringMVC] HandlerAdapter [SpringMVC] MVC 패턴 구현하기(4) - Adapter [SpringMVC] MVC 패턴 구현하기(1) - View [SpringMVC] 응답(Response)의 종류 ( Text, Html, Json ) [SpringMVC] 요청(Request)의 종류 ( GET, POST, JSON ) [SpringMVC] 웹

lordofkangs.tistory.com

 

지난 포스팅에서 @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";
}

 

 

 

 


 

 

참고자료

 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., 원

www.inflearn.com

 

반응형