티스토리 뷰

728x90

스프링 MVC의 @RequestParam 이 애노테이션이 나를 정말 궁금하게 했다.

내가 이해하기로는 클라이언트가 요청한 URL의 쿼리 파라미터에 대한 값을 받아온다고만 알고 있었다. 그리고 스프링 MVC에서 @RequestMapping의 GET 메서드 또는 @GetMapping에서만 사용할 수 있다고 생각하고 있었다.

즉 localhost:8080?username=myname&age=33 이런 식으로 URL이 있다고 하면

@Slf4j
@Controller
public class HelloController {

    @ResponseBody
    @GetMapping("/hello")
    public String hello(@RequestParam String username,
                        @RequestParam int age) {

        log.info("username = {}", username);
        log.info("age = {}", age);

        return "ok";
    }
}

이런 식으로 받아왔을 것이다. 그런데 간혹 가다가 소스에서 @PostMapping에서도 @RequestParam을 사용하는 것을 볼 수 있었다.

내가 알기로 HTTP 요청시 POST 요청은 HTTP body에만 내용이 들어가고 URL에서는 queryParam으로 넘어가지 않는데 어떻게 받을 수 있는 거지? 생각하고 한참 구글링 하면서 이전 강의 자료 같은 거를 다시 보기 하다가 알게 되었다.

 

@PostMapping에서 @RequestParam을 써서 받을 수 있는 것은 HTML Form 태그에서 method 가 POST 전송일 때는 @RequestParam으로 값을 받을 수 있다.

 

(그 이외의 값은 모두 Http body의 메시지로 받는다.)**!!

 

Form 태그의 submit을 전송했을 때 Http request의 content-type을 살펴보면 application/x-www-form-urlencoded 이다.

devtools

클라이언트에서 비동기 요청을 할 때 jQuery ajax 같은 경우는 content-type을 설정해주지 않으면 기본으로 application/x-www-form-urlencoded로 설정된다. 위의 스크린샷은 form 태그에서 submit을 했을 때이다. 추가로 아래 빨간 박스에서는 Form으로 데이터를 전송해서 Form Data에 전송한 값이 나오게 된다.

이게 파싱 된 형태로 보이게 해서 이렇게 보이지 사실상 POST도 key=value 형식으로 나간다.

즉 @RequestParam을 정리해보면

요청 매개변수에 들어있는 기본 타입 데이터를 메서드 인자로 받아올 수 있다.

여기서 요청 매개변수란 URL 요청의 localhost:8080?username=value&age=value 의 쿼리 매개변수와 HTML 태그의 Form 데이터가 해당한다.

 

아 그리고 찾아보면서 처음? 알았던 거는 HTTP Method GET일 때는 Content-Type이 필요가  없다는 것이다.  stackoverflow 답변을 보면 HTTP GET 요청에 대해서는 Content-Type이 필요하지는 않지만 HTTP 사양에서는 HTTP GET에 대한 Content-Type 헤더도 배제하지는 않는다고 한다.  HTTP GET으로 요청을 보내면 무조건 URL 끝에 쿼리스트링으로 key=value 형식으로 날아가기 때문에 굳이 Content-Type 헤더가 필요 없다.

 

 

참고

https://dololak.tistory.com/630

 

[HTTP] HTTP 헤더 중 Content-Type 헤더와 Accept 헤더의 용도와 차이점

Content-Type 헤더 Content-Type은 말그대로 HTTP 메시지(요청과 응답 모두)에 담겨 보내는 데이터의 형식을 알려주는 헤더입니다. 세상에 모든 브라우저와 모든 웹서버가 그렇다고는 말할 수 없겠지만

dololak.tistory.com

https://stackoverflow.com/questions/5661596/do-i-need-a-content-type-header-for-http-get-requests

 

Do I need a content-type header for HTTP GET requests?

As far as I understood there are two places where to set the content type: The client sets a content type for the body he is sending to the server (e.g. for post) The server sets a content type fo...

stackoverflow.com

https://gist.github.com/jays1204/703297eb0da1facdc454

 

Http Method는 POST, Content-Type이 application/x-www-form-urlencoded인 경우 body를 encoding하는게 맞을까?

Http Method는 POST, Content-Type이 application/x-www-form-urlencoded인 경우 body를 encoding하는게 맞을까? - postbodyEnc.md

gist.github.com

 

728x90
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
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 31
글 보관함