[Spring] @RequestMapping 옵션
by 무작정 개발이번 글에서는 @RequestMapping 어노테이션의 옵션들에 대해 정리할 것입니다.
국비 과정을 들으며, 기존에 알고 있던 @RequestMapping 옵션들과 다른 옵션들이 존재하는 것을 알게 되어 기존에 알고 있던 것들과 새로운 것들을 다시 정리하는 시간을 가지게 되었습니다.
- @RequestMapping 어노테이션에 대한 자세한 글은 하단에 있는 이전 글 참고
[Spring] @RequestMapping이란 그리고 동작 방식
1. @RequestMapping이 받는 옵션
이제 @RequestMapping이 받는 옵션들에 대해 알아볼 것입니다.
RequestMapping은 기본적으로 같은 URL과 모든 옵션이 같을 수 없습니다. 이렇게 지정하는 옵션은 Handler(핸들러)에서 매핑하는 기준이 됩니다.
value, method, params, headers, consumes, produces 중에서 1개라도 달라야지 올바르게 Handler가 매핑을 해줄 수 있습니다.
[ RequestMapping 옵션 종류 ]
이름 | 타입 | 설명 |
value | String [] | URL 값으로 매 핑 조건 부여(default) |
method | RequestMethod [] | HTTP Request 메서드 값을 매핑 조 건으로 부여 사용 가능한 메서드는 GET, POST, HEAD, OPTIONS, PUT, DELETE, TRACE |
params | String [] | HTTP Request 파라미터를 매핑 조건으로 부여 |
consumes | String [] | 설정과 Content-Type Request 헤더가 일치할 경우에만 URL이 호출됨 |
produces | String [] | 설정과 Accept Request 헤더가 일치할 경우에만 URL이 호출됨 |
지금부터 @RequestMapping 옵션들에 대해 하나씩 정리할 것입니다.
(1) value
value는 연결한 URL를 뜻합니다.
보통 호스트 주소와 포트 번호를 제외하고 Api 설계 규약에 따라 이름을 짓고, 다음과 같이 설정할 수 있습니다.
- 다른 옵션들을 제외하고, value 옵션만 주어질 경우 " value = " 부분을 생략할 수 있습니다.
@RequestMapping(value = "/value/sample")
// -> value만 있을 경우 "value = " 생략 가능
@RequestMapping("/value/sample")
추가적으로 아래와 같이 다중 요청도 가능하며 셋 중 어느 URL를 거쳐도 다 연결이 가능합니다.
- 대신 " { } " 형식으로 감싸줘야 합니다.
@RequestMapping({"/api", "/api/two", "api/three"})
두 번째로, [ Ant Pattern ]을 적용한 URL Mapping도 가능합니다.
예시를 들자면, 아래와 같이 Mapping(매핑)하면 "/api/test1", "/api/test2", "/api/test3" 전부 연결이 가능합니다.
@RequestMapping(value = "/api/**")
세 번째로, { } 사이에 변수를 넣어서 URL을 매핑하는 것도 가능합니다.
이러한 매핑 방법인 경우 method 인자로 @PathVariable을 id로 받아야 합니다.
@RequestMapping(value = "/api/{id}")
(2) method
RequestMethod의 경우에, GET, POST, PUT, DELETE, HEAD, OPTIONS, TRACE 등 8가지가 있습니다.
보통의 경우 @RequestMapping 어노테이션에 아래와 같이 method를 작성할 수 있습니다.
// GET 방식일 경우
@RequestMapping(value = "/api", method = RequestMethod.GET)
덧붙이자면 이전 글에서도 작성하였지만 GET, POST, PUT, PATCH, DELETE 등 method에 대해 각각에 맞는 method 옵션이 적용된
( @GetMapping, PostMapping, DeleteMapping 등)의 어노테이션이 Spring 4.3 버전부터 추가되어 존재하고, @RequestMapping 하위에 써서 코드를 좀 더 간결하게 작성 가능합니다.
@RestController
@RequestMapping("/api")
public class MainController {
// -> Local 환경에서 실행한다면 -> localhost:8080
....
// -> localhost:8080/api/created
@PostMapping("/created")
public String created() {
....
}
// -> localhost:8080/api/read
@GetMapping("/read")
public String read() {
....
}
}
추가적으로 @RequestMapping은 Class, Method에 붙일 수 있지만, @GetMapping, @PostMapping 등은 Method에만 붙일 수 있습니다.
(3) params
params는 Api URL을 [ "/api?id=1&password=1234" ]와 같이 전달할 때 사용합니다.
params에 전달한 것과 일치하는 param이 붙으면 이 Method로 매핑해줍니다.
@RequestMapping(value = "/api/getList", method = RequestMethod.GET, params = {"id", "password"})
public String getList(@RequestParam("id") String paramId,
@RequestParam("password") String password {
...
}
(4) consumes
consumes는 request(요청)의 content-type request header가 일치하는 것을 찾는 옵션입니다.
요청에 들어오는 인자 값이 무엇인지에 따라서 같은 URL, Method 임에도 구분이 가능합니다.
But, @RequestBody와 @ModelAttribute의 경우 HttpMessageConverter에서 객체로 변환하는 과정을 거치며 기본 값으로
[ application/json ] 이 지정되어 있기 때문에 특정 옵션을 줄 수 없습니다.
- consumes는 필수 옵션이 아니라 굳이 지정해주지 않아도 됨
- @RequestBody / @ModelAttribute인 경우 -> [ application/json ] 이 기본 값(디폴트 값)으로 전달
- @RequestParam / @PathVariable인 경우 -> [ text/plan ] 이 기본 값으로 전달
@PostMapping(value = "/api/list/{name}", consumes = MediaType.TEXT_PLAIN_VALUE)
public String getList(@PathVariable String name) {
....
}
(5) produces
produces는 response(응답)의 accept-request header 가 특정 옵션으로 반환될 것을 지정하는 옵션입니다.
응답(response)이 무엇인지 미리 예측하는 것은 불가능하기에 같은 URL로 요청(request)이 들어왔을 때 produces 옵션으로 구분해서 실행하는 것은 불가능합니다.
그리고 @RestController에서 ResponseEntity를 반환하는 경우에는 기본으로 [ application/json ]으로 값이 지정되어 있기에 특정 옵션을 설정할 수 없습니다.
- produces는 필수 옵션이 아니므로 따로 지정해주지 않아도 [ application/json ]으로 기본 값이 전달되거나 와일드카드로 값이 전달됩니다.
- 아래와 같이 produces를 사용할 수 있습니다.
@GetMapping(value = "/api/getList", produces = MediaType.TEXT_PLAN_VALUE)
public String getList() {
return "getList";
}
Reference
@RequestMapping의 produces, Content-Type, Consumes란?
'Back-End > SpringBoot' 카테고리의 다른 글
[Spring] Model, ModelAndView 차이점 (feat.ModelAndView를 지양하자) (0) | 2023.02.17 |
---|---|
Spring DI(Dependency Injection) - 의존 관계 주입 핵심 정리 (0) | 2023.02.02 |
[Spring] @RequestMapping이란 그리고 동작 방식 (0) | 2022.12.14 |
@Controller와 @RestController 차이점 (2) | 2022.11.03 |
@Autowired vs @RequiredArgsConstructor vs @Resource 차이점 (3) | 2022.10.14 |
블로그의 정보
무작정 개발
무작정 개발