프로그래밍 공부/Spring

[Spring] @RequestMapping

@RequestMapping이란?

 client에서 오는 요청을 처리하기 위한 api url을 매핑할 때, Spring에서는 @RequestMapping이라는 어노테이션을 사용한다. 이때, 편의를 위해서 이 RequestMapping을 4가지로 나뉘어 추가적으로 지원하는데, 이는 아래의 5가지와 같다.

  • @GetMapping
  • @PostMapping
  • @PutMapping
  • @DeleteMapping
  • @PatchMapping

 

@ReqeustMapping의 옵션

value

value는 간단하게 말하면 연결할 url이다. 

이는 다양한 방식으로 사용할 수 있으며, 기본적으로 url을 넣는 이외에도 정규식, 변수, AntPattern 등을 다양하게 활용할 수 있다.

 @RequestMapping(value = "/example")
 
// value를 제외한 다른 옵션이 없는 경우
@RequestMapping("/example")

// Ant pattern을 사용한 경우 -> example/1, example/runa등 모두 연결된다.
@RequestMapping("/example/**")

//사이에 변수를 넣는 경우
@RequestMapping("/example/{id}")

//{변수명:정규식}의 구문으로 url 변수를 선언할 경우
@GetMapping("/{name:[a-z-]+}-{version:\\d\\.\\d\\.\\d}{ext:\\.[a-z]+}")

 

method

RequestMethod로 명명된 8가지 중 하나를 사용하는 것이 일반적이다.

public enum RequestMethod {
	GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE
}

//적용 예시
@RequestMapping(method = RequestMethod.GET, value = "/example")

하지만, GET, POST, PUT, PATCH, DELETE의 경우에는 각각의 메서드에 맞는 어노테이션 (위 예시의 경우 @GetMapping)을 사용하는 것이 더 간결하고 가독성이 좋아진다.

 

 

params

params는 api url을 특정해서 전달받고 싶을 때 사용하는 것으로, params에 전달한 것과 일치하는 params가 붙으면 이 메서드로 매핑한다.

// /post?useYn=Y 일 경우 호출됨
@RequestMapping(value="/example", params="useYn=Y")

// not equal도 가능
@RequestMapping(value="/example", params="useYn!=Y")

// 값에 상관없이 파라미터에 useYn이 있을 경우 호출됨
@RequestMapping(value="/example", parmas="useYn")

// 파라미터에 useYn이 없어야 호출됨
@RequestMapping(value="/example", params="!useYn")

 

headers

header의 정보를 제한할 수 있도록 전달하는 옵션이다. 

HTTP 헤더의 종류 

@RequestMapping(value="/example", headers="content-type=text/*")

 

produces

출력하고자 하는 데이터 포맷을 정의하는 데 사용한다. 아래 예시의 경우에는 return값을 textPlainValue로 지정할 수 있다. 다만, @RestController에서 ResponseEntity를 반환하는 경우에는 application/json으로 값이 지정되어있기 때문에 특정 옵션을 설정할 수 없다.

@PostMapping( value ="/hello", produces = MediaType.TEXT_PLAIN_VALUE)

 

consumes

수신하고자 하는 데이터 포멧을 정의한다. 

하지만 @RequestBody와 @ModelAttribute의 경우 HttpMessageConverter에서 객체로 변환하는 과정을 지나며 기본 값으로 application/json이 지정되어 있기 때문에 특정 옵션을 줄 수 없다.

 

@PostMapping(value = "/produce{example}", consumes = MediaType.TEXT_PLAIN_VALUE)

 

참고자료

https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-ann-requestmapping

https://tecoble.techcourse.co.kr/post/2021-06-18-spring-request-mapping/

https://2ham-s.tistory.com/292