๐ง @RequestMapping
์์ฒญ๋ url์ ๋ํด์ ๋งคํํ๊ธฐ ์ํ์ฌ ์ฌ์ฉํฉ๋๋ค.
์๋ฅผ ๋ค์ด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
@RequestMapping("/hello-basic")
public String helloBasic() {
return "ok";
}
@RequestMapping์ ์ฒ๋ฆฌํ๋ HandlerMapping๊ณผ HandlerAdapter๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- RequestMappingHandlerMapping
- RequestMappingHandlerAdapter
๐ง URL ๊ฒฝ๋ก์ ๋ํ ๋งคํ
@RequestMapping("/hello")
- /hello ๋ก URL ํธ์ถ์ด ์ค๋ฉด ์ด ๋ฉ์๋๊ฐ ์คํ๋๋๋ก ๋งคํํฉ๋๋ค.
- ๋๋ถ๋ถ์ ์์ฑ์ ๋ฐฐ์ด๋ก ์ ๊ณตํ๋ฏ๋ก ๋ค์๊ณผ ๊ฐ์ด ๋ค์ค ์ค์ ๋ ๊ฐ๋ฅํฉ๋๋ค.
- {"/hello", "/hi"}
๐ ํธ๋ ์ผ๋ง ์ฌ๋์
url ๋ง์ง๋ง์ ๋ถ๋ ์ฌ๋์๋ฅผ ํธ๋ ์ผ๋ง ์ฌ๋ ์๋ผ๊ณ ํฉ๋๋ค. (์๋ฅผ ๋ค์ด /hello/)
์ถ๊ฐ์ ์ธ ์ค์ ์ ํ์ง ์๋ ์ด์, ๊ธฐ๋ณธ์ ์ผ๋ก ๋ค์ ๋ ์์ฒญ์ ๋ค๋ฅด๊ฒ ์ธ์๋ฉ๋๋ค.
- /hello
- /hello/
์คํ๋ง์์ ์์ ๊ด๋ จ๋ ์ค์ ์ ํ์ธํ๋ ค๋ฉด ์๋ ๋งํฌ๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์
https://stackoverflow.com/questions/59914965/spring-mvc-requestmapping-requires-trailing-slash
๐ง HTTP ๋ฉ์๋ ์ง์
@RequestMapping์ method ์์ฑ์ผ๋ก HTTP ๋ฉ์๋๋ฅผ ์ง์ ํ์ง ์์ผ๋ฉด HTTP ๋ฉ์๋์ ๋ฌด๊ดํ๊ฒ ํธ์ถ๋ฉ๋๋ค.
GET, HEAD, POST, PUT, PATCH, DELETE .. ๋ฑ๋ฑ ๋ชจ๋ ํ์ฉ๋ฉ๋๋ค.
์ด๋ค์ ์๋์ ๊ฐ์ด ์ถ์ฝํ์ฌ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- @GetMapping
- @PostMapping
- @PutMapping
- @DeleteMapping
- @PatchMapping
์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
@RequestMapping(value = "/mapping-get", method = RequestMethod.GET)
public String mappingGet() {
log.info("mappingGet");
return "ok";
}
์ ์ฝ๋๋ ์ถ์ฝํ์ฌ ์๋์ ๊ฐ์ด ์ฌ์ฉํ ์ ์์ต๋๋ค.
@GetMapping(value = "/mapping-get")
public String mappingGet() {
log.info("mappingGet");
return "ok";
}
๐ง ํ๋ผ๋ฏธํฐ ์ถ๊ฐ ๋งคํ
@GetMapping(value = "/hello", params = "mode=debug")
ํ๋ผ๋ฏธํฐ ์ ๋ณด์ mode=debug ์ ๋ณด๊ฐ ์์ด์ผ ํ๋ค.
(mode=debug๋ ํ๋์ ์์์ผ ๋ฟ์ ๋๋ค.)
๋ค์๊ณผ ๊ฐ์ด ์ฌ๋ฌ ํํ๋ค์ด ๊ฐ๋ฅํฉ๋๋ค.
- params="mode" : mode ํ๋ผ๋ฏธํฐ๊ฐ ์์ด์ผ ํจ
- params="!mode" : mode ํ๋ผ๋ฏธํฐ๊ฐ ์์ด์ผ ํจ
- params="mode=debug" : mode ํ๋ผ๋ฏธํฐ์ ๊ฐ์ด debug์ฌ์ผ ํจ
- params="mode!=debug" : mode ํ๋ผ๋ฏธํฐ์ ๊ฐ์ด debug๊ฐ ์๋์ด์ผ ํจ
- params={"mode=debug", "data=good"} : mode ํ๋ผ๋ฏธํฐ๋ debug์ด๊ณ , data๋ good์ด์ด์ผ ํจ
๐ง ํค๋ ์ถ๊ฐ ๋งคํ
@GetMapping(value = "/mapping-header", headers = "mode=debug")
- headers="mode",
- headers="!mode"
- headers="mode=debug"
- headers="mode!=debug"
๐ง ๋ฏธ๋์ด ํ์ ์กฐ๊ฑด ๋งคํ
(Content-Type, consume)
@PostMapping(value = "/mapping-consume", consumes = "application/json")
Header์ Content-Type ๊ฐ์ ๋งคํ๋ฉ๋๋ค.
- consumes="application/json"
- consumes="!application/json"
- consumes="application/*"
- consumes="*/*"
- MediaType.APPLICATION_JSON_VALUE
๐ง ๋ฏธ๋์ด ํ์ ์กฐ๊ฑด ๋งคํ
(Accept, produce)
@PostMapping(value = "/mapping-produce", produces = "text/html")
Header์ Accept ๊ฐ์ ๋งคํ๋ฉ๋๋ค.
- produces = "text/plain"
- produces = {"text/plain", "application/*"}
- produces = MediaType.TEXT_PLAIN_VALUE
- produces = "text/plain;charset=UTF-8"
๐ง PathVariable (๊ฒฝ๋ก ๋ณ์)
์ง์ ํ url์ ๋ค์๊ณผ ๊ฐ์ด ๋ณ์๋ฅผ ๋ฃ์ด์ ์ง์ ํ ์ ์์ต๋๋ค.
@GetMapping("/mapping/{userId}")
public String mappingPath(@PathVariable("userId")String userId){
log.info("mapping userId={}",userId);
}
์์ฒญ์ /mapping/123 ์ผ๋ก ํ๋ค๋ฉด, userId์ ๊ฐ์๋ 123์ด ๋ค์ด๊ฐ๋๋ค.
๋ง์ฝ @Pathvariable๊ณผ ํ๋ผ๋ฏธํฐ์ ์ด๋ฆ์ด ๊ฐ์ผ๋ฉด ์๋ตํ ์ ์์ต๋๋ค.
@GetMapping("/mapping/{userId}")
public String mappingPath(@PathVariable String userId){
log.info("mapping userId={}",userId);
}
๋ค์๊ณผ ๊ฐ์ด ๋ค์ค์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
@GetMapping("/mapping/users/{userId}/orders/{orderId}")
public String mappingPath(
@PathVariable("userId") String userId,
@PathVariable("orderId") String orderId
) {
log.info("mapping Path - userId = {}, orderId = {}", userId, orderId);
return "ok";
}
๐ง @Controller
@Controller๋ ๋ด๋ถ์ @Component๋ฅผ ๋ค๊ณ ์๊ธฐ ๋๋ฌธ์ ์ปดํฌ๋ํธ ์ค์บ์ ๋์์ด ๋ฉ๋๋ค.
์ถ๊ฐ์ ์ผ๋ก ์คํ๋ง MVC์์ ์ ๋ ธํ ์ด์ (@RequestMapping)๊ธฐ๋ฐ ์ปจํธ๋กค๋ฌ(ํธ๋ค๋ฌ)๋ก ์ธ์ํฉ๋๋ค.
Reference
'๐๏ธ Spring > Web MVC' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[MVC] HttpMessageConverter (+ HandlerMethodArgumentResolver, HandlerMethodReturnValueHandler) (0) | 2021.12.29 |
---|---|
[MVC] HTTP ์์ฒญ ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋ ์ฌ๋ฌ๊ฐ์ง ๋ฐฉ๋ฒ (@ModelAttribute, @RequestBody ๋ฑ) (0) | 2021.12.29 |
[MVC] HandlerMapping๊ณผ HandlerAdapter (0) | 2021.12.29 |
[MVC] ์คํ๋ง ์น MVC ๊ตฌ์กฐ (0) | 2021.12.26 |
[MVC] ํ๋ก ํธ ์ปจํธ๋กค๋ฌ ํจํด (0) | 2021.12.26 |