๋ง์ฐํ๊ฒ ์๊ณ , ๋์ถฉ ์ฌ์ฉํ๋ HTTP ์๋ต ์ฝ๋๋ฅผ ์ ๋ฆฌํ ์๊ฐ.. ๋๋์ด..
ํ ๋ฒ์ ํ๋ ค๊ณ ํ๋๋ฐ POST ํ๋ ์ ๋ฆฌ๋ ๊ฝค๋ ๊ฑธ๋ ค์ ๋๋ ์ ์ ๋ฆฌํด์ผ๊ฒ ๋ค. ์ฌ์ค ์์ง POST ๋ง๊ณ ๋ ๊ถ๊ธํ ์ ์ด ์์.
< REST API์์์ HTTP ์๋ต ์ฝ๋ >
- ์กฐํ(GET) => 200 OK
- ์์ฑ(POST) => 201 Created
- ์์ (PUT, PATCH) => 200 OK / 204 No Content
- ์ญ์ (DELETE) => 204 No Content
๐ถ ์์ฑ(POST)
POST ์์ฒญ ์ 201 Created ์๋ต์ ๋ณด๋ธ๋ค.
์ด ๋, Location ํค๋์ ์์ฑ๋ ๋ฆฌ์์ค์ URI๋ฅผ ํฌํจํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค.
HTTP 201 Created
- ์์ฒญ์ด ์ฑ๊ณต์ ์ผ๋ก ์ฒ๋ฆฌ๋์์ผ๋ฉฐ, ์๋ก์ด ๋ฆฌ์์ค๊ฐ ์์ฑ๋์์์ ๋ํ๋ธ๋ค.
URI๋ฅผ ์์ฑํ์ฌ ๋ณด๋ด๋ ์ฝ๋
@PostMapping()
public ResponseEntity<CommonResponse<MenuResponseDto>> createMenu(
@RequestBody @Validated CreateMenuRequestDto requestDto) {
MenuResponseDto responseDto = menuService.createMenu(requestDto);
// URI ์์ฑ
URI location = ServletUriComponentsBuilder.fromCurrentContextPath()
.path("/api/menus/" + responseDto.getRmId().toString())
.build()
.toUri();
// Location์ ๋ด์์ ๋ณด๋ด๊ธฐ
return ResponseEntity.created(location)
.body(new CommonResponse<>(SuccessCode.MENU_CREATE, responseDto));
}
< HTTP 201 Created ์๋ต์ URI๋ฅผ ํฌํจํ๋ ์ด์ >
- HTTP 201 Created ์๋ต ํ์ค์ ๋ฐ๋ฅด๋ฉด Location ํค๋์ ์์ฑ๋ ๋ฆฌ์์ค์ URL์ ํฌํจํ๋ ๊ฒ์ด ๊ท์น์ด๋ค.
- ํด๋ผ์ด์ธํธ๊ฐ ์์ฑ๋ ๋ฆฌ์์ค๋ฅผ ์ฝ๊ฒ ์กฐํํ๋๋ก ํ๋ค.
1. HTTP 201 Created ์๋ต ํ์ค
HTTP 201์ ๋ํด์ ๋จ์ํ๊ฒ Location ํค๋์ ์์ฑ๋ ๋ฆฌ์์ค URI๋ฅผ ํฌํจํด์ ๋ณด๋ด์! ๋ก ๋๋๋ฉด ์ข๊ฒ ๋ค.
๊ทผ๋ฐ ์ ํฌํจํด์ ๋ณด๋ด์ผํ๋์ง ๊ถ๊ธํจ.. ์ด์ ์ฐพ๋ค๊ฐ ๋จธ๋ฆฌ๋ง ๋ ๋ณต์กํด์ง๊ธด ํ๋ค.
์์ด๋ก ์ฝ์ด๋, ํ๊ตญ์ด๋ก ์ฝ์ด๋ ์ดํด๊ฐ ์๊ฐ์ AI์ ํ์ ๋น๋ ธ๋ค.
๐ ์ฝ๊ฒ ๋ฒ์ญํ๋ฉด:
์์ฒญ์ ํตํด ์๋ก ๋ง๋ค์ด์ง ์ฃผ์ ๋ฆฌ์์ค(๋ฐ์ดํฐ)๋ ์๋ต์ Location ํค๋ ํ๋์ ์๋ ์ฃผ์(URL) ๋ก ์๋ณ๋ฉ๋๋ค.
๋ง์ฝ Location ํค๋ ํ๋๊ฐ ํฌํจ๋์ง ์์๋ค๋ฉด, ์์ฒญ์ ๋ณด๋ธ ์๋์ ์ฃผ์(URI) ๊ฐ ์ ๋ฆฌ์์ค๋ฅผ ์๋ณํ๋ ์ญํ ์ ํฉ๋๋ค.
Location ํค๋ ํ๋์ ์ฃผ์๊ฐ ์์ผ๋ฉด ๊ทธ๊ฑธ ์์์ ์ฃผ์๋ก ์ธ์ํ๋ ๊ฑด ์๊ฒ ๋ค.
๊ทธ๋ฐ๋ฐ, ํฌํจ๋์ด ์์ง ์์ผ๋ฉด ์๋ ์ฃผ์๋ฅผ ์์์ ์ฃผ์๋ก ์ธ์ํ๋ ๊ฑธ๊น? ๋ฐ๋์ ์ธ์์ ํด์ผํ๋๊ฑด๊ฐ?
โ ๏ธ 1. ์ ์๋ก ์์ฑ๋ ๋ฆฌ์์ค์ ์ฃผ์๋ฅผ ๋ณด๋ด์ผ ํ๋๊ฐ?
=> RESTful API์ ๊ธฐ๋ณธ ์์น
REST API์์๋ ๋ฆฌ์์ค๊ฐ ํน์ ํ URL๋ก ์๋ณ๋์ด์ผ ํ๋ค.
์ฆ, ๋ฐ์ดํฐ๊ฐ ์ด๋์ ์๋์ง(URL)๊ฐ ๋ช
ํํด์ผ ํ๋ค.
โ ๏ธ 2. ์ Location ํค๋๊ฐ ์์ ๋ ์์ฒญํ URL์ด ์ ๋ฐ์ดํฐ์ ์ฃผ์๊ฐ ๋๋ ๊ฑธ๊น?
=> Location ํค๋๊ฐ ์๋ ๊ฒฝ์ฐ, ๊ธฐ์กด ๋ฆฌ์์ค๊ฐ ์
๋ฐ์ดํธ๋๊ฑฐ๋ ๊ฐ๋ณ URL์ด ํ์ํ์ง ์์ ๊ฒฝ์ฐ์ผ ๊ฒ์ด๋ค.
(์. ํ๋กํ ์ฌ์ง์ ์
๋ก๋ํ๋ค๋ฉด ์๋ก์ด ๊ฐ๋ณ ๋ฆฌ์์ค๊ฐ ์์ฑ๋๋ ๊ฒ์ด ์๋๋ผ ๊ธฐ์กด ํ๋กํ์ ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋๋ ๊ฒ์ด๋ฏ๋ก ๊ธฐ์กด ์์ฒญ๊ณผ ๊ฐ์ ์๋ก์ด ์ฃผ์๊ฐ ํ์ํ์ง ์๋ค.
์์ฒญ : POST /api/users/123/profile-picture
์กฐํ : GET /api/users/123/profile-picture
์ด๋ฐ ๊ฐ๋
์ธ ๋ฏํ๋ค. ์์ฒญ ๋ฉ์๋๊ฐ ๋ค๋ฅผ ๋ฟ ๋ฆฌ์์ค ์์ฒญ ์ฃผ์๋ ๊ฐ๋ค?
โ ๏ธ 3. ๊ผญ ๊ทธ ์ฃผ์๋ฅผ ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ์ง๊ณ ์์ด์ผ ํ๋๊ฑด๊ฐ?
์ด ๋ถ๋ถ์ ์์ง๋ ์ดํดํ์ง ๋ชปํ๊ฒ ๋ค. ํด๋ผ์ด์ธํธ๊ฐ ๊ทธ ์ฃผ์๋ฅผ ๊ฐ์ง๊ณ ์๋ ๊ฒ ์๋๋ผ ํ์ํ ๋๋ง๋ค api๋ฅผ ์์ฒญํ๋ ๊ฒ ์๋์๋..?
์๋ฌดํผ
๋ชจ๋ ๊ฒฝ์ฐ์ ์ฃผ์๋ฅผ ํด๋ผ์ด์ธํธ๊ฐ ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ ๊ฒ์ ์๋๊ณ , ์๋ก์ด ๋ฆฌ์์ค์ ์ง์ ์กฐํํ ํ์๊ฐ ์๋ค๋ฉด ๋ณด๋ผ ํ์๊ฐ ์๋ค.
์งํผํฐ๊ฐ ์์๋ฅผ ๋ค์ด์คฌ๋ค.
1.
ํด๋ผ์ด์ธํธ๊ฐ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์์ฑ
1-1.
๊ทธ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ์กฐํํ๊ฑฐ๋ ์์ ํ๋ ค๋ฉด ํด๋ผ์ด์ธํธ๋ ๋ชจ๋ ๋ฆฌ๋ทฐ๋ฅผ ๊ฐ์ง๊ณ ์์ ๊ทธ ์๋ต์์ ๋ฐฉ๊ธ ์์ฑํ ๋ฆฌ๋ทฐ๋ฅผ ์ฐพ์์ผ ํ๋ค. (๊ทธ๋ ๊ฒ ๊ตฌ๋ง.. ์๋ก ์์ฑ๋ ๋ฐ์ดํฐ์ id๋ฅผ ๋ชจ๋ฅด๋๊น..?)
1-2.
์๋ฒ๊ฐ ์๋ก์ด ๋ฐ์ดํฐ์ URI๋ฅผ ํฌํจํ์ฌ ์ฃผ๋ฉด ๊ทธ URI๋ก ๋ฐ๋ก ์ ๊ทผ ๊ฐ๋ฅ!!
2. ํด๋ผ์ด์ธํธ๊ฐ ์์ฑ๋ ๋ฆฌ์์ค๋ฅผ ์ฝ๊ฒ ์กฐํ
์์ฑ๋๋ URI๋ฅผ ๋ณด๋ฉด ์ ํด๋ผ์ด์ธํธ๊ฐ ์ฝ๊ฒ ์กฐํํ ์ ์๋์ง ์ ์ ์๋ค.
์์ ์ฝ๋๋ก ์์ฑ๋ URI์ ์์๋ ์๋์ ๊ฐ๋ค.
GET http://localhost:8080/api/menus/123e4567-e89b-12d3-a456-426614174000
๋ฐฉ๊ธ ์์ฑ๋ ๋ฆฌ์์ค๋ฅผ ์กฐํํ๋ URI๊ฐ ํด๋ผ์ด์ธํธํํ
์์ฑ๋ ์ํ๋ก ์ ๋ฌ๋์๊ธฐ ๋๋ฌธ์
๊ทธ๋๋ก ์์ฒญํด์ ๋ฐฉ๊ธ ์์ฑ๋ ๋ฆฌ์์ค๋ฅผ ํ์ธํ ์ ์๋ค.
์์ฑ๋ ๋ฆฌ์์ค์ id๋ฅผ ๋ณ๋๋ก ํ์ฑํ๋ ๋ฒ๊ฑฐ๋ก์์ ์ค์ผ ์ ์๋ ๊ฒ์ด๋ค.
์ฐธ๊ณ