@RequestMapping
@Controller // ๋ด๋ถ์ @Component ์ ๋
ธํ
์ด์
์ด ์์ด์ ์ปดํฌ๋ํธ ์ค์บ์ ๋์์ด ๋๋ค
public class SpringMemberFormControllerV1 {
@RequestMapping("/springmvc/v1/members/new-form") // ์์ฒญ์ ๋ณด๋ฅผ ๋งคํํ๋ค
public ModelAndView process() { // ๋ชจ๋ธ๊ณผ ๋ทฐ์ ์ ๋ณด๋ฅผ ๋ด์์ ๋ฐํํ๋ค
return new ModelAndView("new-form");
}
}
RequestMappingHandlerMapping์ ์คํ๋ง ๋น ์ค์์ @RequestMapping ๋๋ @Controller ๊ฐ ํด๋์ค ๋ ๋ฒจ์ ๋ถ์ด ์๋ ๊ฒฝ์ฐ์ ๋งคํ ์ ๋ณด๋ก ์ธ์ํ๋ค.
ํด๋์ค ๋ ๋ฒจ์ ๋ค์๊ณผ ๊ฐ์ด @RequestMapping
์ ๋๋ฉด ๋ฉ์๋ ๋ ๋ฒจ๊ณผ ์กฐํฉ์ด ๋๋ค.
@Controller
@RequestMapping("/springmvc/v2/members")
public class SpringMemberControllerV2 {}
ํด๋์ค ๋ ๋ฒจ @RequestMapping("/springmvc/v2/members")
๋ฉ์๋ ๋ ๋ฒจ @RequestMapping("/new-form")
โก๏ธ /springmvc/v2/members/new-form
@RequestMapping ์์ฑ
โ๏ธ HTTP ๋ฉ์๋ ๋งคํ
@RequestMapping(value = "/mapping-get-v1", method = RequestMethod.GET)
@GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping์ผ๋ก ๋ณ๊ฒฝ ๊ฐ๋ฅ
โ๏ธ PathVariable ์ฌ์ฉ
@GetMapping("/mapping/{userId}")
public String mappingPath(@PathVariable("userId") String data) { // ๋ณ์๋ช
์ด ๊ฐ์ผ๋ฉด @PathVariable ์๋ต ๊ฐ๋ฅ
}
// ๋ค์ค ์ฌ์ฉ ๊ฐ๋ฅ
@GetMapping("/mapping/users/{userId}/orders/{orderId}")
public String mappingPath(@PathVariable String userId, @PathVariable Long orderId) {
}
โ๏ธ ํน์ ํค๋ ์กฐ๊ฑด ๋งคํ
@GetMapping(value = "/mapping-header", headers = "mode=debug")
โ๏ธ ๋ฏธ๋์ด ํ์ ์กฐ๊ฑด ๋งคํ - Content-Type, consume
@PostMapping(value = "/mapping-consume", consumes = "application/json")
โ๏ธ ๋ฏธ๋์ด ํ์ ์กฐ๊ฑด ๋งคํ - Accept, produces
@PostMapping(value = "/mapping-produce", produces = "text/html")
HTTP ์์ฒญ ๋ฉ์ธ์ง
@RequestParam
์ฟผ๋ฆฌ ํ๋ผ๋ฏธํฐ ํ์์ด๋ POST(HTML Form)ํ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌ ๋ฐ์์ ๋ ํ๋ผ๋ฏธํฐ ์ด๋ฆ์ผ๋ก input parameter์ ๋ฐ์ธ๋ฉํด์ฃผ๋ ์ด๋ ธํ ์ด์
@RequestParam("username") String memberName
โก๏ธ request.getParameter("username")
- HTTP ํ๋ผ๋ฏธํฐ ์ด๋ฆ์ด ๋ณ์ ์ด๋ฆ๊ณผ ๊ฐ์ผ๋ฉด @RequestParam(name="xx") ์๋ต ๊ฐ๋ฅ
- String , int , Integer ๋ฑ์ ๋จ์ ํ์
์ด๋ฉด
@RequestParam
๋ ์๋ต ๊ฐ๋ฅ- @RequestParam ์ ๋ ธํ ์ด์ ์ ์๋ตํ๋ฉด ์คํ๋ง MVC๋ ๋ด๋ถ์์ required=false ๋ฅผ ์ ์ฉํ๋ค. ๊ธฐ๋ณธ๊ฐ์ true์ด๋ค.
- ์ด๋ ๊ฒ ์ ๋ ธํ ์ด์ ์ ์์ ํ ์๋ตํด๋ ๋๋๋ฐ, ๋๋ฌด ์๋ ๊ฒ๋ ์ฝ๊ฐ ๊ณผํ๋ค๋ ์ด์ผ๊ธฐ๋ ์๋ค.
โ๏ธ @RequestParam.required
- ๊ธฐ๋ณธ๊ฐ์ true
/request-param?username=
์ฒ๋ผ ํ๋ผ๋ฏธํฐ ์ด๋ฆ์ ์๊ณ ๊ฐ์ ์๋๊ฒฝ์ฐ ๋น๋ฌธ์๋ก ์ทจ๊ธํด์ required๊ฐ true์ฌ๋ ํต๊ณผ๋๋ค- ๊ธฐ๋ณธํ(primitive)์ null์ ์ ๋ ฅํ๋ ๊ฒฝ์ฐ required๊ฐ false์ฌ๋ null์ ๊ธฐ๋ณธํ์ ์ ๋ ฅํ๋๊ฑด ๋ถ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์์ธ ๋ฐ์
โ๏ธ @RequestParam.defaultValue
ํ๋ผ๋ฏธํฐ์ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ defaultValue ๋ฅผ ์ฌ์ฉํ๋ฉด ๊ธฐ๋ณธ ๊ฐ์ ์ ์ฉํ ์ ์๋ค. ์ด๋ฏธ ๊ธฐ๋ณธ ๊ฐ์ด ์๊ธฐ ๋๋ฌธ์ required ๋ ์๋ฏธ๊ฐ ์๋ค. defaultValue ๋ ๋น ๋ฌธ์์ ๊ฒฝ์ฐ์๋ ์ค์ ํ ๊ธฐ๋ณธ ๊ฐ์ด ์ ์ฉ๋๋ค.
โ๏ธ @RequestParam Map<String, Object> paramMap
ํ๋ผ๋ฏธํฐ๋ฅผ Map, MultiValueMap์ผ๋ก ์กฐํํ ์ ์๋ค.
@ModelAttribute
@ModelAttribute HelloData helloData
์คํ๋งMVC๋ @ModelAttribute ๊ฐ ์์ผ๋ฉด ๋ค์์ ์คํํ๋ค.
- HelloData ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ค.
- ์์ฒญ ํ๋ผ๋ฏธํฐ์ ์ด๋ฆ์ผ๋ก HelloData ๊ฐ์ฒด์ ํ๋กํผํฐ๋ฅผ ์ฐพ๋๋ค. ๊ทธ๋ฆฌ๊ณ ํด๋น ํ๋กํผํฐ์ setter๋ฅผ ํธ์ถํด์ ํ๋ผ๋ฏธํฐ์ ๊ฐ์ ์
๋ ฅ(๋ฐ์ธ๋ฉ) ํ๋ค.
- ์) ํ๋ผ๋ฏธํฐ ์ด๋ฆ์ด username ์ด๋ฉด setUsername() ๋ฉ์๋๋ฅผ ์ฐพ์์ ํธ์ถํ๋ฉด์ ๊ฐ์ ์ ๋ ฅํ๋ค.
@ModelAttribute ๋ ์๋ตํ ์ ์๋ค. ๊ทธ๋ฐ๋ฐ @RequestParam ๋ ์๋ตํ ์ ์์ผ๋ ํผ๋์ด ๋ฐ์ํ ์ ์๋ค. ๊ทธ๋์ ์คํ๋ง์ ์๋ต์ ๋ค์๊ณผ ๊ฐ์ ๊ท์น์ ์ ์ฉํ๋ค.
String , int , Integer ๊ฐ์ ๋จ์ ํ์
= @RequestParam
๋๋จธ์ง = @ModelAttribute (argument resolver ๋ก ์ง์ ํด๋ ํ์
์ธ)
์ถ๊ฐ ๊ธฐ๋ฅ
- Model์ @ModelAttribute๋ก ์ง์ ํ ๊ฐ์ฒด๋ฅผ ์๋์ผ๋ก ๋ฃ์ด์ค๋ค.
- ๋ง์ฝ @ModelAttribute์ ์ด๋ฆ์ ์๋ตํ๋ฉด ๋ชจ๋ธ์ ์ ์ฅ๋ ๋ ํด๋์ค๋ช ์ ์ฌ์ฉํด ์ ์ฅํ๋ค(ํด๋์ค์ ์ฒซ๊ธ์๋ง ์๋ฌธ์๋ก ๋ณ๊ฒฝ)
/*
@ModelAttribute("item") Item item
model.addAtribute("item", item); ์๋์ถ๊ฐ
*/
/*
@ModelAttribute HelloData hd
model.addAtribute("helloData", hd); ์๋์ถ๊ฐ
*/
@RequestBody
์์ฒญ ํ๋ผ๋ฏธํฐ์ ๋ค๋ฅด๊ฒ, HTTP ๋ฉ์์ง ๋ฐ๋๋ฅผ ํตํด ๋ฐ์ดํฐ๊ฐ ์ง์ ๋ฐ์ดํฐ๊ฐ ๋์ด์ค๋ ๊ฒฝ์ฐ๋ @RequestParam , @ModelAttribute ๋ฅผ ์ฌ์ฉํ ์ ์๋ค
@PostMapping("/request-body-json-v1")
public void requestBodyJsonV1(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 1. ServletInputStream์ ์ด์ฉํด์ ์ง์ ์ฝ๋ ๋ฐฉ๋ฒ
ServletInputStream inputStream = request.getInputStream();
String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);
// ๋ฌธ์๋ก ๋ JSON ๋ฐ์ดํฐ๋ฅผ Jackson ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ objectMapper ๋ฅผ ์ฌ์ฉํด์ ์๋ฐ ๊ฐ์ฒด๋ก ๋ณํํ๋ค.
HelloData data = objectMapper.readValue(messageBody, HelloData.class);
}
@PostMapping("/request-body-string-v3")
// HttpEntity: HTTP header, body ์ ๋ณด๋ฅผ ํธ๋ฆฌํ๊ฒ ์กฐํํ ์ ์๋ ๊ฐ์ฒด
// 3. HttpEntity<String>๋ฅผ ์ด์ฉํด์ ์กฐํํ๋ ๋ฐฉ๋ฒ
public HttpEntity<String> requestBodyStringV3(HttpEntity<String> httpEntity) {
String messageBody = httpEntity.getBody();
return new HttpEntity<>("ok");
}
@ResponseBody // ๋ฉ์์ง ๋ฐ๋ ์ ๋ณด ์ง์ ๋ฐํ
@PostMapping("/request-body-json-v2")
// 4. @RequestBody`๋ฅผ ์ด์ฉํด์ ๋ฐ๋ ์ ๋ณด๋ฅผ ์กฐํํ๋ ๋ฐฉ๋ฒ
public String requestBodyJsonV2(@RequestBody String messageBody) throws IOException {
HelloData data = objectMapper.readValue(messageBody, HelloData.class);
return "ok";
}
ServletInputStream
InputStream
(input parameter๋ก ๋ฐ๋ก ๋ฐ์)HttpEntity<String>
@RequestBody
์ฐธ๊ณ
@RequestBody๋ ์๋ต ๋ถ๊ฐ๋ฅํ๋ค.
์คํ๋ง์ @ModelAttribute , @RequestParam ์๋ต์ ๋ค์๊ณผ ๊ฐ์ ๊ท์น์ ์ ์ฉํ๋ค
String , int , Integer ๊ฐ์ ๋จ์ ํ์ = @RequestParam
๋๋จธ์ง = @ModelAttribute (argument resolver ๋ก ์ง์ ํด๋ ํ์ ์ธ)
๋ฐ๋ผ์ ์ด ๊ฒฝ์ฐ HelloData์ @RequestBody ๋ฅผ ์๋ตํ๋ฉด @ModelAttribute ๊ฐ ์ ์ฉ๋์ด๋ฒ๋ฆฐ๋ค.
HelloData data โก๏ธ @ModelAttribute HelloData data
๋ฐ๋ผ์ ์๋ตํ๋ฉด HTTP ๋ฉ์์ง ๋ฐ๋๊ฐ ์๋๋ผ ์์ฒญ ํ๋ผ๋ฏธํฐ๋ฅผ ์ฒ๋ฆฌํ๊ฒ ๋๋ค.
HTTP ์๋ต ๋ฉ์ธ์ง
์ ์ ๋ฆฌ์์ค
ํด๋น ํ์ผ์ ๋ณ๊ฒฝ ์์ด ๊ทธ๋๋ก ์๋น์คํ๋ ๊ฒ์ ๋งํ๋ค.
์คํ๋ง ๋ถํธ๋ ํด๋์คํจ์ค์ ๋ค์ ๋๋ ํ ๋ฆฌ์ ์๋ ์ ์ ๋ฆฌ์์ค๋ฅผ ์ ๊ณตํ๋ค./static
, /public
, /resources
, /META-INF/resources
๋ค์ ๊ฒฝ๋ก์ ํ์ผ์ด ๋ค์ด์์ผ๋ฉด src/main/resources/static/basic/hello-form.html
์น ๋ธ๋ผ์ฐ์ ์์ ๋ค์๊ณผ ๊ฐ์ด ์คํํ๋ฉด ๋๋ค. http://localhost:8080/basic/hello-form.html
๋ทฐ ํ ํ๋ฆฟ
๋ทฐ ํ ํ๋ฆฟ์ ๊ฑฐ์ณ์ HTML์ด ์์ฑ๋๊ณ , ๋ทฐ๊ฐ ์๋ต์ ๋ง๋ค์ด์ ์ ๋ฌํ๋ค.
๋ทฐ ํ ํ๋ฆฟ ๊ฒฝ๋ก : src/main/resources/templates
// ์ง์ modelAndView๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ
@RequestMapping("/response-view-v1")
public ModelAndView responseViewV1() {
ModelAndView mav = new ModelAndView("response/hello").addObject("data", "hello!");
return mav;
}
// @ResponseBody ๊ฐ ์์ผ๋ฉด response/hello ๋ก ๋ทฐ ๋ฆฌ์กธ๋ฒ๊ฐ ์คํ๋์ด์ ๋ทฐ๋ฅผ ์ฐพ๊ณ , ๋ ๋๋ง ํ๋ค
// ์ฌ๊ธฐ์๋ ๋ทฐ์ ๋
ผ๋ฆฌ ์ด๋ฆ์ธ response/hello ๋ฅผ ๋ฐํํ๋ฉด ๋ค์ ๊ฒฝ๋ก์ ๋ทฐ ํ
ํ๋ฆฟ์ด ๋ ๋๋ง ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
// ์คํ: templates/response/hello.html
@RequestMapping("/response-view-v2")
public String responseViewV2(Model model) {
model.addAttribute("data", "hello!!");
return "response/hello";
}
๋ฉ์์ง ๋ฐ๋์ ์ง์ ์๋ต
@ResponseBody ๋ฅผ ์ฌ์ฉํ๋ฉด view๋ฅผ ์ฌ์ฉํ์ง ์๊ณ , HTTP ๋ฉ์์ง ์ปจ๋ฒํฐ๋ฅผ ํตํด์ HTTP ๋ฉ์์ง๋ฅผ ์ง์ ์ ๋ ฅํ ์ ์๋ค.
@RestController
@Controller ๋์ ์ @RestController ์ ๋
ธํ
์ด์
์ ์ฌ์ฉํ๋ฉด, ํด๋น ์ปจํธ๋กค๋ฌ์ ๋ชจ๋ @ResponseBody ๊ฐ ์ ์ฉ๋๋ ํจ๊ณผ๊ฐ ์๋ค
@Controller ๋ ๋ฐํ ๊ฐ์ด String ์ด๋ฉด ๋ทฐ ์ด๋ฆ์ผ๋ก ์ธ์๋๋ค. ๊ทธ๋์ ๋ทฐ๋ฅผ ์ฐพ๊ณ ๋ทฐ๊ฐ ๋๋๋ง ๋๋ค. @RestController ๋ ๋ฐํ ๊ฐ์ผ๋ก ๋ทฐ๋ฅผ ์ฐพ๋ ๊ฒ์ด ์๋๋ผ, HTTP ๋ฉ์์ง ๋ฐ๋์ ๋ฐ๋ก ์
๋ ฅํ๋ค.
๐ Reference