요청 매핑
요청이 왔을 때 컨트롤러와 매핑해 주는 것
@RestController
public class MappingController {
private Logger log = LoggerFactory.getLogger(getClass());
/**
* 기본 요청
* 둘다 허용 /hello-basic, /hello-basic/
* HTTP 메서드 모두 허용 GET, HEAD, POST, PUT, PATCH, DELETE
*/
@RequestMapping("/hello-basic")
public String helloBasic() {
return "ok";
}
}
@RestController
- @RestController 는 반환 값으로 뷰를 찾는 것이 아니라, HTTP 메시지 바디에 바로 입력한다.
@RequestMapping("/hello-basic")
- /hello-basic URL 호출이 오면 이 메서드가 실행되도록 매핑한다.
- 대부분의 속성을 배열[] 로 제공하므로 다중 설정이 가능하다. {"/hello-basic", "/hello-go"}
HTTP 메서드 고려한 매핑
@RequestMapping(value = "/mapping-get-v1", method = RequestMethod.GET)
편리한 축약 애노테이션
@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping
PathVariable(경로 변수) 사용
@GetMapping("/mapping/{userId}")
public String mappingPath(@PathVariable("userId") String data) {
log.info("mappingPath userId={}", data); //url에 userId부분에 userA라고 하면 log에 userA가 찍힌다.
return "ok";
}
변수명이 같으면 생략가능하다
- ex) @PathVariable("userId") String userId -> @PathVariable userId
최근 HTTP API는 다음과 같이 리소스 경로에 식별자를 넣는 스타일을 선호한다.
- /mapping/userA
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";
}
특정 파라미터 조건 매핑
@GetMapping(value = "/mapping-param", params = "mode=debug")
public String mappingParam() {
log.info("mappingParam");
return "ok";
}
mode=debug가 특정 파라미터이고, 이게 url에 있어야 호출이 된다.
잘 사용하지 않는다.
특정 헤더 조건 매핑
@GetMapping(value = "/mapping-header", headers = "mode=debug")
public String mappingHeader() {
log.info("mappingHeader");
return "ok";
}
HTTP 헤더에 매핑 정보와 같은 값이 있어야 호출된다.
미디어 타입 조건 매핑 - HTTP 요청 Content-Type, consume
@PostMapping(value = "/mapping-consume", consumes = MediaType.APPLICATION_JSON_VALUE)
public String mappingConsumes() {
log.info("mappingConsumes");
return "ok";
}
HTTP 요청의 Content-Type 헤더를 기반으로 미디어 타입으로 매핑한다. 만약 맞지 않으면 HTTP 415 상태코드(Unsupported Media Type)을 반환
미디어 타입 조건 매핑 - HTTP 요청 Accept, produce
@PostMapping(value = "/mapping-produce", produces = "text/html")
public String mappingProduces() {
log.info("mappingProduces");
return "ok";
}
HTTP 요청의 Accept 헤더를 기반으로 미디어 타입으로 매핑한다. 만약 맞지 않으면 HTTP 406 상태코드(Not Acceptable)을 반환한다
예제 코드에서 consumes = “application/json” 이라고 되어 있는데 consumer와 produce가 있다.
consumes는 컨트롤러 입장에서 소비하는 입장. 요청의 content type을 소비하는 입장이다.
produce는 생산하는 입장. 이 컨트롤러가 생산해내는 content type이 produces = “...”이다
클라이언트 입장에서 헤더에 있는 accecpt는 accept 헤더에 있는 것만 받아 들일 수 있다. 근데 accept 헤더에 “application/json”이 있는데 prodeuce에 “text/html”인 것을 호출하면 오류가 날 수 밖에 없다.
HTTP 요청의 Accept 헤더를 기반으로 미디어 타입으로 매핑한다. 만약 맞지 않으면 HTTP 406 상태코드(Not Acceptable)을 반환한다.
'Spring > Spring MVC' 카테고리의 다른 글
HTTP 요청 메시지 - 텍스트, JSON (1) | 2023.10.05 |
---|---|
HTTP 요청 파라미터 - 쿼리 파라미터, HTML Form (0) | 2023.10.05 |
컴포넌트 스캔 (0) | 2023.09.17 |
스프링 MVC 시작하기 (0) | 2023.09.05 |
스프링 MVC 구조 (0) | 2023.09.04 |