Altiora Petamus

다양한 HTTP Mapping 1 본문

Java/Spring Framework

다양한 HTTP Mapping 1

Haril Song 2021. 7. 28. 14:55

Intro

REST API 에 대해 학습하면서 정리하는 글입니다.

 

HTTP Request mapping

이하 모든 API 는 "ok" 라는 텍스트를 반환합니다.

Postman 을 활용한 테스트

기본 요청

@RestController
public class MappingController {

    private Logger log = LoggerFactory.getLogger(getClass());

    @RequestMapping("/hello-basic")
    public String helloBasic() {
        log.info("helloBasic");
        return "ok";
    }
}
  • "/hello-basic" or "/hello-basic/" 모두 허용
  • HTTP method 모두 허용 : GET, POST, PUT, PATCH, DELETE, HEAD
💡 log 는 @Slf4j 를 활용해도 가능합니다.

 

특정 메소드 요청만 허용 - V1

@RequestMapping(value = "/mapping-get-v1", method = RequestMethod.GET)
public String mappingGetV1() {
    log.info("mappingGetV1");
    return "ok";
}

여기에 POST 요청을 하면 405 Method Not Allowed 를 반환해줍니다.

 

HTTP method 축약 - V2

@GetMapping("/mapping-get-v2")
public String mappingGetV2() {
    log.info("mappingGetV2");
    return "ok";
}

더 직관적으로 사용할 수 있습니다. GET 뿐만 아니라 다른 HTTP method 에 대해서도 지원하고 있으니 자유롭게 사용하면 됩니다.

내부적으로 확인해보면 @GetMapping 또한 V1의 @RequestMapping 을 그대로 사용하고 있음을 알 수 있습니다.

 

 

PathVariable - V3

@GetMapping("/mapping/{userId}")
public String mappingPath(@PathVariable("userId") String data) {
    log.info("mappingPath userId={}", data);
    return "ok";
}

경로 변수의 사용입니다. 특정 url 뒤로 변하는 값이 올 때, 그 값을 받아서 사용해야한다면 @PathVariable 을 사용할 수 있습니다.

만약 @PathVariable의 이름과 파라미터명이 같다면 이름을 생략 가능합니다.

  • @PathVariable("userId") String userId ⇒ @PathVariable String user Id

 

PathVariable 다중 사용 - V4

@GetMapping("/mapping/users/{userId}/orders/{orderId}")
public String mappingPath(@PathVariable String userId, @PathVariable Long orderId) {
    log.info("mappingPath userId={}, orderId={}", userId, orderId);
    return "ok";
}

 

특정 파라미터 조건 매핑 - V5

@GetMapping(value = "/mapping-param", params = "mode=debug")
public String mappingParam() {
    log.info("mappingParam");
    return "ok";
}

정해진 파라미터가 들어왔을 때 매핑하는 방법입니다. 자주 사용되진 않지만 특수하게 필요한 경우 사용할 수 있을 것 같네요.

다양한 연산자를 함께 사용할 수 있습니다.

💡파라미터로 추가 매핑
params="mode"
params="!mode"
params="mode=debug"
params="mode!=debug"
params = {"mode=debug","data=good"}
이 방법은 이하 매핑 방법에 모두 적용 가능합니다.

 

특정 헤더로 매핑 - V6

@GetMapping(value = "/mapping-header", headers = "mode=debug")
public String mappingHeader() {
    log.info("mappingHeader");
    return "ok";
}

이번엔 쿼리 파라미터가 아니라 특정 헤더 값에 매핑하는 방법입니다. 사용법은 V5 와 유사합니다.

 

미디어 타입 조건 매핑 - HTTP Content-Type, V7

@PostMapping(value = "/mapping-consume", consumes = MediaType.APPLICATION_JSON_VALUE)
public String mappingConsumes() {
    log.info("mappingConsume");
    return "ok";
}

HTTP header 중 Content-Type header 는 이 방법을 사용해야 합니다.

만약 맞지 않는다면 HTTP 415 Unsupported Media Type 를 반환합니다.

 

미디어 타입 조건 매핑 - HTTP Accept, V8

@PostMapping(value = "/mapping-produce", produces = MediaType.TEXT_HTML_VALUE)
public String mappingProduces() {
    log.info("mappingProduces");
    return "ok";
}

HTTP 요청의 Accept header 를 기반으로 매핑합니다.

만약 produces 로 작성한 헤더값과 맞지 않는다면 HTTP 406 Not Acceptable 을 반환합니다.

 

Reference

 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 강의

웹 애플리케이션을 개발할 때 필요한 모든 웹 기술을 기초부터 이해하고, 완성할 수 있습니다. 스프링 MVC의 핵심 원리와 구조를 이해하고, 더 깊이있는 백엔드 개발자로 성장할 수 있습니다., 원

www.inflearn.com

 

'Java > Spring Framework' 카테고리의 다른 글

@JsonNaming 사용 (springboot 2.5.3 ~)  (0) 2021.08.04
다양한 HTTP Mapping 2  (0) 2021.07.31
in-memory DB 구현  (0) 2021.06.30
Spring Security 사용하기 1  (0) 2021.06.26
Spring Security란?  (0) 2021.06.19