[SPRING] 애노테이션 기반의 요청 매핑
서버에 요청이 오면 호출될 컨트롤러 매핑의 다양한 방식에 대한 개인적인 학습의 정리글입니다.
URL 기반의 매핑
매핑하려는 URL를 애노테이션에 입력하거나 value 속성에 주입하여 사용한다.(가장 일반적인 방식)
@RequestMapping("/border/game") //@RequestMapping(value="/border/game")
public String gameBorder() {
return "board/gameBoard";
}
위 처럼 매핑했을때
- /border/game
- /border/game/
두개의 URL 모두 매핑이 실행된다.
value 속성도 배열을 제공하므로 다중 설정이 가능하다. ex) {"/hello-basic", "/hello-go"}
HTTP 메서드 매핑
컨트롤러의 메소드에 특정 HTTP 메소드(GET, POST, PUT, DELETE, PATCH, HEAD)만 허용하는 방식입니다.
- HTTP 메서드 모두 허용(method속성을 넣지않으면)
@RequestMapping(value = "/border/game", method = RequestMethod.GET)
public String gameBorder() {
return "board/gameBoard";
}
허용하고 싶은 HTTP 메소드를 method 속성에 주입하여 사용합니다.
RequestMapping 어노테이션을 보면
method()는 RequestMethod Enum Class의 배열을 리턴 하기 때문에 아래와 같이 하나 이상의 HTTP 메소드를 허용할 수 있지만
역할에 따라 하나의 HTTP요청만 처리하도록 하는것이 좋은 설계라고 생각합니다.
@RequestMapping(value = "/border/game", method = {RequestMethod.GET, RequestMethod.POST})
허용하지 않은 HTTP 메소드가 요청이 온다면?
HTTP 메서드 매핑 축약
HTTP 메서드를 축약한 애노테이션을 사용하면 더 직관적으로 사용이 가능합니다. 축약 애노테이션은 아래와 같습니다.
- @GetMapping
- @PostMapping
- @PutMapping
- @DeleteMapping
- @PatchMapping
RequestMapping 애노테이션과 동일하게 사용합니다.
//@RequestMapping
@PostMapping("/border/game")
public String gameBorder() {
return "board/gameBoard";
}
축약 애노테이션을 확인해보면
결국 @RequestMapping을 사용하는걸 확인할 수 있습니다.
PathVariable(경로 변수) 사용
최근 HTTP API는 리소스 경로에 식별자를 넣는 스타일을 선호합니다. ex) /mapping/users/1
URL에 있는 식별자를 경로변수라고 합니다.
// 변수명이 같으면 생략 가능하다.
// @PathVariable("gameCode") Long gameCode -> @PathVariable Long gameCode
@GetMapping("/game/{gameCode}")
public String gameBorder(@PathVariable("gameCode") Long gameCode) {
log.debug("board selected gameCode ={}", gameCode);
return "board/gameBoard";
}
PathVariable 애노테이션을 사용하면 매칭 되는 부분을 편리하게 조회할 수 있습니다.
PathVariable 애노테이션의 value 속성을
@GetMapping(value = {"/game/{gameCode}", "/game"})
위 처럼 배열로 주입할 경우
- /game/{gameCode}
- /game
- /game/
3개의 경로로 매핑이 실행됩니다.
@PathVariable 다중 식별자
@GetMapping(value = {"/game/{gameCode}/board/{boardId}")
public String gameBorderList(@PathVariable Long gameCode, @PathVariable String boardId) {
return "board/gameBoard";
}
한개 이상의 식별자를 입력받을경우 식별자 개수에 맞춰서 URL변경, PathVariable 애노테이션 추가를 실행합니다.
특정 헤더 조건 매핑
HTTP 요청 헤더의 속성을 사용한 매핑입니다.
/**
* 특정 헤더로 추가 매핑
* headers="gameCode",
* headers="!gameCode"
* headers="gameCode=debug"
* headers="gameCode!=debug" (! = )
*/
@GetMapping(value = "/game-mapping", headers = "gameCode=check")
public String gameMapping() {
return "board/gameBoard";
}
HTTP 요청헤더에 특정 속성의 존재 여부를 판단하여 매핑여부를 결정합니다.
위에 설정한 대로 HTTP 요청 헤더에 gameCode = check 데이터가 없다면 404 에러코드가 리턴됩니다.
미디어타입 조건 매핑 - Content-Type
HTTP 요청 메시지 바디데이터의 Content-Type에 따른 매핑방식입니다.
/**
* Content-Type 헤더 기반 추가 매핑 Media Type
* consumes="application/json"
* consumes="!application/json"
* consumes="application/*"
* consumes="*\/*"
* MediaType.APPLICATION_JSON_VALUE
*/
@PostMapping(value = "/game-mapping", consumes = "application/json")
public String mappingConsumes() {
return "ok";
}
consumes 속성에 원하는 Content-Type을 할당합니다.
Content-Type이 consumes 속성에 주입한 값과 다를시 ex)application/json
미디어타입 조건 매핑 - Accept
HTTP 요청메시지의 Accept속성을 활용한 매핑입니다.
Accept속성이란 클라이언트의 요청에 대한 서버의 응답데이터의 Content-Type 지정하는 속성으로
특정 Content-Type의 리턴을 원할때 사용합니다.
/**
* Accept 헤더 기반 Media Type
* produces = "text/html"
* produces = "!text/html"
* produces = "text/*"
* produces = "*\/*"
*/
@PostMapping(value = "/mapping-game", produces = "text/html")
public String mappingProduces() {
return "ok";
}
produces속성에 리턴값의 Content-Type을 주입한다.
Accept 속성과 produces속성의 Content-Type이 맞지 않을 경우 406 에러코드 리턴합니다.