Updated:

1. 개요

스프링 MVC는 다양한 요청 매핑을 지원한다. 이번에는 스프링 MVC 요청 매핑에 대해 알아보도록 하자.

2. RequestMapping

@RequestMapping을 사용하면 지정된 URL과 일치하는 요청 발생 시, 해당 메서드가 실행된다.

1
2
3
4
5
@RequestMapping(value = "/hello-basic")
public String helloBasic() {
    log.info("helloBasic");
    return "ok";
}

2-1. HTTP Method 지정

@RequestMapping을 사용하면 GET, HEAD, POST, PUT, PATCH, DELETE 요청 시 호출이 되는데, method 속성을 이용하면 원하는 HTTP Method만 지정 가능하다.

1
2
3
4
5
@RequestMapping(value = "/hello-basic", method = RequestMethod.GET)
public String helloBasic() {
    log.info("helloBasic");
    return "ok";
}

2-2. HTTP Method 매핑 축약

@GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping을 사용하면 @RequestMapping에 method 속성을 적용한 것과 동일하게 사용할 수 있다.

1
2
3
4
5
@GetMapping("/hello-basic")
public String helloBasic() {
    log.info(helloBasic);
    return ok;
}

3. HTTP 요청 파라미터

스프링 MVC는 @PathVariable, @RequestParam, @ModelAttribute를 통해 다양한 요청 파라미터를 처리할 수 있다.

3-1. @PathVariable

@PathVariable을 사용하여 리소스 경로의 식별자와 매칭되는 파라미터를 조회할 수 있다. 변수 이름과 파라미터 이름이 같은 경우 @PathVariable의 속성은 생략 가능하다.

1
2
3
4
5
@GetMapping(/mapping/{userId})
public String mappingPath(@PathVariable(userId) String userId) {
    log.info(mappingPath userId={}, userId);
    return ok;
}

3-2. @RequestParam

URL의 쿼리 파라미터에 요청 데이터를 포함해서 전달하거나, HTML Form을 통해 데이터를 전달할 때 @RequestParam을 사용한다. 변수 이름과 파라미터 이름이 같은 경우 @RequestParam의 속성은 생략 가능하다.

1
2
3
4
5
6
@ResponseBody
@RequestMapping("/request-param")
public String requestParam(@RequestParam("username") String username, @RequestParam("age") int age) {
    log.info("username={}, age={}", username, age);
    return "ok";
}

3-3. @ModelAttribute

URL의 쿼리 파라미터에 요청 데이터를 포함해서 전달하거나, HTML Form을 통해 데이터를 전달할 때 @ModelAttribute을 사용한다. 전달받은 데이터를 자동으로 객체에 매핑시켜 준다는 점이 @RequestParam과 다르다.

1
2
3
4
5
6
7
8
9
10
11
12
13
@ResponseBody
@RequestMapping("/model-attribute")
public String modelAttribute(@ModelAttribute HelloData helloData) {
    log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
    return "ok";
}

@Data
public static class HelloData {

    private String username;
    private int age;
}

4. HTTP 요청 메시지 - 텍스트

스프링 MVC는 HttpEntity, RequestEntity, @RequestBody를 통해 텍스트로 들어오는 요청 메시지를 처리할 수 있다.

4-1. HttpEntity

HttpEntity는 메시지 바디 정보를 직접 조회할 수 있고, 응답에도 사용할 수 있다. 응답 시, 헤더 정보를 포함할 수 있다.

1
2
3
4
5
6
7
@PostMapping("/request-body")
public HttpEntity<String> requestBody
(HttpEntity<String> httpEntity) {
    String messageBody = httpEntity.getBody();
    log.info("messageBody={}", messageBody);
    return new HttpEntity<>("ok");
}

4-2. RequestEntity, ResponseEntity

RequestEntity와 ResponseEntity는 HttpEntity를 상속받았다. ResponseEntity는 HTTP 상태코드를 설정할 수 있다.

1
2
3
4
5
6
@PostMapping("/request-body")
public ResponseEntity<String> requestBody(RequestEntity<String> responseEntity) {
    String messageBody = responseEntity.getBody();
    log.info("messageBody={}", messageBody);
    return new ResponseEntity<>("ok", HttpStatus.OK);
}

4-3. @RequestBody, @ResponseBody

@RequestBody, @ResponseBody를 통해 HTTP 메시지 바디 정보를 편리하게 조회하고 응답할 수 있다. 헤더 정보가 필요한 경우 HttpEntity 또는 @RequestHeader를 사용하면 된다.

1
2
3
4
5
6
@ResponseBody
@PostMapping("/request-body")
public String requestBody(@RequestBody String messageBody) {
    log.info("messageBody={}", messageBody);
    return "ok";
}

5. HTTP 요청 메시지 - JSON

스프링 MVC는 @RequestBody를 통해 JSON으로 들어오는 요청 메시지를 처리할 수 있다.

5-1. @RequestBody, @ResponseBody

객체에 @RequesetBody를 사용하면, HTTP 메시지 바디의 JSON을 객체로 변환해준다. @ResponseBody도 마찬가지로 응답 시 반환 한 객체를 JSON으로 변환해준다.

1
2
3
4
5
6
7
8
9
10
11
12
13
@ResponseBody
@PostMapping("/request-body-json")
public HelloData requestBodyJson(@RequestBody HelloData data) {
    log.info("username={}, age={}", data.getUsername(), data.getAge());
    return data;
}

@Data
static class HelloData {

    private String username;
    private int age;
}

Updated:

Leave a comment