FreeHand

스프링 요청 매핑 본문

Web/Spring

스프링 요청 매핑

Jinn 2023. 10. 29. 01:29

@RequestMapping

@Slf4j
@RestController
public class MappingController {
    
    @RequestMapping("/hello-basic")
    public String helloBasic() {
        log.info("helloBasic");
        return "ok";
    }
}

@RequestMapping 애노테이션은 URL과 메서드를 매핑한다.

스프링 부트 3.0 이전에서는 /hello-basic과 /hello-basic/을 같은 요청으로 매핑했다.

스프링 부트 3.0 부터는 서로 다르게 매핑한다.

따라서 필요시 배열로 다중 설정을 해줘야 한다.

@RequestMapping({"/hello-basic", "/hello-basic/"})

 

@RequestMapping 애노테이션은 HTTP 메서드를 지정하지 않으면 모든 HTTP 메서드로 호출된다.

method 속성으로 HTTP 메서드를 지정할 수 있다.

@RequestMapping(value = "/mapping-get-v1", method = RequestMethod.GET)

이 코드를 더 간단하게 바꿀 수 있는 애노테이션이 있다.

 

@GetMapping("/mapping-get-v2")

@GetMapping 애노테이션을 사용하면 매핑한 URL로 GET 요청이 들어왔을 때만 호출한다.

마찬가지로 POST, DELETE 등 다른 애노테이션도 존재한다.

 

 

@PathVariable

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

@PathVariable 애노테이션을 사용하면 URL 경로의 식별자를 간단하게 조회할 수 있다.

변수명이 같으면 다음과 같이 생략할 수 있다.

@GetMapping("/mapping/{userId}")
public String mappingPath(@PathVariable String userId) {
    ...
}

다음과 같이 여러 식별자를 조회할 수도 있다.

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

 

특정 파라미터에 조건을 추가할 수도 있다.

/**
 * 파라미터로 추가 매핑
 * 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() {
    ...
}

/mapping-param?mode=debug 처럼 조건이 일치하는 파라미터가 있으면 호출된다.

 

비슷하게 특정 헤더 조건 매핑도 가능하다.

/**
 * 특정 헤더로 추가 매핑
 * headers="mode",
 * headers="!mode"
 * headers="mode=debug"
 * headers="mode!=debug" (! = )
 */
@GetMapping(value = "/mapping-header", headers = "mode=debug")
public String mappingHeader() {
    ...
}

 

미디어 타입 조건 매핑도 가능하다.

/**
 * Content-Type 헤더 기반 추가 매핑 Media Type
 * consumes="application/json"
 * consumes="!application/json"
 * consumes="application/*"
 * consumes="*\/*"
 * MediaType.APPLICATION_JSON_VALUE
 */
@PostMapping(value = "/mapping-consume", consumes = "application/json")
public String mappingConsumes() {
    ...
}

HTTP 요청의 Content-Type 헤더를 기반으로 미디어 타입으로 매핑한다.

만약 맞지 않으면 HTTP 415 상태코드(Unsupported Media Type)을 반환한다.

 

/**
 * Accept 헤더 기반 Media Type
 * produces = "text/html"
 * produces = "!text/html"
 * produces = "text/*"
 * produces = "*\/*"
 */
@PostMapping(value = "/mapping-produce", produces = "text/html")
public String mappingProduces() {
    ...
}

HTTP 요청의 Accept 헤더를 기반으로 미디어 타입으로 매핑한다.

만약 맞지 않으면 HTTP 406 상태코드(Not Acceptable)을 반환한다.

 

 

클래스 레벨에서 매핑 정보를 설정하면 메서드 레벨에서 해당 정보를 조합해서 매핑한다.

@RestController
@RequestMapping("/users")
public class MappingClassController {

    @GetMapping // "/users"
    public String users() {
        return "get users";
    }
    
    @PostMapping // "/users"
    public String addUser() {
        return "post user";
    }
    
    @GetMapping("/{userId}") // "/users/{userId}"
    public String findUser(@PathVariable String userId) {
        return "get userId=" + userId;
    }
    
    @PatchMapping("/{userId}") // "/users/{userId}"
    public String updateUser(@PathVariable String userId) {
        return "update userId=" + userId;
    }
    
    @DeleteMapping("/{userId}") // "/users/{userId}"
    public String deleteUser(@PathVariable String userId) {
        return "delete userId=" + userId;
    }
}

 

 

 

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