2023.02.23 - [๐ข Study/Spring boot] - 2. REST-API ์ค๊ณ
RequestMappingHandlerMapping
DispatcherServlet์ด ํด๋ผ์ด์ธํธ์ ์์ฒญ์ ์ฒ๋ฆฌํ ๋๋ RequestMappingHandlerMapping ์ปดํฌ๋ํธ์ ๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ํด๋ผ์ด์ธํธ์ ์์ฒญ๊ณผ ๋งค์นญ๋๋ ํธ๋ค๋ฌ ๋ฉ์๋๋ฅผ ์กฐํํ ์ ์๋ค.
1. @GetMapping
2. @DeleteMapping
3. @PostMapping
4. @PutMapping
1. @GetMapping
@RequestMapping(method=RequestMethod.GET)
GetMapping @Interface
@Target({ElementType.METHOD}) -(1)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@RequestMapping(method = {RequestMethod.GET})
public @interface GetMapping {
@AliasFor(annotation = RequestMapping.class)
String name() default "";
@AliasFor(annotation = RequestMapping.class)
String[] value() default {}; -(2)
@AliasFor(annotation = RequestMapping.class)
String[] path() default {}; -(2)
@AliasFor(annotation = RequestMapping.class)
String[] params() default {}; -(3)
@AliasFor(annotation = RequestMapping.class)
String[] headers() default {}; -(4)
@AliasFor(annotation = RequestMapping.class)
String[] consumes() default {}; -(5)
@AliasFor(annotation = RequestMapping.class)
String[] produces() default {}; -(6)
}
(1) @RequestMapping๊ณผ ๋ฌ๋ฆฌ @GetMapping์ ๋ฉ์๋ ์ ์ธ๋ถ์๋ง ์ค์ ํ ์ ์๋ค.
(2) ํด๋ผ์ด์ธํธ๊ฐ ์์ฒญํ๋ URI ์ค์
(3) ํ๋ผ๋ฏธํฐ ์ด๋ฆ๊ณผ ๋งค์นญ
(4) ํค๋์ด๋ฆ๊ณผ ๋งค์นญ
(5) Content-Type ํค๋๊ฐ๊ณผ ๋งค์นญ
(6) Accept ํค๋๊ฐ๊ณผ ๋งค์นญ
@GetMapping(path = "/hotels")
public void getHotels() {
...
}
@GetMapping(path = "/hotels", params = "isOpen")
public void getHotelsByOpen() {
...
}
URI ๊ฒฝ๋ก๋ ๊ฐ์ง๋ง, isOpen ๊ณผ ๊ฐ์ ํน์ ํ๋ผ๋ฏธํฐ๋ฅผ ํฌํจํ ๋ ์ด๋ฅผ ์ฒ๋ฆฌํ๋ ํธ๋ค๋ฌ ๋ฉ์๋๋ฅผ ๊ตฌ๋ถํด์ผ ํ๋ ๊ฒฝ์ฐ ์์ ๊ฐ์ด ๊ตฌ๋ถํ์ฌ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
GetMapping Attribute
[Path] ant-style path pattern
@GetMapping ์ ๋ํ ์ด์ ์ path ์์ฑ ๊ฐ์๋ ant-style path pattern ๋ฌธ์์ด์ ์ฌ์ฉํ์ฌ ์ค์ ํ ์ ์๋ค.
ant-style path pattern ์์ ์ฌ์ฉํ ์ ์๋ ํจํด๋ฌธ์๋ '*', '**', '?' ๊ฐ ์๋ค.
1) *
- 0๊ฐ ์ด์์ ๋ฌธ์๋ง ๋งค์นญํ ์ ์๋ค.
- @GetMapping(path="/hotels/*")์ผ๋ก ์ ์ธ๋ ๋ฉ์๋๋ '/hotels/12041'์ ๋งค์นญํ ์ ์์ง๋ง '/hotels/12041/rooms'๋ ๋งค์นญํ ์ ์๋ค.
2) **
- 0๊ฐ ์ด์์ ๋ฌธ์์ ๋๋ ํฐ๋ฆฌ๋ฅผ ๋งค์นญํ ์ ์๋ค.
- @GetMapping(path="/hotels/**")์ผ๋ก ์ ์ธ๋ ๋ฉ์๋๋ '/hotels/12041', '/hotels/12041/rooms'๋ฑ ํ์ ๋๋ ํฐ๋ฆฌ๊ฐ ๋ช๊ฐ๋ ์๊ด์์ด ๋ชจ๋ ๋งค์นญ๊ฐ๋ฅํ๋ค.
3) ?
- ํ ๊ฐ์ ๋ฌธ์์ ๋งค์นญ๋๋ค.
- @GetMapping(path="/hotels/?")์ผ๋ก ์ ์ธ๋ ๋ฉ์๋๋ '/hotels/1'์ ๋งค์นญํ ์ ์์ง๋ง '/hotels/12'๋ ๋งค์นญํ ์ ์๋ค.
path, value, name, consumes, produces์ ์ค์ ๋ ๊ฐ์ OR ์ฐ์ฐ์ผ๋ก ๋์ํ๊ณ , params, headers์ ์ค์ ๋ ์์ฑ๊ฐ์ AND ์ฐ์ฐ์ผ๋ก ๋์ํ๋ค.
@GetMapping(path={"/hotels", "/rooms"})
- GET /hotels , GET /rooms ์์ฒญ ๋ชจ๋ ๋งคํํ ์ ์๋ ์ค์ ์ด๋ค.
@GetMapping(path="/hotels", params={"isOpen", "hasVacancy"})
- GET /hotels?isOpen=true&hasVacancy=true ์์ฒญ์ ๋งคํํ ์ ์๋ ์ค์ ์ด๋ค.
@GetMapping(path={"/hotels", "/rooms"}, params={"isOpen", "hasVacancy"})
- GET /hotels?isOpen=true&hasVacancy=true, - GET /rooms?isOpen=true&hasVacancy=true ์์ฒญ์ ๋งคํํ ์ ์๋ ์ค์ ์ด๋ค.
@PathVariable
์ฌ์ฉ์๊ฐ ์์ฒญํ REST-API์ URI์์ ํน์ ์์น์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ฝ์ ๋ ์ฌ์ฉํ๋ค.
@PathVariable์ ์ฌ์ฉํ์ฌ ๋ฝ์๋ธ ๋ฐ์ดํฐ๋ ํธ๋ค๋ฌ ๋ฉ์๋์ ์ธ์๋ก ์ฃผ์ ๊ฐ๋ฅํ๋ค. ๋ฐ์ดํฐ๋ฅผ ์ฃผ์ ํ ์ธ์์ @PathVariable ์ ๋ํ ์ด์ ์ ์ ์ํ๋ฉด ๋๋ค. ์ด๋, @GetMapping ์ path์์ฑ์๋ ๋ฆฌ์์ค ๋ณ์๊ฐ ์ ์ธ๋์ด ์์ด์ผํ๋ฉฐ, @PathVariable์๋ ์ฃผ์ ํ ๋ฆฌ์์ค ๋ณ์์ ์ด๋ฆ์ ์ ์ธํด์ผ ํ๋ค.
@GetMapping(path="/hotels/{hotelId}/rooms/{roomId}")
public HotelRoomResponse getHotelRoom(
@PathVariable(value="hotelId") Long hotelId,
@PathVariable(value="roomId") Long roomId) {
...
}
@RequestParam
Http ํ๋ผ๋ฏธํฐ๋ ์ด๋ฆ๊ณผ ๊ฐ์ผ๋ก ๊ตฌ์ฑ๋๊ณ &๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ํ๋ผ๋ฏธํฐ๋ฅผ ์กฐํฉ ์ ๋ฌํ ์ ์๋ค.
@GetMapping(path = "/hotels/{hotelId}/rooms/{roomNumber}")
public HotelRoomResponse getHotelRoomByPeriod(
@PathVariable Long hotelId,
@PathVariable String roomNumber,
@RequestParam(value = "fromDate", required = false) @DateTimeFormat(pattern = "yyyyMMdd") LocalDate fromDate,
@RequestParam(value = "toDate", required = false) @DateTimeFormat(pattern = "yyyyMMdd") LocalDate toDate) {
...
}
ํ์์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ๋ required ์ต์ ๊ธฐ๋ณธ๊ฐ์ true์ด๋ค.
name ๋๋ value ์ ์ค์ ๋ ์ด๋ฆ๊ณผ ๋งค์นญ๋๋ ํ๋ผ๋ฏธํฐ ๊ฐ์ด null ์ด๊ฑฐ๋ ๋น์ด์๋ ๊ฒฝ์ฐ defaultValue ์ต์ ์ ํตํด ๊ธฐ๋ณธ ๊ฐ์ ์ค์ ํ ์ ์๋ค.
2. @DeleteMapping
https://jump-developer.tistory.com/41
@GetMapping ๊ณผ ์ฌ์ฉ๋ฐฉ๋ฒ์ ๋์ผํ๋ค.
REST ๊ท์ฝ์ ๋ฐ๋ผ ๋ณดํต ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๊ธฐ ์ํ Method๋ก ์ฌ์ฉ๋๋ค.