Spring MVC - 요청매핑

timothy jeong·2021년 7월 14일
0

Spring-mvc

목록 보기
2/2

이번 포스팅에서는 요청(url)을 매핑하는 다양한 방법을 다루겠습니다.

@Controller 는 매핑 결과가 String으로 반환되면 view를 반환하지만
@RestController 는 String으로 반환되면 Http Body에 내용을 담아서 반환합니다.

@Controller 로 여러 요청 매핑을 테스트하려면 view Page까지 만들어야하는 번거로움이 있기 때문에 이번 예제 코드는 모두 @RestController로 진행하고 Postman을 이용해서 request를 전송하는 방식으로 하겠습니다.

RequestMapping 기본

@RestController
public class BasicController {

    @RequestMapping("/basic/req")
    public String justUrlMatch(Model model) {
        return "RequestMapping(\"/req\")";
    }
 }

이렇게 코드를 작성하고 SpringBoot Application을 실행합니다.
그리고 아래와 같이 postman에 url을 작성한 뒤, send를 누르면 작성한 결과값이 넘어오는것을 확인할 수 있습니다.

전송 url : http://localhost:8080/basic/req
반환값 : RequestMapping("/req")

RequestMapping 조건 매핑

(1) Http 메서드 조건 매핑

이번에는 Http 메서드를 매칭 조건으로 추가하는 방법을 알아보겠습니다.
활용할 수 있는 Http 메서드는 put, delete, head 등 다양하겠지만 많이 사용하는 Get 메서드와 Post 메서드 옵션을 추가해 보겠습니다.

 @RequestMapping(value = "/basic/req", method = RequestMethod.GET)
 //@GetMapping("/req") 로 축약가능
    public String urlWithGet() {
        return "RequestMapping(value = \"/req\", method = RequestMethod.GET)";
    }

    @RequestMapping(value = "/basic/req", method = RequestMethod.POST)
     //@PostMapping("/req") 로 축약가능
    public String urlWithPost() {
        return "@RequestMapping(value = \"/req\", method = RequestMethod.POST)";
    }

전송 url : http://localhost:8080/basic/req
반환값 : @RequestMapping(value = "/req", method = RequestMethod.GET)

똑같은 request이지만, @RequestMapping("/req")에 비해 구체적으로 요청 매핑을한 @RequestMapping(value = "/req", method = RequestMethod.GET) 이 우선순위를 갖는것을 알 수 있습니다.

PostMan에서 요청 메서드를 Get에서 Post로 바꾸면 @RequestMapping(value = "/req", method = RequestMethod.POST) 이 정상적으로 반환됩니다.

(2) PathVariable

PathVariable은 매핑되는 url 경로에 임의의 값이 들어올 수 있음을 명시하는 것입니다.
Http API 가 주로 이런 매핑방식을 사용합니다.

    @GetMapping("/basic/{PathVariable}")
    public String mappingPath(@PathVariable("PathVariable") String data) {
    // (@PathVariable String PathVariable) 변수명을 일치시키면 축약가능
        return "PathVariable = " + data;
    }
    

PostMan을 통해서 요청을 보내면 역시 출력되는 값을 확인할 수 있습니다.

전송 url : http://localhost:8080/basic/varA
반환값 : PathVariable = varA

{PathVariable}에 "req" 값을 주고 요청을 보내면 @RequestMapping(value = "/req", method = RequestMethod.GET) 이 반환됩니다. PathVariable 매핑보다 Http 메서드 매핑의 우선순위가 높은것을 알 수 있습니다.

Http API에서 주로 활용되는 방법인만큼 PathVariable은 다중 변수도 매칭할 수 있습니다.

@GetMapping("/basic/var1/{PathVariable1}/var2/{PathVariable2}")
    public String mappingPaths(@PathVariable("PathVariable1") String var1,
                               @PathVariable("PathVariable2") String var2) {
        return "var1 = " + var1 + " var2 = " + var2;
    }

전송 url : http://localhost:8080/basic/var1/thisVar1/var2/thisVar2
반환값 : var1 = thisVar1var2 = thisVar2

(3) 쿼리 파라미터 조건 매핑

파라미터 매핑이란, GetMethod에서 쿼리 파라미터 매핑을 의미합니다. 4개의 방식으로 매핑이 가능하며, 여러 파라미터를 배열형태로 매핑하는것도 가능합니다.

파라미터 매핑의 기본 형은 아래와 같습니다.
쿼리 파라미터 키값에 hello가 있으면 매핑이 되는 원리입니다.

@GetMapping(value = "/basic/param", params="hello")
    public String mappingParam(HttpServletRequest req) {
        return "param.value = " + req.getParameter("hello");
    }

전송 url : http://localhost:8080/basic/param?hello=bye
반환값 : param.value = bye

4가지 매핑 방식을 모두 살펴보면 다음과 같습니다.
1 @GetMapping(value = "/basic/param", params="hello")
쿼리 파라미터에 hello 키가 있으면 매핑됩니다.

2 @GetMapping(value = "/basic/param", params="!hello")
쿼리 파라미터에 hello 키가 없으면 매핑됩니다.

3 @GetMapping(value = "/basic/param", params="hello=bye")
쿼리 파라미터에 hello키와 그 밸류값이 bye일때 매핑됩니다.

4 @GetMapping(value = "/basic/param", params="hello!=bye")
쿼리 파라미터에 hello키와 밸류가 bye가 아닐때, 그리고 hello 키값이 없을때 매핑됩니다.

다중 파라미터를 매핑하기 위해서는 @GetMapping에 params ={"조건", "조건" ,....} 를 추가하면 됩니다. 아래와 같이 코드를 수정하면,

 @GetMapping(value = "/basic/param", params={"hello=안녕","bye=잘가"})
    public String mappingParam(HttpServletRequest req) {
        return "param.value = " + req.getParameter("hello") + "&" + req.getParameter("bye");
    }

전송 url : http://localhost:8080/basic/param?hello=안녕&bye=잘가
반환값 : param.value = 안녕&잘가

(4) 헤더 조건 매핑

헤더는 쿼리파라미터처럼 key=value 매핑이 되어있기 때문에 똑같은 매커니즘으로 매핑을 합니다.

위에서 소개된 4가지 매핑방법과, 다중 매핑 방법이 모두 그래도 적용됩니다.

 @GetMapping(value = "/basic/header", headers = "hello")
    public String mappingHeader(HttpServletRequest req) {
        return "headers {hello = " + req.getHeader("hello") + "}";
    }

전송 url : http://localhost:8080/basic/header
반환값 : headers {hello = you}

Postman 에서 header에 값을 직접 추가해줘야합니다.

요청 매핑을 하는 다양한 방식을 정리해보았습니다. 다음 포스팅은 요청 파라미터를 활용하는 방법을 다루겠습니다.

profile
개발자

0개의 댓글