@Slf4j
(Lombok) : Logger๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํจ@RestController
: ๋ฆฌํด๋๋ ๊ฐ์ HTTP์๋ต์ body๋ก ์ฌ์ฉํ๊ธฐ ์ํจPostman
์ฌ์ฉ@Slf4j
@RestController
public class RequestHeaderController {
@GetMapping(value = "/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";
}
}
Postman์ ์ด์ฉํ API ํธ์ถ
ํธ์ถ ํ Console์ Log
HttpMethod
Locale
@RequestHeader MultiValueMap<String, String>
MultiValueMap
: ๊ฐ์ Key๊ฐ์ ๋ํด ์ค๋ณต๋ Value๋ฅผ ๊ฐ์ ์ ์๋ Map)@RequestHeader("host") String host
@CookieValue(value="myCookie", required = false) String cookie
Cookie
๊ฐ ํ์ธ@GetMapping("/add-cookie")
public String addCookie(HttpServletRequest request, HttpServletResponse response) {
Cookie cookie = new Cookie("myCookie", "myCookieValue");
response.addCookie(cookie);
return "ok";
}
/add-cookie
๋ก GET์์ฒญ ํ /headers
๋ก ์ฌ์์ฒญ ๊ฒฐ๊ณผGET
๋ฐฉ์์ผ๋ก ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ๋ฅผ ํตํด ์ ๋ฌ๋๋ ๊ฐ์ ์ป์ด์ค๋ ๊ฒ๊ณผ
POST
๋ฐฉ์์ผ๋ก ํผ์ ํตํด ์ ๋ฌ๋๋ ๋ฐ์ดํฐ๋ฅผ ์ป์ด์ค๋ ๋ฐฉ๋ฒ์
๋๋ค.
GET
๋ฐฉ์์ด๋ POST
๋ฐฉ์์ด๋ ์ ๋ฌ๋๋ ํ์์ด ๊ฐ๊ธฐ ๋๋ฌธ์
๋๋ค.GET
๋ฐฉ์์ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ์ ๊ฒฝ์ฐ username์ kim์ age์ 10์ ์ ๋ฌํ๋ ๊ฒฝ์ฐlocalhost:8080/request?username=kim&age=10
POST
๋ฐฉ์์ ์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ์ ๊ฒฝ์ฐ username์ kim์ age์ 10์ ์ ๋ฌํ๋ ๊ฒฝ์ฐ POST
์ ๊ฒฝ์ฐ username=kim&age=10
์ด ๋ถ๋ถ์ ๊ทธ๋๋ก body์ ๋ฃ์ด ์ ๋ฌํฉ๋๋ค. @RequestParam("username") Sring username
@RequestParam("age") int age
Postman์ ์ด์ฉํด localhost:8080/request-param-v2?username=kim&age=10
๋ฅผ ํธ์ถํ ๊ฒฐ๊ณผ
๐ ์ดํ ๋ชจ๋ ๋ฐฉ์์ Log๊ฒฐ๊ณผ๋ ๋์ผํ๊ธฐ ๋๋ฌธ์ ๊ฒฐ๊ณผ ํ์ธ์ ์๋ตํ๊ฒ ์ต๋๋ค. ใ
@ResponseBody
@RequestMapping("/request-param-v2")
public String requestParamV2(@RequestParam("username") String username, @RequestParam("age") int age) {
log.info("username = {}", username);
log.info("age = {}", age);
return "ok";
}
@RequestParam
์ key๊ฐ์ ์๋ตํ๋ ๋ฐฉ์์
๋๋ค. @ResponseBody
@RequestMapping("/request-param-v3")
public String requestParamV3(@RequestParam String username, @RequestParam int age) {
log.info("username = {}", username);
log.info("age = {}", age);
return "ok";
}
Required
์์ฑ์ ์ถ๊ฐํฉ๋๋ค. default๋ true
์
๋๋ค.false
๋ก ์ค์ ์ ์ฃผ์ํด์ผ ํ ์ฌํญ์ด ์์ต๋๋ค.primitive
ํ์
์ฌ์ฉ์ ์ ์ํด์ผ ํฉ๋๋ค. primitive
ํ์
์ int, boolean, double, long
๋ฑ์ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ๊ณต๋๋ ํ์
์ ์๋ฏธํฉ๋๋ค.primitive
ํ์
์ ํ๋ผ๋ฏธํฐ๋ฅผ false
๋ก ์ค์ ์ null
๊ฐ์ ์ฒ๋ฆฌํ์ง ๋ชปํ๊ณ 5xx
์๋ฒ์ธก ์๋ฌ์ฝ๋๋ฅผ ๋ฆฌํดํฉ๋๋ค.primitive
ํ์
์ Required false
์ค์ ์ ํด๋ผ์ด์ธํธ์ธก validation, ์๋ฒ์ธก validation, Integer, Double ๋ฑ Wrapper ํด๋์ค ์ฌ์ฉ ํน์ @RequestParam
์ defaultValue
๋ฅผ ์ฌ์ฉํฉ๋๋ค. @ResponseBody
@RequestMapping("/request-param-required")
public String requestParamRequired(
@RequestParam(required = true) String username,
@RequestParam(required = false) int age) {
log.info("username = {}", username);
log.info("age = {}", age);
return "ok";
}
GET
๋ฐฉ์์ Query-parameter
, POST
๋ฐฉ์์ ํผ ๋ฐ์ดํฐ๋ฅผ Object
๋ก ๋ฐ๋ ๋ฐฉ๋ฒ์
๋๋ค.
UserDto
ํด๋์ค ์
๋๋ค.@Data
public class UserDto {
private String username;
private int age;
}
@ModelAttribute
๋ ์ ๋ฌ๋ ์์ฒญ ํ๋ผ๋ฏธํฐ์ key๊ฐ์ ๊ฐ์ฒด์ ํ๋๋ช
๊ณผ ๋งคํํ์ฌ ํด๋น ํ๋์ setter
๋ฅผ ํธ์ถํ์ฌ ๊ฐ์ ๋ฐ์ธ๋ฉํฉ๋๋ค.@ModelAttribute
๋ ๊ฐ์ ๋งคํํ์ฌ ์ธํ
ํด์ฃผ๋ ๊ฒ ๋ฟ๋ง ์๋๋ผ View๋จ์ผ๋ก ๊ฐ์ ๋๊ธธ ๋ ์ฌ์ฉํ๋ Model
์ ๊ฐ์ ์ธํ
ํด์ค๋๋ค. ์ดํ์ ์์ธํ ์์๋ณด๊ฒ ์ต๋๋ค.@RequestMapping("/model-attribute-v1")
public String modelAttributeV1(@ModelAttribute UserDto userDto) {
log.info("username = {}", userDto.getUsername());
log.info("age = {}", userDto.getAge());
return "ok";
}
@ModelAttribute
๋ ์๋ต ๊ฐ๋ฅํฉ๋๋ค. ๋จ, Object
์ธ ๊ฒฝ์ฐ์๋ง ๋ฌต์์ ์ผ๋ก @ModelAttribute
๊ฐ ๋ถ์ต๋๋ค.@RequestParam
์ด ๋ถ๊ฒ ๋ฉ๋๋ค.@RequestMapping("/model-attribute-v2")
public String modelAttributeV2(UserDto userDto) {
log.info("username = {}", userDto.getUsername());
log.info("age = {}", userDto.getAge());
return "ok";
}
POST
๋ฐฉ์์ผ๋ก Http Body์ row๋ฐ์ดํฐ๋ก text๊ฐ ์ ๋ฌ๋๋ ๊ฒฝ์ฐ์ ๋ฐ์ดํฐ ํ์ฑ ๋ฐฉ๋ฒ์
๋๋ค.
HttpEntity
๋ฅผ ํตํด Http ๋ฉ์์ง์ ์ง์ ์ ๊ทผํ์ฌ body ๋ฉ์์ง๋ฅผ ํ์ฑํฉ๋๋ค.HttpEntity
๋ body ์ ๋ณด ๋ฟ๋ง ์๋๋ผ header์ ๋ณด๊น์ง ํ์ฑ ๊ฐ๋ฅํฉ๋๋ค. Http messgae์ ์ง์ ์ ๊ทผํ๊ธฐ ๋๋ฌธ์ด์ง์ ๐ @PostMapping("/request-body-string-v3")
public HttpEntity<String> requestBodyStringV3(HttpEntity<String> httpEntity) throws IOException {
String str = httpEntity.getBody();
log.info("body string = {}", str);
return new HttpEntity<>("ok");
}
HttpEntity
๋ฅผ ์์ํ๋ RequestEntity
๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์
๋๋ค.HttpEntity
์ ๊ฑฐ์ ๊ธฐ๋ฅ์ด ๊ฐ์ง๋ง RequestEntity
๋ ๋ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. (url ์ ๋ณด ๋ฑ ...)ResponseEntity
๋ํ HttpEntity
๋ฅผ ์์ํ๋ ํด๋์ค๋ก ๊ฑฐ์ ๊ฐ์ ๊ธฐ๋ฅ์ด๊ณ ๋ถ๊ฐ์ ์ธ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. @PostMapping("/request-body-string-v4")
public ResponseEntity<String> requestBodyStringV4(RequestEntity<String> requestEntity) throws IOException {
String str = requestEntity.getBody();
log.info("body string = {}", str);
log.info("request url = {}", requestEntity.getUrl());
return new ResponseEntity<String>("ok", HttpStatus.OK);
}
@RequestBody
๋ฅผ ์ด์ฉํ์ฌ Http message์ body๋ถ๋ถ์ ๋ฐ๋ก ๋ฐ์์ฌ ์ ์์ต๋๋ค. @ResponseBody
@PostMapping("/request-body-string-v5")
public String requestBodyStringV5(@RequestBody String str) {
log.info("body string = {}", str);
return "ok";
}
POST
๋ฐฉ์์ผ๋ก body์ Json
ํ์
์ผ๋ก ๋ฐ์ดํฐ๊ฐ ์ ์ก๋๋ ๊ฒฝ์ฐ ํ์ฑ ๋ฐฉ๋ฒ์
๋๋ค.{"username":"kim", "age":10}
์ด๋ฐ์์ผ๋ก ์ ๋ฌ๋๋ ํํ์
๋๋ค.ObjectMapper
๊ฐ์ฒด๋ฅผ ์์ฑํฉ๋๋ค.@RequestBody
๋ฅผ ์ด์ฉํด String์ผ๋ก Jsonํ์
body๋ฐ์ดํฐ๋ฅผ ๋ฐ๊ฒ ๋๋ฉด {"username":"kim", "age":10}
์ด๋ฐ Json๋ชจ์์ ๋ฐ์ดํฐ๊ฐ ๊ทธ๋๋ก String์ผ๋ก ๋ค์ด์ค๊ฒ ๋ฉ๋๋ค.log.info("ObjectMapper ์ด์ bodyString = {}", bodyString);
๊ทธ๋๋ก ๋ก๊ทธ๋ฅผ ์ฐ์ ๊ฒฐ๊ณผ์
๋๋ค.ObjectMapper
์ readValue
๋ฉ์๋๋ฅผ ์ด์ฉํด ๊ฐ์ฒด๋ก ๋ณํํฉ๋๋ค.@RequestBody
์ฌ์ฉ์ ์ฃผ์@RequestBody
๋ ์๋ต ๋ถ๊ฐํฉ๋๋ค.@ModelAttribute
๊ฐ primitiveํ์
์ ๊ฒฝ์ฐ @RequestParam
์ด ๊ธฐ๋ณธ์ผ๋ก ๋ค์ด๊ฐ๊ฒ ๋ฉ๋๋ค.
private ObjectMapper objectMapper = new ObjectMapper();
@ResponseBody
@PostMapping("/request-body-json-v3")
public String requestBodyJsonV3(@RequestBody String bodyString) throws JsonProcessingException {
UserDto userDto = objectMapper.readValue(bodyString, UserDto.class);
log.info("username = {}", userDto.getUsername());
log.info("age = {}", userDto.getAge());
return "ok";
}
@RequestBody
๋ก Stringํ์
์ ๋ฐ์์ง๋ง ์ด๋ฒ์ Object
๋ก ๋ฐ์์ต๋๋ค.ObjectMapper
๋ฅผ ์ฌ์ฉํ์ง ์์๋ ๋์ง์.@ResponseBody
@PostMapping("/request-body-json-v4")
public String requestBodyJsonV4(@RequestBody UserDto userDto) {
log.info("username = {}", userDto.getUsername());
log.info("age = {}", userDto.getAge());
return "ok";
}
RequestEntity
๋ฅผ ์ด์ฉํด Http ์์ฒญ ์์ฒด๋ฅผ ๋ฐ์๋ค์ด๋ ๋ฐฉ๋ฒ์
๋๋ค.RequestEntity
๋ฅผ ์ฌ์ฉํ์ผ๋ฏ๋ก ๋ฆฌํด๋ ResponseEntity
๋ฅผ ์ฌ์ฉํ์ต๋๋ค. String์ ๋ฆฌํดํด๋ ์๊ด ์์ต๋๋ค.@ResponseBody
@PostMapping("/request-body-json-v5")
public ResponseEntity<String> requestBodyJsonV5(RequestEntity<UserDto> requestEntity) {
log.info("username = {}", requestEntity.getBody().getUsername());
log.info("age = {}", requestEntity.getBody().getAge());
return new ResponseEntity<>("ok", HttpStatus.OK);
}