티스토리 뷰
스프링 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 이다.
클라이언트에서 비동기 요청을 할 때 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
https://stackoverflow.com/questions/5661596/do-i-need-a-content-type-header-for-http-get-requests
https://gist.github.com/jays1204/703297eb0da1facdc454
- Total
- Today
- Yesterday
- rocky
- 베리 심플
- input
- Linux
- springboot
- intellij
- 오라클
- jQuery
- svn
- LocalDateTime
- Github Status
- Kotlin
- window
- 북리뷰
- Spring
- mybatis config
- Mac
- JavaScript
- maven
- docker
- LocalDate
- Spring Security
- Bash tab
- mybatis
- Java
- localtime
- oracle
- elasticsearch
- k8s
- config-location
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |