SPRING

[SPRING] 애노테이션 기반의 요청 매핑

steadyMan 2022. 2. 16. 02:04

서버에 요청이 오면 호출될 컨트롤러 매핑의 다양한 방식에 대한 개인적인 학습의 정리글입니다. 

 

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 405 상태코드(Method Not Allowed) 리턴

 

 

HTTP 메서드 매핑 축약

HTTP 메서드를 축약한 애노테이션을 사용하면 더 직관적으로 사용이 가능합니다. 축약 애노테이션은 아래와 같습니다.

  • @GetMapping
  • @PostMapping
  • @PutMapping
  • @DeleteMapping
  • @PatchMapping

RequestMapping 애노테이션과 동일하게 사용합니다.

//@RequestMapping
@PostMapping("/border/game")
public String gameBorder() {
	return "board/gameBoard";
}

 

 

 

축약 애노테이션을 확인해보면 

결국 @RequestMapping을 사용하는걸 확인할 수 있습니다.

결국 @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 에러코드가 리턴됩니다.

404 Not Found 리턴

 

미디어타입 조건 매핑 - 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

415 Unsupported Media Type 발생

 

미디어타입 조건 매핑 - 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 에러코드 리턴합니다.

406 Not Acceptable 에러코드 발생