Spring MVC : 요청 매핑
- Spring/Spring MVC
- 2021. 12. 22.
Spring MVC의 요청매핑이란?
요청 매핑이라는 것은 요청이 왔을 때, 어떤 컨트롤러가 호출되어야 하는지를 정해주는 과정이다. 단순하게 URL만 매핑하는 방법도 있지만, 이외에도 여러가지를 맵핑하는 방법이 있다. 이번 포스팅에서는 Spring MVC의 요청매핑의 다양한 쓰임새를 알아보려고 한다.
들어가기 전
- @Controller는 String으로 반환 시, 이것을 ViewName으로 이해하고 ViewResolver를 호출한다.
- @RestController(@Controller + @ResponseBody)는 String으로 반환 시, HTTP 메시지 바디에 바로 값을 입력한다.
@RequestMapping 단순 맵핑
- @RequestMapping은 해당 URL이 들어왔을 때, 해당 메서드가 실행될 수 있도록 맵핑해준다.
- 단일 맵핑, 다중 맵핑이 가능하다.
- 단일 맵핑 : @RequestMapping("hello-basic")
- 다중 맵핑 : @RequestMapping({"hello-basic", "hello-go")}
@RequestMapping({"hello-basic","hello-go"})
public String helloBasic(){
log.info("helloBasic");
return "ok";
}
HTTP 메서드 매핑
- HTTP 메서드는 아래의 메서드를 맵핑할 수 있다.
- GET → @GetMapping
- POST → @PostMapping
- PUT → @PutMapping
- PATCH → @PatchMapping
- DELETE → @DeleteMapping
- HEAD → @HeadMapping
- HTTP 메서드는 어노테이션을 활용할 수도 있고, @RequestMapping 안에 Method 옵션을 설정해서 활용할 수도 있다.
// @GetMapping("mapping-get-v1")
@RequestMapping(value = "mapping-get-v1",method = RequestMethod.GET)
public String mappingGetV1(){
log.info("mappingGetV1");
return "ok";
}
위의 모습처럼 @RequestMapping에서 method 옵션을 추가해서 하는 방법도 있고, @GetMapping같은 축약형을 사용하는 방법도 있다. 이렇게 Method Mapping이 된 경우, 다른 Method로 URL에 맵핑 요청을 하면 다음과 같은 메세지(405 Method Not Allowed)가 발생한다.
@PathVariable (경로변수) Mapping
@GetMapping("/mapping1/{userId}")
public String mappingPath1(@PathVariable("userId") String data){
log.info("mappingPath userId = {}", data);
return "ok";
}
- @RequestMapping은 URL 경로를 템플릿화 할 수 있다. 이 때 @PathVariable을 사용하면 매칭되는 부분을 편리하게 조회할 수 있다.
- @getMapping에서 {변수명}인 것을 @PathVariable로 매개변수로 받을 수 있다.
- @PathVariable(name = 변수명}을 해주면 URL의 해당 값을 파라메터에 넣어준다.
@GetMapping("/mapping2/{userId}")
public String mappingPath2(@PathVariable String userId){
log.info("mappingPath userId = {}", userId);
return "ok";
}
- 매개변수명이 변수명과 같다면, @PathVariable의 이름을 생략할 수 있다.
@GetMapping("/mapping/users/{userId}/orders/{orderId}")
public String mappingPath2(@PathVariable String userId, @PathVariable String orderId){
log.info("mappingPath userId = {}, orderId = {}", userId, orderId);
return "ok";
}
- @PathVariable을 다중으로도 사용이 가능하다
위의 코드들의 실행 결과로 로그를 찍어보면 다음과 같은 결과가 나온다.
특정 헤더 조건 매핑. @RequestMapping(headers = "...")
/**
* headers = "!mode"
* headers = "mode"
* headers = "mode=debug"
* headers = "mode!=debug"
*/
@GetMapping(value = "/mapping-header", headers = "mode=debug")
public String mappingHeader(){
log.info("mappingHeader");
return "ok";
}
- HTTP 메서드 뿐만 아니라, 특정 헤더가 포함되어야 맵핑이 되는 기능까지 추가할 수 있다.
- header 중 key = mode, value = debug인 헤더가 있을 경우에 맵핑된다.
- 테스트는 Post Man으로 하되 헤더를 만들어서 넣어주면 된다.
미디어 타입 조건 맵핑 - HTTP 요청 Content-Type, consume
@PostMapping(value = "/mapping-consume", consumes = "application/json")
public String mappingConsumes() {
log.info("mappingConsumes");
return "ok";
}
- HTTP 요청의 Content-Type이 매칭될 경우, 맵핑해준다.
- HTTP 요청의 Content-Type을 서버 입장에서 소비하기 때문에 'consume' 명령어로 맵핑된다.
- 위의 코드는 HTTP 요청 메세지의 Content-Type이 'application/json'일 경우 매칭된다.
미디어 타입 조건 맵핑 - HTTP 요청 Accept, produce
@PostMapping(value = "/mapping-produce", produces = "text/html")
public String mappingProduces() {
log.info("mappingProduces");
return "ok";
}
- HTTP 요청 메세지의 Accept 헤더 기준으로 맵핑을 한다.
- produce는 서버 입장에서는 제공하는 것이기 때문이다.
- text/html로 맵핑할 경우 /* , text/html 정도만 맵핑이 가능하다.
- 위 코드에서 Accept 헤더를 "application/json"으로 해서 보내면 에러가 발생한다.
- 에러 발생 시, 406 Not Acceptable을 보낸다.
요청 매핑 실습
- 회원 목록 조회 : GET /users
- 회원 등록: POST /users
- 회원 조회: GET /users/{userid}
- 회원 수정 : PATCH /users/{userid}
- 회원 삭제 : DELETE / users/{userid}
위의 형태의 요청을 맵핑해보자.
@RestController
@RequestMapping("/mapping/users")
@Slf4j
public class MappingClassController {
@GetMapping
public String getMapping() {
log.info("getMapping");
return "ok";
}
@PostMapping
public String postMapping() {
log.info("postMapping");
return "ok";
}
@GetMapping("/{userId}")
public String getMapping(@PathVariable String userId) {
log.info("getMapping userId = {}", userId);
return "ok";
}
@PatchMapping("/{userId}")
public String patchMapping(@PathVariable String userId){
log.info("patchMapping userId = {}", userId);
return "ok";
}
@DeleteMapping("/{userId}")
public String deleteMapping(@PathVariable String userId) {
log.info("deleteMapping userId = {}", userId);
return "ok";
}
}
'Spring > Spring MVC' 카테고리의 다른 글
Spring MVC : 정적 리소스, 뷰 템플릿, HTTP API (0) | 2021.12.22 |
---|---|
Spring MVC : HTTP 요청 데이터 받기 (0) | 2021.12.22 |
Spring MVC : SLF4J를 활용한 로그 남기기 (0) | 2021.12.22 |
Spring MVC : 가장 간단하게 시작하기 (0) | 2021.12.20 |
Spring MVC : 가장 기초적인 부분들 정리 (0) | 2021.12.20 |