- Spring에서는 각 요청에 따라 메서드를 매핑시킬 수 있는데, 각 요청에 따른 메서드 매핑 방법에 대해서 알아보자
1. 주소 매핑
@RequestMapping({"/hello-basic", "/hello-go"})
public String helloBasic() {
log.info("helloBasic");
return "ok";
}
- 메서드의 주소와 일치하면 어떤 http 메서드로도 접근할 수 있다.
- 배열의 형태로 url을 다중 설정 할 수 있다
2. 메소드 매핑
/**
* method 특정 HTTP 메서드 요청만 허용
* GET, HEAD, POST, PUT, PATCH, DELETE
*/
@RequestMapping(value = "/mapping-get-v1", method = RequestMethod.GET)
public String mappingGetV1() {
log.info("mappingGetV1");
return "ok";
}
/**
* 편리한 축약 애노테이션 (코드보기)
*
* @GetMapping
* @PostMapping
* @PutMapping
* @DeleteMapping
* @PatchMapping
*/
@GetMapping(value = "/mapping-get-v2")
public String mappingGetV2() {
log.info("mapping-get-v2");
return "ok";
}
- 특정 HTTP메서드에만 동작하도록 매핑하는 방법
3. PathVariable 매핑
/**
* PathVariable 사용
* 변수명이 같으면 생략 가능
*
* @PathVariable("userId") String userId -> @PathVariable userId
* /mapping/userA
* 변수명과 PathVariable의 이름이 같으면 따로 이름을 명시하지 않아도 매핑이 된다
*/
@GetMapping("/mapping/{userId}")
public String mappingPath(@PathVariable("userId") String userId) {
log.info("mappingPath userId = {}", userId);
return "ok";
}
/**
* PathVariable 사용 다중
*/
@GetMapping("/mapping/users/{userId}/orders/{orderId}")
public String mappingPath(@PathVariable String userId, @PathVariable Long orderId) {
log.info("mappingPath userId={}, orderId={}", userId, orderId);
return "ok";
}
- PathVariable을 이용하여 매핑하는 방법
4. 쿼리스트링 매핑
/**
* 파라미터로 추가 매핑
* params="mode",
* params="!mode"
* params="mode=debug"
* params="mode!=debug" (! = )
* params = {"mode=debug","data=good"}
* 특정 파라이터가 있으면 동작
* 잘 사용되지는 않음
*/
@GetMapping(value = "/mapping-param", params = "mode=debug")
public String mappingParam() {
log.info("mappingParam");
return "ok";
}
- 쿼리스트링으로 매핑하는 방법
- 파라미터의 key와 value가 mode에 debug로 이루어져 있는 요청만 매핑됨
5. 헤더 매핑
/**
* 특정 헤더로 추가 매핑
* 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헤더에 mode: debug가 포함된 요청만 매핑
6. 미디어타입 매핑
/**
* Content-Type 헤더 기반 추가 매핑 Media Type
* consumes="application/json"
* consumes="!application/json"
* consumes="application/*"
* consumes="*\/*"
* MediaType.APPLICATION_JSON_VALUE
*/
@PostMapping(value = "/mapping-consume", consumes = "application/json")
public String mappingConsumes() {
log.info("mappingConsumes");
return "ok";
}
- HTTP 바디 데이터 형식이 json일 경우에만 매핑
7. Accept 헤더 기반 매핑
/**
* Accept 헤더 기반 Media Type
* produces = "text/html"
* produces = "!text/html"
* produces = "text/*"
* produces = "*\/*"
*/
@PostMapping(value = "/mapping-produce", produces = MediaType.TEXT_HTML_VALUE)
public String mappingProduces() {
log.info("mappingProduces");
return "ok";
}
- 클라이언트 요청의 appept헤더와 일치할 경우에만 매핑하는 방법
- 요청 헤더에 accept: text/html가 있을 경우에만 매핑