
매핑 정보
@RestController
@Slf4j
public class MappingController {
@RequestMapping("/hello-basic")
public String helloBasic() {
log.info("helloBasic");
return "ok";
}
}
@RequestController
@Controller는 반환 값이 String 이면 View 이름으로 인식된다. 그래서 View를 찾고 View가 랜더링 된다.@RestController는 반환 값으로 View를 찾는 것이 아니라, HTTP message Body에 바로 입력한다. 따라서 실행 결과로 ok 메세지를 받을 수 있다.
HTTP Response반환 값이View가 아닌 특정 데이터인 경우@ResponseBody가 필요했다. 그러나 매번Controller에@ResponseBody를 적용하는 것은 번거롭다.
그래서 등장한 것이@RestController이다.
@RestController = @Controller + @ResponseBody 를 의미한다.
결론:HTTP REST API개발을 할 때에는@RestController를 사용하자!
@RequestMapping("/hello-basic")
@RequestMapping{"/hello-basic", "/hello-go"}
/hello-basic URL 호출이 오면 이 메서드가 실행되도록 매핑한다.{"/hello-basic", "/hello-go"}@RequestMapping에 Method 속성으로 HTTP 메서드를 지정하지 않으면 GET, POST, PUT, DELET, HEAD 모두 허용이 된다. HTTP 메서드와 무관하게 호출된다.
@RequestMapping 방식은 HTTP의 request를 method에 따라 매핑한다.
/* method 속성 지정으로 HTTP method 와 매핑 */
@RequestMapping(value = "mapping-get-v1", method = RequestMethod.GET)
public String mappingGetV1() {
log.info("mappingGetV1");
return "ok";
}
만약 여기에 POST 요청을 한다면 Spring MVC는 HTTP 405 상태코드(Method Not Allowed)를 반환한다.
HTTP 메서드를 축약한 애노테이션을 사용하는 방식이다.
/**
* 편리한 출약 애노테이션
*
* @GetMapping
* @PostMapping
* @PutMapping
* @DeleteMapping
* @PatchMapping
*/
@GetMapping(value = "/mapping-get-v2")
public String mappingGetV2() {
log.info("mapping-get-v2");
return "ok";
}
HTTP 메서드를 축약한 애노테이션을 사용했더니 더욱 직관적이다. @RequestMapping에 비해 직관적이라는 장점이 있어서 권장되는 방식이다.
@GetMapping 내부
@GetMapping내부를 보니@RequestMapping과method를 지정해서 사용하는 것을 볼 수 있다.
/**
* 파라미터로 추가 매핑
* 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";
}
Query String으로 넘어온 데이터에 특정 parameter가 존재할 때 매핑되는 방식이다./**
*특정 헤더로 추가 매핑
* 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를 사용한다.HTTP request의 header에 특정 값이 있을 때 매핑되는 방식이다./**
* 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";
}
Content-Type 헤더를 기반으로 미디어 타입으로 매핑한다.예시
consumes = "text/plain"
consumes = {"text/plain", "application/*"}
consumes = MediaType.TEXT_PLAIN_VALUE
/**
* Accept 헤더 기반 Media Type * produces = "text/html"
* produces = "!text/html"
* produces = "text/*"
* produces = "*\/*"
*/
@PostMapping(value = "/mapping-produce", produces = "text/html")
public String mappingProduces() {
log.info("mappingProduces");
return "ok";
}
Accept 헤더를 기반으로 미디어 타입으로 매핑한다. 예시
produces = "text/plain"
produces = {"text/plain", "application/*"}
produces = MediaType.TEXT_PLAIN_VALUE
produces = "text/plain;charset=UTF-8"