๐ RESTfulAPI๋ผ๋ ๊ฒ์?
API ์์คํ ์ ๊ตฌํํ๊ธฐ ์ํ ์ํคํ ์ฒ ์ค์ ๊ฐ์ฅ ๋๋ฆฌ ์ฌ์ฉ๋๋ ํ์์ด๋ค.
Graphql,SOAP,GRPC,REST...etc
๐ Representational State Transfer
์น์์์ ์ฌ์ฉ๋๋ ์ฌ๋ฌ ๋ฆฌ์์ค๋ฅผ HTTP URI๋ก ํํํ๊ณ ๊ทธ ๋ฆฌ์์ค์ ๋ํ ํ์๋ฅผ HTTP Method๋ก ์ ์ ํ๋ ๋ฐฉ์. ์ฆ ๋ฆฌ์์ค(HTTP URI๋ก ์ ์๋)๋ฅผ ์ด๋ป๊ฒ ํ๋ค.(HTTP Method + Payloda)๋ฅผ ๊ตฌ์กฐ์ ์ผ๋ก ๊น๋ํ๊ฒ ํํํ๋ค.
์ restfulAPI๋ฅผ ๋ง์ด ์ฌ์ฉํ๋๊ฐ?
์ฝ๋์ ๋ณต์ก์ฑ์ด ์ฌ๋ผ๊ฐ๋ฉด์ ์ง๊ด์ ์ธ ์ฝ๋๊ฐ ํ์์ ๋๊ธฐ๋๋ฌธ์ JSON์ ์ฌ์ฉํ๋ค.
๐ก ๊ธฐ๋ณธ์ ์ธ ๋ฐฐ๊ฒฝ์ง์
URI(Uniform Resource Identifier)
- ํด๋น์ฌ์ดํธ์ ํน์ ์์์ ์์น๋ฅผ ๋ํ๋ด๋ ์ ์ผํ ์ฃผ์
HTTP Method
- HTTP request๊ฐ ์๋ํ๋ action์ ์ ์ํ ๊ฒ
Payload
- HTTP request์์ server๋ก ๋ณด๋ด๋ ๋ฐ์ดํฐ(body)
๐ RestfulAPI ์ค๊ณ๊ท์น
URI ์ ๋ณด๋ฅผ ๋ช ํํ๊ฒ ํํํด์ผํ๋ค.
- : resource๋ ๋ช
์ฌ๋ฅผ ์ฌ์ฉํ์ผ ํ๋ค.**
ex) GET/user/1 -> GET/users/1
- : resource๋ ๋ช
์ฌ๋ฅผ ์ฌ์ฉํ์ผ ํ๋ค.**
resource์ ๋ํ ํ์๋ฅผ HTTP Method(GET, POST, PUT, DELETE)๋ก ํํํ๋ค.
: URI์ HTTP Method๊ฐ ํฌํจ๋์๋ ์๋๋ค.
ex) GET delete/user/1 -> DELETE/users/1:URI์ ๋์ฌ๊ฐ ํฌํจ๋์๋ ์๋๋ค.
ex) GET/user/show/1 -> GET/users/1
ex) POST insert/users/2 -> POST/users/2resource ์ฌ์ด์ ์ฐ๊ด ๊ด๊ณ๊ฐ ์๋ ๊ฒฝ์ฐ
: /๋ฆฌ์์ค/๊ณ ์ ID/๊ด๊ณ ์๋ ๋ฆฌ์์ค
ex)GET/users/{user_id}/profileํ์ผ์ ๊ฒฝ์ฐ payload์ ํฌ๋ฉง์ ๋ํ๋ด๊ธฐ ์ํ ํ์ผ ํ์ฅ์๋ฅผ URI์ ํฌํจ์ํค์ง ์๋๋ค.
ex) GET user/1/profile-photo.jpg(X)
ex) GET user/profile-photo (์ด๋, payload์ ํฌ๋ฉง์ headers์ accept๋ฅผ ์ฌ์ฉํ๋ค.)
๐ Path parameter
๋ค์ ๋ฆฌ์คํฐ์ค๋ก ๋น์ด์๋ DB์์ ๋ฐ์ดํฐ๊ฐ ๋ค์ด๊ฐ๋ฉด์ ๋ฌด๋์ฝ๊น ์๊ฐ์ด ๋ค์ด๊ฐ๊ฒ ๋๋ค. ์์ ์ ๊ด๋ จ๋ ๋ฉ์๋๋ผ๊ณ ํ ์ ์๋ค. PATCH PUT ๋๋ค ์์ ์ ๊ด๋ จ๋ API
๐ PUT vs PATCH
PUT๊ณผ PATCH๋ ๋๋ค ๋ฐ์ดํฐ ์์ ์ ์ํ ๋ฉ์๋์ด๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด ๋๊ฐ์ง๋ ์ด๋ ํ ์ฐจ์ด์ ์ด ์์๊น?
- PATCH, which is used to apply partial modifications to a resource
- PUT method requests that the state of the target resource be created or replaced with the state defined by the representation enclosed in the request message payload
์์๋ก, PUT์์ฒญ์์ ์์ฒญ์ ์ผ๋ถ๋ถ๋ง ๋ณด๋ธ๊ฒฝ์ฐ ๋๋จธ์ง๋ default๊ฐ์ผ๋ก ์์ ๋๋ ๊ฒ์ด ์์น์ด๋ค. ๋ฐ๋ผ์ ๋ฐ๋์ง ์๋ ์์ฑ๋ ๋ชจ๋ ๋ณด๋ด์ผํ๋ค.
๋ ๋ค๋ฅธ ์์๋ก, PUT HTTP ๋ฉ์๋๋ก camille๋ผ๋ ์ ์ ์ ๋์ด(age)๋ฅผ 15๋ก ๋ณ๊ฒฝํ๊ณ ์ ํ ๋ ์์ ๋ ๊ฐ๋ง ๋ณด๋ผ ๊ฒฝ์ฐ ๋ณด๋ด์ง ์์ ๋ฐ์ดํฐ๋ null๋ก ๋ณ๊ฒฝ๋์ด ๋ฒ๋ฆฐ๋ค.
PUT/users/1
{
"age":15
}
HTTP/1.1 200 ok
{
"name" : null,
"age" : 15
}
๋ฐ๋ผ์ PUT์์ฒญ์์๋ ์๋์ ๊ฐ์ด ๋ณ๊ฒฝ๋์ง ์๋ ๋ฐ์ดํฐ๋ผ๋ ๋ชจ๋ ์ ๋ฌ ํด์ผํ๋ค.
PUT/users/1
{
"name" : camille,
"age": 15
}
HTTP/1.1 200 ok
{
"name" : camille,
"age" : 15
}
๊ทธ๋ฌ๋ PATCH๋ฅผ ์ด์ฉํด์ 'age'๋ง ๋ณ๊ฒฝํ๋ ์์ฒญ์ ๋ณด๋ด๋ฉด, ์๋กญ๊ฒ ๋ฐ๋ ๋ถ๋ถ๋ง ๋ฐ์๋๋ฉฐ ๋๋จธ์ง๋ ๊ธฐ์กด์ ๋ฐ์ดํฐ๊ฐ ์ ์ง๋๋ค.
PATCH/users/1
{
"age": 15
}
HTTP/1.1 200 ok
{
"name" : camille,
"age" : 15
}
๋ฐ๋ผ์ ์ผ๋ถ ์์์ ์์ ํ ๋๋ PATCH๋ฅผ ์ ์ฒด์ ์ธ ์์ ์ด ํ์ํ ๋๋ PUT ์ ์ด์ฉํ๋ค.
๐ GET vs POST
๐ Get
GET method๋ ํด๋ผ์ด์ธํธ์์ ์๋ฒ๋ก ์ด๋ ํ ๋ฆฌ์์ค๋ก ๋ถํฐ ์ ๋ณด๋ฅผ ์์ฒญํ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๋ฉ์๋์ด๋ค. ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฑฐ๋(Read), ๊ฒ์(Retrieve)ํ ๋์ ์ฌ์ฉ๋๋ method๋ผ๊ณ ํ ์ ์๋๋ฐ,
GET์ ์์ฒญ์ ์ ์กํ ๋ URL ์ฃผ์ ๋์ ํ๋ผ๋ฏธํฐ๋ก ํฌํจ๋์ด ์ ์ก๋๋ฉฐ, ์ด ๋ถ๋ถ์ ์ฟผ๋ฆฌ ์คํธ๋ง(QueryString)์ด๋ผ๊ณ ๋งํ๋ค.
ex) www.example-url.com/resources?name1=Camille&name2=Bbachon
์ ์๋ ์์ ๋งํ ์ฟผ๋ฆฌ์คํธ๋ง์ ํฌํจํ URL์ ๋๋ค. ํ๋ผ๋ฏธํฐ์ธ name1๊ณผ name2๋ฅผ ํตํด ๊ฐ์ ์ ๋ฌ๋ฐ์ ์ ์๋๋ฐ, ๋ง์ฝ, ์์ฒญ ํ๋ผ๋ฏธํฐ๊ฐ ์ฌ๋ฌ ๊ฐ์ด๋ฉด &๋ก ์ฐ๊ฒฐํ๋ค.
๋, GET ์์ฒญ์ ์ค๋ก์ง ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ๋๋ง ์ฌ์ฉ๋๊ณ ์์ ํ ๋๋ ์ ํ ์ฌ์ฉ๋์ง ์๊ธฐ ๋จ๋ฌธ์ ๋ฐ์ดํฐ ๋ณํ์ ์ํ์ด ์์ด ์ฌ์ฉํ ์ ์๋ค.
๐ GET ์์ฒญ์ ๋ํ ๊ธฐํ ์ฐธ๊ณ ์ฌํญ
GET์ ๋ถํ์ํ ์์ฒญ์ ์ ํํ๊ธฐ ์ํด ์์ฒญ์ด ์บ์๋ ์ ์๋ค.
๋ฐ๋ผ์, ํ๋ผ๋ฏธํฐ์ ๋ด์ฉ์ด ๋
ธ์ถ๋๊ธฐ ๋๋ฌธ์ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋ GET ์์ฒญ์ ์ฌ์ฉํ๋ฉด ์๋๋ค.
- GET ์์ฒญ์ ๋ธ๋ผ์ฐ์ ๊ธฐ๋ก์ ๋จ๋๋ค.
- ๋ถ๋งํฌ์ ์ถ๊ฐํ ์ ์๋ค.
- ๋ฐ์ดํฐ ๊ธธ์ด์ ๋ํ ์ ํ์ด ์๋ค.
- ์ฑ๊ณต์, 200(Ok) HTTP ์๋ต ์ฝ๋๋ฅผ XML, JSON๋ฟ๋ง ์๋๋ผ ์ฌ๋ฌ ๋ฐ์ดํฐ(html, txt๋ฑ..), ์ฌ๋ฌ ํ์์ ๋ฐ์ดํฐ์ ํจ๊ป ๋ฐํํ๋ค.
- GET ์์ฒญ์ idempotentํ๋ค.
๐ Post
POSTmethod๋ ๋ฆฌ์์ค๋ฅผ ์์ฑ/์ ๋ฐ์ดํธํ๊ธฐ ์ํด ์๋ฒ์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๋ด๋ ๋ฐ ์ฌ์ฉ๋๋ค.
GET๊ณผ ๋ฌ๋ฆฌ ์ ์กํด์ผ๋ ๋ฐ์ดํฐ๋ฅผ HTTP ๋ฉ์ธ์ง์ Body์ ๋ด์์ ์ ์กํ๋๋ฐ, ๊ทธ Body์ ํ์ ์ ์์ฒญ ํค๋์ Content-Type์ ์์ฒญ ๋ฐ์ดํฐ์ ํ์ ์ ํ์ ๋ฐ๋ผ ๊ฒฐ์ ๋๋ค.(POST๋ก ์์ฒญ์ ๋ณด๋ผ ๋๋ ํด์ผ ํ๋ค!!)
HTTP ๋ฉ์ธ์ง์ Body๋ ๊ธธ์ด์ ์ ํ์์ด ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ์ ์๊ธฐ ๋๋ฌธ์ POST ์์ฒญ์ GET๊ณผ ๋ฌ๋ฆฌ ๋์ฉ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ์ ์๋ค.
์์์ ์ธ๊ธํ๋ ๊ฒ ์ฒ๋ผ POST๋ ๋ฐ์ดํฐ๊ฐ Body๋ก ์ ์ก๋๊ณ , ๋ด์ฉ์ด ๋์ ๋ณด์ด์ง ์์ GET๋ณด๋ค ๋ณด์์ ์ธ ๋ฉด์์ ์์ ํ๋ค๊ณ ์๊ฐํ ์ ์์ง๋ง, POST ์์ฒญ๋ ํฌ๋กฌ์ ๊ฐ๋ฐ์ ๋๊ตฌ, Fiddler์ ๊ฐ์ ํด๋ก ์์ฒญ ๋ด์ฉ์ ํ์ธํ ์ ์๊ธฐ ๋๋ฌธ์ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ์๋ ๋ฐ๋์ ์ํธํํด ์ ์กํด์ผํ๋ค.
๐ Post ์์ฒญ์ ๋ํ ๊ธฐํ ์ฐธ๊ณ ์ฌํญ
POST ์์ฒญ์ ์บ์๋์ง ์๋๋ค.
- ๋ธ๋ผ์ฐ์ ๊ธฐ๋ก์ ๋จ์ ์์ง ์์ต๋๋ค.
- ๋ถ๋งํฌ์ ์ถ๊ฐํ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ๊ธธ์ด์ ๋ํ ์ ํ์ด ์์ต๋๋ค.
- ์์ ์์ฑ์ 201(Created) HTTP ์๋ต ์ฝ๋๋ฅผ ๋ฐํํฉ๋๋ค.
- Post ์์ฒญ์ idempotentํ์ง ์์ต๋๋ค.
idempotent๋?
idempotent๋์ฐ์ฐ์ ์ฌ๋ฌ ๋ฒ ์ ์ฉํ๋๋ผ๋ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง์ง ์๋ ์ฑ์ง์ ์๋ฏธํ๋ค.
"์ฐ์ฐ์ ์ฌ๋ฌ ๋ฒ ์ ์ฉํ๋๋ผ๋ ๊ฒฐ๊ณผ๊ฐ ๋ฌ๋ผ์ง์ง ์๋ ์ฑ์ง"
๋์ผํ ์ฐ์ฐ์ ์ฌ๋ฌ ๋ฒ ์ํํ๋๋ผ๋ ๋์ผํ ๊ฒฐ๊ณผ๊ฐ ๋ํ๋์ผ ํ๋ค.
GET์ Idempotent, POST๋ Non-idempotentํ๊ฒ ์ค๊ณ๋์๋ค.
์ฌ๊ธฐ์ GET์ด Idempotentํ๋๋ก ์ค๊ณ๋์๋ค๋ ๊ฒ์ GET์ผ๋ก ์๋ฒ์๊ฒ ๋์ผํ ์์ฒญ์ ์ฌ๋ฌ ๋ฒ ์ ์กํ๋๋ผ๋ ๋์ผํ ์๋ต์ด ๋์์์ผ ํ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ค. ๋, ์ด์ ๋ฐ๋ผ GET์ ์ค๊ณ์์น์ ๋ฐ๋ผ ์๋ฒ์ ๋ฐ์ดํฐ๋ ์ํ๋ฅผ ๋ณ๊ฒฝ์ํค์ง ์์์ผ Idempotentํ๊ธฐ ๋๋ฌธ์ ์ฃผ๋ก ์กฐํ๋ฅผ ํ ๋์ ์ฌ์ฉํด์ผํ๋ค.
์๋ฅผ ๋ค์ด, ๋ธ๋ผ์ฐ์ ์์ ์นํ์ด์ง๋ฅผ ์ด์ด๋ณด๊ฑฐ๋ ๊ฒ์๊ธ์ ์ฝ๋ ๋ฑ ์กฐํ๋ฅผ ํ๋ ํ์๋ GET์ผ๋ก ์์ฒญํ๊ฒ๋๋ค๊ณ ๋ณผ ์ ์๋ค.
'DEV' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
React : JSX (2) | 2024.10.28 |
---|---|
์ฑ๊ธ ํ์ด์ง ์ ํ๋ฆฌ์ผ์ด์ (SPA)์์ ์ฑ๋ฅ ์ต์ ํ: ์ง์ฐ ๋ก๋ฉ(Lazy Loading) ํ์ฉํ๊ธฐ (1) | 2024.10.24 |
Codekata | 03 (1) | 2024.10.20 |
Codekata | 02 (0) | 2024.10.20 |
CodeKata | 01 (0) | 2024.10.20 |