본문 바로가기
SPRING

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

by steadyMan 2022. 2. 16.

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

 

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 에러코드 발생

 

 

 

 

댓글