๐ง Http ์์ฒญ ํค๋ ์กฐํ
์์๋ฅผ ํตํด ์ดํด๋ณด๊ฒ ์ต๋๋ค.
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpMethod;
import org.springframework.util.MultiValueMap;
import org.springframework.web.bind.annotation.CookieValue;
import org.springframework.web.bind.annotation.RequestHeader;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Locale;
@Slf4j
@RestController
public class RequestHeaderController {
@RequestMapping("/headers")
public String headers(
HttpServletRequest request,
HttpServletResponse response,
HttpMethod httpMethod,
Locale locale,
@RequestHeader MultiValueMap<String, String> headerMap,
@RequestHeader("host") String host,
@CookieValue(value = "myCookie", required = false) String cookie
) {
log.info("request={}", request);
log.info("response={}", response);
log.info("httpMethod={}", httpMethod);
log.info("locale={}", locale);
log.info("headerMap={}", headerMap);
log.info("header host={}", host);
log.info("myCookie={}", cookie);
return "ok";
}
}
HttpMethod
HTTP ๋ฉ์๋๋ฅผ ์กฐํํฉ๋๋ค.
(org.springframework.http.HttpMethod)
Locale
Locale ์ ๋ณด๋ฅผ ์กฐํํฉ๋๋ค.
@RequestHeader MultiValueMap<string, string> headerMap
๋ชจ๋ HTTP ํค๋๋ฅผ MultiValueMap ํ์์ผ๋ก ์กฐํํฉ๋๋ค.
@RequestHeader("host") String host
ํน์ HTTP ํค๋๋ฅผ ์กฐํํฉ๋๋ค.
- ์์ฑ ํ์ ๊ฐ ์ฌ๋ถ: required
- ๊ธฐ๋ณธ ๊ฐ ์์ฑ: defaultValue
@CookieValue(value = "myCookie", required = false) String cookie
ํน์ ์ฟ ํค๋ฅผ ์กฐํํฉ๋๋ค.
- ์์ฑํ์ ๊ฐ ์ฌ๋ถ: required
- ๊ธฐ๋ณธ ๊ฐ: defaultValue
@Conroller ์ ์ฌ์ฉ ๊ฐ๋ฅํ ํ๋ผ๋ฏธํฐ ๋ชฉ๋ก์ ๋ค์ ๊ณต์ ๋ฉ๋ด์ผ์์ ํ์ธํ ์ ์์ต๋๋ค.
https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-ann-arguments
@Conroller ์ ์ฌ์ฉ ๊ฐ๋ฅํ ์๋ต ๊ฐ ๋ชฉ๋ก์ ๋ค์ ๊ณต์ ๋ฉ๋ด์ผ์์ ํ์ธํ ์ ์์ต๋๋ค.
https://docs.spring.io/spring-framework/docs/current/reference/html/web.html#mvc-ann-return-types
๐ง Http ์์ฒญ ๋ฐ์ดํฐ
์์ฒญ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ๋ฒ์ ์ฃผ๋ก ๋ค์๊ณผ ๊ฐ์ 3๊ฐ์ง ๋ฐฉ๋ฒ์ ์ฌ์ฉํ์ฌ ์ ๋ฌํฉ๋๋ค.
๐ GET - ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ๋ฐฉ์
/url?username=hello&age=20
์์ ๊ฐ์ด ๋ฉ์์ง ๋ฐ๋ ์์ด URL์ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํ ๋ฐ์ดํฐ๋ฅผ ํฌํจํ์ฌ ์ ๋ฌํ๋ ๋ฐฉ์์ผ๋ก, ์ฃผ๋ก ๊ฒ์ ์ ํํฐ๋ง, ํ์ด์ง์ ํ๊ธฐ ์ํด ๋ง์ด ์ฌ์ฉํฉ๋๋ค.
๐ POST - HTML Form
content-type : application/x-www-form-urlencoded
์ ๋ฐฉ์์ ๋ฉ์์ง ๋ฐ๋์ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ํ์์ผ๋ก ์ ๋ฌํฉ๋๋ค. (์: username=hello&age=20)
์ด ๋ฐฉ์์ ์ฃผ๋ก ํ์ ๊ฐ์ ๋ฑ์ ์ฌ์ฉํฉ๋๋ค.
GET์ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ์ ์ก ๋ฐฉ์์ด๋ , POST์ HTML Form ์ ์ก ๋ฐฉ์์ด๋ ๋ ๋ค ํ์์ด ๋๊ฐ๊ธฐ ๋๋ฌธ์ ์ด ๋์ ๊ตฌ๋ถ์์ด ์กฐํํ ์ ์์ต๋๋ค.
์ด๊ฒ์ ๊ฐ๋จํ ์์ฒญ ํ๋ผ๋ฏธํฐ(Request Parameter)์กฐํ๋ผ ๋ถ๋ฆ ๋๋ค.
๐ HTTP message body์ ์ง์ ๋ฐ์ดํฐ๋ฅผ ๋ด์์ ์์ฒญ
JSON์ด ๋ํ์ ์ธ ์์๋ก, HTTP API์์ ์ฃผ๋ก ์ฌ์ฉํฉ๋๋ค.
๐ง ์์ฒญ ํ๋ผ๋ฏธํฐ๋ฅผ ์กฐํํ๋ ๋ฐฉ๋ฒ
์ฐ์ GET์ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ, ํน์ POST์ HTML Form ๋ฑ์์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ ๋ฐฉ์์ธ ์์ฒญ ํ๋ผ๋ฏธํฐ๋ฅผ ์กฐํํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ์์ฒญ์ ๋ณด๋ ๋๋ค.
~~/path?username=shin&age=20
๐ HttpServeltRequest ์ฌ์ฉ
๋ค์๊ณผ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค.
@RequestMapping("/request-param-v1")
public void requestParamV1(
HttpServletRequest request,
HttpServletResponse response
) {
String username = request.getParameter("username");
int age = Integer.parseInt(request.getParameter("age"));
log.info("username={}, age={}", username, age);
}
๐ @RequestParam ์ฌ์ฉ
@RequestMapping("/request-param-v2")
public void requestParamV2(
@RequestParam("username") String memberName,
@RequestParam("age") int memberAge
) {
log.info("username={}, age={}", memberName, memberAge);
}
HTTP ํ๋ผ๋ฏธํฐ ์ด๋ฆ์ด ๋ณ์ ์ด๋ฆ๊ณผ ๊ฐ์ผ๋ฉด (name="xx")์ ๋ํ ์๋ต์ด ๊ฐ๋ฅํฉ๋๋ค.
@RequestMapping("/request-param-v3")
public void requestParamV3(
@RequestParam String username,
@RequestParam int age
) {
log.info("username={}, age={}", username, age);
}
HTTP ํ๋ผ๋ฏธํฐ ์ด๋ฆ์ด ๋ณ์ ์ด๋ฆ๊ณผ ๊ฐ์ ๋,
String, int, Integer ๋ฑ์ ๋จ์ ํ์ ์ด๋ฉด @RequestParam ๋ ์๋ต์ด ๊ฐ๋ฅํฉ๋๋ค.
@RequestMapping("/request-param-v4")
public void requestParamV4(
String username,
int age
) {
log.info("username={}, age={}", username, age);
}
@RequestParam ์ฌ์ฉ ์, ๋ฐ๋์ ์์ด์ผ ํ๋ ๊ฐ์ด ์๋ค๋ฉด required๋ฅผ ํตํด ์ด๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค.
@RequestParam ์ ๋ ธํ ์ด์ ์ ์๋ตํ๋ฉด ์คํ๋ง MVC๋ ๋ด๋ถ์์ required=false๋ฅผ ์ ์ฉํฉ๋๋ค.
๐ required
/**
* /request-param-required -> username์ด ์์ผ๋ฏ๋ก ์์ธ
*
* [์ฃผ์]
* /request-param-required?username= -> ๋น๋ฌธ์๋ก ํต๊ณผ
*
* [์ฃผ์]
* /request-param-required?username=shin ์ผ๋ก ์์ฒญํ ๊ฒฝ์ฐ
* age๊ฐ ์๋๋ฐ, age์ ํ์
์ int, null์ int์ ์
๋ ฅํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ฏ๋ก 500 ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
* ๋ฐ๋ผ์ Integer๋ก ๋ณ๊ฒฝํด์ผ ํจ(๋๋ ๋ค์์ ๋์ค๋ defaultValue ์ฌ์ฉ)
*/
@RequestMapping("/request-param-required")
public void requestParamRequired(
@RequestParam(required = true) String username,
@RequestParam(required = false) Integer age
) {
log.info("username={}, age={}", username, age);
}
๊ธฐ๋ณธ๊ฐ์ true ์ ๋๋ค.
๋ง์ฝ ํ์ ํ๋ผ๋ฏธํฐ๊ฐ ์์ผ๋ฉด 400 ์์ธ๊ฐ ๋ฐ์ํ๊ณ , username= ์ฒ๋ผ ๋ค์ ์๋ฌด๊ฒ๋ ์ ๋ ฅํ์ง ์๋ ๊ฒฝ์ฐ ๋น ๋ฌธ์("")๋ก ํต๊ณผ๋ฉ๋๋ค.
๊ทธ๋ฐ๋ฐ ๋ง์ฝ @RequestParam(required = false) int age ์ฒ๋ผ
primitive type์ required๊ฐ false์ธ ๊ฒฝ์ฐ, ์๋ฌด๋ฐ ๊ฐ์ ์ ๋ ฅํ์ง ์์ผ๋ฉด null์ด ๋ค์ด์ค๋ฏ๋ก ์์ธ๊ฐ ๋ฐ์ํฉ๋๋ค.
๋ฐ์ํ๋ ์์ธ
java.lang.IllegalStateException: Optional int parameter 'age' is present but cannot be translated into a null value due to being declared as a primitive type. Consider declaring it as object wrapper for the corresponding primitive type
๋ฐ๋ผ์ null์ด ๋ค์ด์ฌ ๊ฐ๋ฅ์ฑ์ด ์๋ ํ์ ์ Integer์ฒ๋ผ ๋ํผ ํด๋์ค๋ก ๊ฐ์ธ๊ฑฐ๋, ํน์ defaultValue๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
๐ defaultValue
/**
* defaultValue ์ฌ์ฉ
*
* ์ฐธ๊ณ : defaultValue๋ ๋น ๋ฌธ์์ ๊ฒฝ์ฐ์๋ ์ ์ฉ
* [/request-param?username=] ์ธ ๊ฒฝ์ฐ guest๊ฐ ์
๋ ฅ
*
* default value๋ฅผ ์ค์ ํ์๋ค๋ฉด, required ์์ฑ์ด ํ์ ์๋ค (์์ผ๋ฉด ๊ธฐ๋ณธ ๊ฐ์ด ์ธํ
๋๋ค.)
*
*/
@RequestMapping("/request-param-default")
public void requestParamDefault(
@RequestParam(required = true, defaultValue = "guest") String username,
@RequestParam(required = false, defaultValue = "-1") int age
) {
log.info("username={}, age={}", username, age);
}
์์ ์ฃผ์์ ๋์จ ๋ฐ์ ๊ฐ์ด username= ๊ณผ ๊ฐ์ด ๋น ๋ฌธ์๊ฐ ๋ค์ด์ค๋ ๊ฒฝ์ฐ์๋ ๋น ๋ฌธ์์ด("")์ด ์๋ ๊ธฐ๋ณธ ๋ฌธ์์ด์ด ์ ์ฉ๋ฉ๋๋ค.
๋ํ defaultValue๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ์์ฒญ ํ๋ผ๋ฏธํฐ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ ์๋์ผ๋ก defaultValue๋ก ์ง์ ํ ๊ฐ์ด ๋ค์ด๊ฐ๊ธฐ ๋๋ฌธ์ required true๋ฅผ ํด์ฃผ์ง ์์๋ ๋ฉ๋๋ค.
๐ ํ๋ผ๋ฏธํฐ๋ฅผ Map์ผ๋ก ์กฐํํ๊ธฐ
/**
* Map, MultiValueMap
* Map(key=value)
* MultiValueMap(key=[value1, value2, ...]
* - ex) /request-param-map?userIds=id1&userIds=id2
*/
@RequestMapping("/request-param-map")
public void requestParamMap(@RequestParam Map<String, Object> paramMap) {
log.info("username={}, age={}", paramMap.get("username"), paramMap.get("age"));
}
ํ๋ผ๋ฏธํฐ๋ฅผ Map, MultiValueMap์ผ๋ก ์กฐํํ ์ ์์ต๋๋ค.
Map
- ํ๋์ key์ value๊ฐ ํ๊ฐ์ธ ๊ฒฝ์ฐ ์ฌ์ฉํฉ๋๋ค.
MultiValueMap
- ํ๋์ key์ value๊ฐ ์ฌ๋ฌ๊ฐ์ธ ๊ฒฝ์ฐ ์ฌ์ฉํฉ๋๋ค.
- ex) username=shin&username=dong
ํ๋ผ๋ฏธํฐ์ ๊ฐ์ด 1๊ฐ๊ฐ ํ์คํ๋ค๋ฉด Map ์ ์ฌ์ฉํด๋ ๋์ง๋ง, ๊ทธ๋ ์ง ์๋ค๋ฉด MultiValueMap ์ ์ฌ์ฉํ์ฌ์ผ ํฉ๋๋ค.
(๋ง์ฝ Map์ ์ฌ์ฉํ๋๋ฐ ์ฌ๋ฌ๊ฐ๋ฅผ ์ ๋ ฅํ๋ค๋ฉด ๋งจ ์ฒ์ ์ ๋ ฅํ ๊ฒ์ด ์ถ๋ ฅ๋ฉ๋๋ค.)
๐ @ModelAttribute ์ฌ์ฉ
@RequestParam์ ํตํด ํด๋ผ์ด์ธํธ์์ ๋ณด๋ธ ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ์์ฌ ์ ์์์ต๋๋ค.
ํ์ง๋ง ๋๋ถ๋ถ์ ๊ฒฝ์ฐ, ๋ฐ์์จ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฌ์ฉํด์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ์ฌ์ฉํฉ๋๋ค.
์ด๋ฌํ ๊ณผ์ ์ ๊ฐํธํ๊ฒ ์งํํ๊ธฐ ์ํด ์คํ๋ง์ด ์ ๊ณตํ๋ @ModelAttribute๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ด๋ฅผ ํตํด ํ๋ผ๋ฏธํฐ๋ฅผ ๋ฐ๋ก ๊ฐ์ฒด ํํ๋ก ๋ง๋ค์ด์ ๋ฐ์ ์ ์์ต๋๋ค.
์ฐ์ ๋ค์๊ณผ ๊ฐ์ด ํ๋ผ๋ฏธํฐ๋ฅผ ํตํด ์์ฑํ ๊ฐ์ฒด๋ฅผ ์ ์ํฉ๋๋ค.
@Getter
@Setter
public class HelloData {
private String username;
private int age;
}
๊ธฐ์กด @RequestParam๋ง์ ์ฌ์ฉํ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑํด์ผ ํ ๊ฒ์ ๋๋ค.
@RequestMapping("/model-attribute-v1")
public void modelAttributeV1(
@RequestParam String username,
@RequestParam int age
) {
HelloData helloData = new HelloData();
helloData.setUsername(username);
helloData.setAge(age);
log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
}
๊ทธ๋ฌ๋ @ModelAttribute๋ฅผ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๊ฐ ๋ฐ๋๋๋ค.
@RequestMapping("/model-attribute-v1")
public void modelAttributeV1(
@ModelAttribute HelloData helloData
) {
log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
}
@ModelAttribute๋ ์๋ต ๊ฐ๋ฅํฉ๋๋ค.
@RequestMapping("/model-attribute-v2")
public void modelAttributeV2(
HelloData helloData
) {
log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
}
@ModelAttribute์ @RequestParam ๋ชจ๋ ์๋ต ๊ฐ๋ฅํ๋ฐ, ์ด๋ ์ ์ฉ๋๋ ๊ท์น์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
String, int, Integer์ ๊ฐ์ ๋จ์ ํ์ - @RequestMapping
(Argument Resolver๋ก ์ง์ ํด์ค ํ์ ์ธ) ๋๋จธ์ง ๊ฐ์ฒด - @ModelAttribute
๊ทธ๋ฌ๋ ํผ๋๋์ง ์๋๋ก ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค.
๐ ModelAttribute๊ฐ ๊ฐ์ ๋ฐ์ธ๋ฉํ ์ ์๋ ์กฐ๊ฑด
๊ธฐ๋ณธ ์์ฑ์์ Setter๊ฐ ์กด์ฌํด์ผ ํฉ๋๋ค.
๋๋
๋ชจ๋ ํ๋๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ๋ ์์ฑ์๊ฐ ํ์ํฉ๋๋ค.
๋๋
๋ช๋ช๊ฐ์ ํ๋๋ฅผ ๋งค๊ฐ๋ณ์๋ก ๋ฐ๋ ์์ฑ์ + setter๊ฐ ํ์ํฉ๋๋ค.
๐ง ์์ฒญ ๋ฉ์ธ์ง๋ฅผ ์กฐํํ๋ ๋ฐฉ๋ฒ - ๋จ์ ํ ์คํธ
HTTP message body์ ๋ฐ์ดํฐ๋ฅผ ์ง์ ๋ด์ ์์ฒญํ๋ ๊ฒฝ์ฐ, ์์์ ์ดํด๋ณธ ์์ฒญ ํ๋ผ๋ฏธํฐ๋ฅผ ์กฐํํ๋ ๋ฐฉ๋ฒ์ผ๋ก๋ ์ด์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค.
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก๋ ๋ค์๊ณผ ๊ฐ์ด ์กฐํํ ์ ์์ต๋๋ค.
@PostMapping("/request-body-string-v1")
public void requestBodyString(HttpServletRequest request, HttpServletResponse response) throws IOException {
ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
log.info("messageBody={}", messageBody);
}
๋๋ InputStream์ ๋ฐ๋ก ํ๋ผ๋ฏธํฐ๋ก ๋ฐ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
@PostMapping("/request-body-string-v2")
public void requestBodyStringV2(InputStream inputStream) throws IOException {
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
log.info("messageBody={}", messageBody);
}
HttpEntity(ํน์ ์ด๋ฅผ ์์๋ฐ์ RequestEntity)๋ผ๋ ๊ฒ์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค.
์ด๋ฅผ ์ฌ์ฉํ๋ฉด HTTP Header, Body ์ ๋ณด๋ฅผ ํธ๋ฆฌํ๊ฒ ์กฐํํ ์ ์์ต๋๋ค.
@PostMapping("/request-body-string-v3")
public void requestBodyStringV3(HttpEntity<String> httpEntity) throws IOException {
String messageBody = httpEntity.getBody();
log.info("messageBody={}", messageBody);
}
๐ @RequestBody ์ฌ์ฉ
@PostMapping("/request-body-string-v4")
public void requestBodyStringV4(@RequestBody String messageBody) throws IOException {
log.info("messageBody={}", messageBody);
}
์์ ๋ชจ๋ ๋ฉ์์ง ๋ฐ๋๋ฅผ ์ง์ ์กฐํํ๋ ๊ธฐ๋ฅ์ ์์ฒญ ํ๋ผ๋ฏธํฐ๋ฅผ ์กฐํํ๋ @RequestParam, @ModelAttribute์๋ ์ ํ ๊ด๊ณ๊ฐ ์์ต๋๋ค.
๋ฉ์์ง ๋ฐ๋๋ฅผ ์ฒ๋ฆฌํ๋ ๊ธฐ๋ฅ์ HTTP ๋ฉ์์ง ์ปจ๋ฒํฐ์์ ์ํ๋ฉ๋๋ค.
๐ง ์์ฒญ ๋ฉ์ธ์ง๋ฅผ ์กฐํํ๋ ๋ฐฉ๋ฒ - JSON
JSON์ ์กฐํํ๋ ๋ฐฉ๋ฒ๋ ๋จ์ ํ ์คํธ๋ฅผ ์กฐํํ๋ ๋ฐฉ๋ฒ๊ณผ ๋น์ทํ์ง๋ง, ObjectMapper๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
@PostMapping("/request-body-json-v1")
public void requestBodyJson(HttpServletRequest request, HttpServletResponse response) throws IOException {
ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
log.info("messageBody={}", messageBody);
HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);
log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
}
์๋์ ๊ฐ์ด @RequestBody + ObjectMapper์ ์กฐํฉ๋ ๊ฐ๋ฅํฉ๋๋ค.
@PostMapping("/request-body-json-v2")
public void requestBodyJsonV2(@RequestBody String messageBody) throws IOException {
log.info("messageBody={}", messageBody);
HelloData helloData = objectMapper.readValue(messageBody, HelloData.class);
log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
}
๐ @RequestBody ์ฌ์ฉ
๊ทธ๋ฌ๋ ๊ฐ์ฅ ์ถ์ฒํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ด @RequestBody๋ฅผ ํตํด ๊ฐ์ฒด๋ฅผ ์ง์ ํ๋ ๊ฒ์ ๋๋ค.
@PostMapping("/request-body-json-v3")
public void requestBodyJsonV3(@RequestBody HelloData helloData) throws IOException {
log.info("username={}, age={}", helloData.getUsername(), helloData.getAge());
}
@RequestBody์ ์ง์ ๋ง๋ ๊ฐ์ฒด๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค.
HttpEntity, @RequestBody๋ฅผ ์ฌ์ฉํ๊ฒ ๋๋ฉด HTTP ๋ฉ์์ง ์ปจ๋ฒํฐ๊ฐ HTTP ๋ฉ์์ง ๋ฐ๋์ ๋ด์ฉ์ ํ๋ผ๋ฏธํฐ๋ก ์ง์ ๋ ๋ฌธ์๋ ๊ฐ์ฒด ๋ฑ์ผ๋ก ๋ณํํด์ฃผ๋ ์์ ์ ์ํํฉ๋๋ค.
์ด๋ JSON๋ ๊ฐ์ฒด๋ก ๋ณํํด์ฃผ๋ฉฐ, ์ด๋ ๋ค์์ ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
๐ ์ฃผ์์ฌํญ 1
@RequestBody๋ ์๋ต์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.
์คํ๋ง์ @ModelAttribute , @RequestParam ํด๋น ์๋ต์ ๋ค์๊ณผ ๊ฐ์ ๊ท์น์ ์ ์ฉํฉ๋๋ค.
String , int , Integer ๊ฐ์ ๋จ์ ํ์ = @RequestParam
๋๋จธ์ง = @ModelAttribute (argument resolver ๋ก ์ง์ ํด๋ ํ์ ์ธ)
๋ฐ๋ผ์ @RequestBody๋ฅผ ์๋ตํ๋ฉด @ModelAttribute๊ฐ ์ ์ฉ๋์ด๋ฒ๋ฆฝ๋๋ค.
๐ ์ฃผ์์ฌํญ 2
HTTP ์์ฒญ ์ content-type์ด ๋ฐ๋์ application/json์ด์ด์ผ ํฉ๋๋ค.
๊ทธ๋์ผ๋ง JSON์ ์ฒ๋ฆฌํ ์ ์๋ HTTP ๋ฉ์์ง ์ปจ๋ฒํฐ๊ฐ ์คํ๋ฉ๋๋ค.
๐ง ResquestBody๊ฐ ๊ฐ์ ๋ฐ์ธ๋ฉํ ์ ์๋ ์กฐ๊ฑด
https://ttl-blog.tistory.com/757
๐ Reference
'๐๏ธ Spring > Web MVC' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[MVC] @Requestbody์ record๊ฐ ๋ฐ์ธ๋ฉ๋๋ ์ด์ (feat. @RequestBody์๋ setter๊ฐ ํ์์๋ค) (0) | 2022.01.02 |
---|---|
[MVC] HttpMessageConverter (+ HandlerMethodArgumentResolver, HandlerMethodReturnValueHandler) (0) | 2021.12.29 |
[MVC] ์์ฒญ ๋งคํ (@RequestMapping, PathVariable) (0) | 2021.12.29 |
[MVC] HandlerMapping๊ณผ HandlerAdapter (0) | 2021.12.29 |
[MVC] ์คํ๋ง ์น MVC ๊ตฌ์กฐ (0) | 2021.12.26 |