코드 그라데이션
요청 매핑 본문
MappingController
@RestController
public class MappingController {
private Logger log = LoggerFactory.getLogger(getClass());
@RequestMapping(value = "/hello-basic")
public String helloBasic() {
log.info("helloBasic");
return "ok";
}
}
이 url이 오면 실행이 된다.
매핑 정보(한번 더)
둘다 허용 - 스프링 부트 3.0 이전
다음 두가지 요청은 다른 URL이지만, 스프링은 다음 URL 요청들을 같은 요청으로 매핑한다.
매핑: /hello-basic
URL 요청: /hello-basic , /hello-basic/
HTTP 메서드
@RequestMapping 에 method 속성으로 HTTP 메서드를 지정하지 않으면 HTTP 메서드와 무관하게
호출된다.
모두 허용 GET, HEAD, POST, PUT, PATCH, DELETE
이제 method를 지정하게 되면
@RequestMapping(value = "/mapping-get-v1", method = RequestMethod.GET)
public String mappingGetV1() {
log.info("mappingGetV1");
return "ok";
}
예를 들어 이 상황에서 POST 요청을 보낸다면 405 오류가 나온다.
HTTP 메서드 매핑 축약
/**
* 편리한 축약 애노테이션 (코드보기)
* @GetMapping
* @PostMapping
* @PutMapping
* @DeleteMapping
* @PatchMapping
*/
@GetMapping(value = "mapping-get-v2")
public String mappingGetV2() {
log.info("mappping-get-v2");
return "ok";
}
HTTP 메서드를 축약한 애노테이션을 사용하는 것이 더 직관적이다. 코드를 보면 내부에서
@RequestMapping 과 method 를 지정해서 사용하는 것을 확인할 수 있다.
PathVariable(경로 변수) 사용
/**
* PathVariable 사용
* 변수명이 같으면 생략 가능
*
* @PathVariable("userId") String userId -> @PathVariable userId
* /mapping/userA
*/
@GetMapping("/mapping/{userId}")
public String mappingPath(@PathVariable("userId") String data) {
log.info("mappingPath userId={}", data);
return "ok";
}
위에 주석으로 달아놓은 게 뭐냐면
바로 위 코드는
@GetMapping("/mapping/{userId}")
public String mappingPath(@PathVariable userId) {
log.info("mappingPath userId={}", userId);
return "ok";
}
얘와 동일하다는 뜻
실행해보면
실행
http://localhost:8080/mapping/userA
최근 HTTP API는 다음과 같이 리소스 경로에 식별자를 넣는 스타일을 선호한다.
경로변수라는 것이고,
이 url 자체에 값이 들어가 있는 것을 의미.
@PathVariable로 경로 변수의 값을 꺼낼 수 있다는 것.
cf) ?userId = userA
=> 이 형태는 쿼리 파라밑터 방식.
PathVariable 사용 - 다중
/**
* 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";
}
실행
http://localhost:8080/mapping/users/userA/orders/100
특정 파라미터 조건 매핑
- 특정 파라미터가 있거나 없는 조건을 추가할 수 있다. 잘 사용하지는 않음.
- url 정보 + 파라미터 정보 => 파라미터 정보를 추가 매핑한 것.
실행
http://localhost:8080/mapping-param?mode=debug
만약 뒤에 걸 뺀다면
진짜 400 나옴
특정 헤더 조건 매핑
=> HTTP 헤더를 사용.
/**
* 특정 헤더로 추가 매핑
* 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";
}
이걸 그냥 실행해보면
404 에러 나온다.
그래서 헤더 정보를 추가해주어야 한다.
이제는 문제 없이 출력됨
미디어 타입 조건 매핑 - HTTP 요청 Content-Type, consume
/**
* 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 요청의 Content-Type 헤더를 기반으로 미디어 타입으로 매핑한다.
만약 맞지 않으면 HTTP 415 상태코드(Unsupported Media Type)을 반환한다.
실행하면
일단 사전작업이 필요하다
데이터 하나 집어넣고,
타입 확인 한 후 send를 보내면
문제 없이 출력됨
미디어 타입 조건 매핑 - HTTP 요청 Accept, Produce
얘는 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";
}
실행해보면
바꿔주면 성공한다
HTTP 요청의 Accept 헤더를 기반으로 미디어 타입으로 매핑한다.
만약 맞지 않으면 HTTP 406 상태코드(Not Acceptable)을 반환한다.
'Spring > MVC 1' 카테고리의 다른 글
<추가> Locale이란? By chat GPT (0) | 2023.10.08 |
---|---|
요청 매핑 - API 예시 (1) | 2023.10.07 |
스프링 MVC - 실용적인 방식 (0) | 2023.10.05 |
스프링 MVC - 컨트롤러 통합 (0) | 2023.10.05 |
스프링 MVC 시작하기 (0) | 2023.10.04 |