Spring

[Spring] Spring MVC 요청 매핑 (RequestMapping 옵션)

동그리담 2024. 5. 7. 14:33

매핑 정보

@Controller의 반환값이 String일때 = 뷰이름으로 인식해서 뷰를 찾고 뷰가 렌더링 된다.
@RestController의 반환 값은 뷰를 찾는 것이 아닌 HTTP 메시지 바디에 입력

@RequestMapping을 url지정할 때 배열로 제공해주기 때문에 여러가지 url을 사용 가능하다.
ex) @RequestMapping({"/hello","/hi","/bonjour"})

스프링 부트 3.0 이전에는 localhost:8080/hello와 localhost:8080/hello/를 같은 매핑 정보로 인식했지만
스프링 부트 3.0 이후에는 localhost:8080/hello와 localhost:8080/hello/를 다른 매핑 정보로 인식한다.

@RequestMapping의 Method를 지정하지 않으면 무슨 방식으로 요청을 하든 반응한다.

@GetMapping
@PostMapping
@PutMapping
@DeleteMapping
@PatchMapping

경로 변수

@GetMapping("/mapping/{userId}")

// @PathVariable("userId") String userId -> @PathVariable String userId
public String mappingPath(@PathVariable("userId") String data) {

URL 경로를 템플릿화
ex) 마이페이지 -> 로그인한 아이디마다 다른 정보

쿼리 파라미터 방식 url?userId=data 
경로 변수 방식        url/data

경로변수 다중 사용

@GetMapping("/mapping/users/{userId}/orders/{orderId}")
public String mappingPath(@PathVariable String userId, @PathVariable LongorderId) {

쿼리 파라미터 조건 매핑

/**
 * 파라미터로 추가 매핑
 * 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";
}

특정 파라미터가 있어야 해당url 호출가능 (잘 사용하지 않음)

특정 헤더 조건 매핑

/**
 * 특정 헤더로 추가 매핑
 * 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";
}

특정 헤더가 있어야 해당url 호출가능 (잘 사용하지 않음)

특정 미디어 타입 조건 매핑

/**
 * Content-Type 헤더 기반 추가 매핑 Media Type
 * consumes="application/json"
 * consumes="!application/json"
 * consumes="application/*"
 * consumes="*\/*"
 * MediaType.APPLICATION_JSON_VALUE
 * ↓ 예시)
 * consumes = "text/plain"
 * consumes = {"text/plain", "application/*"}
 * consumes = MediaType.TEXT_PLAIN_VALUE 
 */							//주의!!! content-type이 아닌 consumes
@PostMapping(value = "/mapping-consume", consumes = "application/json")
public String mappingConsumes() {            //MediaType.APPLICATION_JSON_VALUE로 사용하면 좋음
    log.info("mappingConsumes");
    return "ok";
}

HTTP 요청의 Content-Type 헤더를 기반으로 미디어 타입으로 매핑한다. 만약 맞지 않으면 HTTP 415 상태코드(Unsupported Media Type)을 반환한다.

consumes 이란?

produce에 consumes가 존재한다. 서버(컨트롤러) 입장에서보면 content-type을 소비해서 사용하는 입장이기 때문에 comsumes이라 한다.

특정 미디어 타입 조건 매핑

/**
 * Accept 헤더 기반 Media Type
 * produces = "text/html"
 * produces = "!text/html"
 * produces = "text/*"
 * produces = "*\/*"
 * ↓ 예시)
 * produces = "text/plain"
 * produces = {"text/plain", "application/*"}
 * produces = MediaType.TEXT_PLAIN_VALUE
 * produces = "text/plain;charset=UTF-8"
 */
 @PostMapping(value = "/mapping-produce", produces = "text/html")
    public String mappingProduces() { 			//MediaType.TEXT_HTML_VALUE
        log.info("mappingProduces");
        return "ok";
    }

HTTP 요청의 Accept 헤더를 기반으로 미디어 타입으로 매핑한다. 만약 맞지 않으면 HTTP 406 상태코드(Not Acceptable)을 반환한다.

API 예시

  • 회원 목록 조회: GET /users
  • 회원 등록: POST /users
  • 회원 조회: GET /users/{userId}
  • 회원 수정: PATCH /users/{userId}
  • 회원 삭제: DELETE /users/{userId}

출처: https://tan-sog.tistory.com/90