Programming-[Backend]/Spring

[스프링 웹MVC] 10. 스프링 MVC - 요청 매핑

컴퓨터 탐험가 찰리 2021. 8. 8. 18:03
728x90
반응형

스프링MVC의 구조

 

1. @RequestMapping의 개념과 여러가지 속성

 

@RequestMapping은 controller에서 라우팅을 해준다. 클라이언트의 요청 정보를 쉽게 처리할 수 있도록 다양한 속성들을 제공한다. 속성들을 하나씩 공부해보자.

 

 

URL 배열, 슬래시 처리

요청 주소를 중괄호 {} 안에 넣어서 여러 URL 요청을 받을 수도 있다. 그리고 "/hello-basic"의 URL로 요청하도록 지정했는데, URL 상으로는 완전히 다른, "/hello-basic/" 으로 슬래시를 하나 더 붙여서 요청을 보내더라도 해당 요청을 처리해주는 특징이 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
@RestController
public class MappingController {
 
    private Logger log = LoggerFactory.getLogger(getClass());
 
    @RequestMapping(value = {"/hello-basic""/hello-go"})
    public String helloBasic() {
        log.info("helloBasic");
        return "ok";
    }
 
...계속
cs

 

 

method 지정

method 속성을 지정할 수 있는데, 만약 지정하지 않으면 GET, POST, PUT 등 모든 메서드의 요청에 대해 응답하게 된다. method를 지정했는데, 다른 method로 요청을 보낸다면, 허용되지 않는 method라는 405 응답을 보내게 된다.

@GetMapping, @PostMapping 등으로 method 속성을 생략하고 직관적인 요청 매핑도 가능하다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
@RequestMapping(value = "/mapping-get-v1", method = RequestMethod.GET)
    public String mappingGetV1() {
        log.info("mappingGetV1");
        return "ok";
    }
 
    /**
     * 편리한 축약 애노테이션 (코드보기)
     * @GetMapping
     * @PostMapping
     * @PutMapping
     * @DeleteMapping
     * @PatchMapping
     */
    @GetMapping(value = "/mapping-get-v2")
    public String mappingGetV2() {
        log.info("mapping-get-v2");
        return "ok";
    }
cs

 

 

PathVariable 사용

 

최근에 많이 사용하는 방법이라고 한다. URL 상에 변수가 있는 경우 중괄호 {}로 정의하여 요청 URL 상의 변수값을 얻어올수 있다. "@PathVariable("URL상 이름") 타입 변수 이름" 의 형태로 작성하는데, 만약 "URL상 이름"과 "변수 이름"이 같다면 "URL상 이름" 부분을 생략할 수 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
     * PathVariable 사용
     * 변수명이 같으면 생략 가능
     *
     * @PathVariable("userId") String userId -> @PathVariable userId
     * /mapping/userA
     */
    @GetMapping("/mapping/{userId}")
    public String mappingPath(@PathVariable("userId"String data) {
        log.info("mappingPath userId={}", data);
        return "ok";
    }
 
    /**
     * PathVariable 사용 다중
     */
    @GetMapping("/mapping/users/{userId}/orders/{orderId}")
    public String mappingPath(@PathVariable String userId, @PathVariable Long orderId) {
        log.info("mappingPath userId={}, orderId={}", userId, orderId);
        return "ok";
    }
cs

 

 

파라미터로 추가 매핑

요청 URL 상에 쿼리 파라미터가 있다면, 이 쿼리파라미터의 조건에 따라 매핑을 해줄 수 있다. URL이 "/mapping-param?mode=debug" 라고 온다면 요청이 매핑되지만, mode=debug라는 정보가 없다면 매핑이 되지 않는다. 주석문에 있는 것처럼 여러가지 조건을 지정해줄 수 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
/**
     * 파라미터로 추가 매핑
     * 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";
    }
cs

 

헤더로 추가 매핑

위에서 URL 상에 쿼리 파라미터 조건을 넣은 것처럼, 요청 헤더의 정보에 특정 조건을 추가할 수 있다. 테스트를 위해서는 요청 헤더에 정보를 넣어야 하므로, postman을 이용해서 header 정보를 추가해보면 된다.

 

1
2
3
4
5
6
7
8
9
10
11
12
/**
     * 특정 헤더로 추가 매핑
     * 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";
    }
cs

 

헤더 매핑 : MediaType과 Accept

요청 헤더에 담기는 MediaType과 Accept 헤더 정보의 조건을 지정할 수도 있다. 각각 consumes와 produces 속성을 사용하는데, 이것은 MediaType과 Accept 헤더의 특성을 설명하는 단어라고 할 수 있다. 다시 말해, MediaType 헤더 속성은 요청의 body 타입이 text/html인지, application/json 타입인지 등을 설정해주는 것이므로 이를 받아들이는 컨트롤러에서는 요청을 소모하는 입장이므로 consumes 속성으로 표현하는 것이다. 반대로 Accept 속성은 클라이언트가 요청을 보내면서 응답값으로 어떤 타입을 받을지를 설정하는 헤더 정보이므로, 컨트롤러 입장에서는 응답값으로 제공하는 타입을 produces 속성으로 지정하게 된다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/**
     * Content-Type 헤더 기반 추가 매핑 Media Type
     * consumes="application/json"
     * consumes="!application/json"
     * consumes="application/*"
     * consumes="*\/*"
     * MediaType.APPLICATION_JSON_VALUE
     */
    @PostMapping(value = "/mapping-consume"consumes = MediaType.APPLICATION_JSON_VALUE)
    public String mappingConsumes() {
        log.info("mappingConsumes");
        return "ok";
    }
 
    /**
     * Accept 헤더 기반 Media Type
     * produces = "text/html"
     * produces = "!text/html"
     * produces = "text/*"
     * produces = "*\/*"
     */
    @PostMapping(value = "/mapping-produce"produces = MediaType.TEXT_HTML_VALUE)
    public String mappingProduces() {
        log.info("mappingProduces");
        return "ok";
    }
cs

 

 

 


 

2. RestController 예시

 

아래 코드는 강의에서 나온 예시 코드이다. URL은 공통화하고, @GetMapping, @PostMapping등 어노테이션을 통해서 요청을 분기처리하는 것을 확인할 수 있다. 그리고 공통화된 URL은 최상단 @RestController에서 정의하는 것을 볼 수 있다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
@RestController
@RequestMapping("/mapping/users")
public class MappingClassController {
 
    @GetMapping
    public String user() {
        return "get users";
    }
 
    @PostMapping
    public String addUser() {
        return "post user";
    }
 
    @GetMapping("/{userId}")
    public String findUser(@PathVariable String userId) {
        return "get userId=" + userId;
    }
 
    @PatchMapping("/{userId}")
    public String updateUser(@PathVariable String userId) {
        return "update userId=" + userId;
    }
 
    @DeleteMapping("/{userId}")
    public String deleteUser(@PathVariable String userId) {
        return "delete userId=" + userId;
    }
 
}
cs

 

 


참조

1. 인프런_스프링 MVC 1편 - 백엔드 웹개발 핵심 기술_김영한 님 강의

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1

728x90
반응형