APIμ λνμ μΈ μν€ν μ²μΈ REST API
μ΄λ»κ² μμ²κ³Ό μλ΅μ νλ κ²μ΄ λ°λμ§ν λ°©λ²μΈκ°?
ππ
REST API
“Representational State Transfer”μ μ½μ
μΉμμ μ¬μ©λλ λ°μ΄ν°λ μμ(Resource)μ HTTP URIλ‘ νννκ³ , HTTP νλ‘ν μ½μ ν΅ν΄ μμ²κ³Ό μλ΅μ μ μνλ λ°©μμ λ§νλ€.
HTTP νλ‘ν μ½μ κΈ°λ°μΌλ‘ μμ²κ³Ό μλ΅μ λ°λΌ 리μμ€λ₯Ό μ£Όκ³ λ°κΈ° μν΄μλ μμ보기 μ½κ³ μ μμ±λ λ©λ΄νμ΄ νμνλ°, μ΄ μν μ APIκ° μνν΄μΌ νλ―λ‘ λͺ¨λκ° μ μμλ³Ό μ μλλ‘ μμ±νλ κ²μ΄ μ€μνλ€.
λ‘μ΄ νλ© (Roy Fielding)μ λ°μ¬νμ λ Όλ¬Έμμ μΉ(http)μ μ₯μ μ μ΅λν νμ©ν μ μλ μν€ν μ²λ‘μ¨ μ²μ μκ°λμλ€.
REST APIλ₯Ό λμμΈνλ λ°©λ²
λ μ€λλ₯΄λ 리차λμ¨(Leonard Richardson)μ REST APIλ₯Ό μ μ μ©νκΈ° μν 4λ¨κ³ λͺ¨λΈ
0λ¨κ³ : HTTP μ¬μ©
1λ¨κ³ : κ°λ³ 리μμ€μ ν΅μ μ€μ
2λ¨κ³ : HTTP λ©μλ μμΉ μ€μ
3λ¨κ³ : HATEOAS μμΉ μ€μ
π μ΄ λͺ¨λ λ¨κ³λ₯Ό μΆ©μ‘±ν΄μΌ REST APIλΌκ³ λ νμ§λ§, μ€μ λ‘λ 2λ¨κ³κΉμ§λ§ μ μ©ν΄λ μ’μ API λμμΈμ΄λΌκ³ λ³Ό μ μκ³ , μ΄λ° κ²½μ°λ₯Ό HTTP APIλΌκ³ λΆλ₯Έλ€.
REST μ±μλ λͺ¨λΈ - 0λ¨κ³
0λ¨κ³μμλ λ¨μν HTTP νλ‘ν μ½μ μ¬μ©νκΈ°λ§ ν΄λ λλ€.
λ¬Όλ‘ μ΄ κ²½μ°, ν΄λΉ APIλ₯Ό REST APIλΌκ³ ν μλ μμΌλ©°, 0λ¨κ³λ REST APIλ₯Ό μμ±νκΈ° μν κΈ°λ³Έ λ¨κ³μ΄λ€.
ν΄λΌμ΄μΈνΈλ μλΉμ€λ³λ‘ μ μΌν URL λμ μ HTTP POST μμ²μ νμ¬ μλΉμ€λ₯Ό νΈμΆνλ€.
μμ²μ ν λλ§λ€ μ΄λ€ μ‘μ μ μνν μ§, κ·Έ λμ(μ: λΉμ¦λμ€ κ°μ²΄)μ 무μμΈμ§ μ§μ νκ³ , νμν 맀κ°λ³μλ ν¨κ» μ λ¬νλ€.
0 λ¨κ³μμλ API μλΉμ€λ₯Ό μν΄ λ¨ νλμ endpoint λ₯Ό μ¬μ©νλ€.
κ·Έλ¦¬κ³ μ λ¬λλ μλ‘ λ€λ₯Έ 맀κ°λ³μλ₯Ό ν΅ν΄μ νλμ endpointλ‘ μ¬λ¬ λμμ νκ² λλ€.
맀κ°λ³μλ₯Ό Body λ‘ μ λ¬νκΈ° μν΄ HTTP method λ POST κ° λλ€.
REST μ±μλ λͺ¨λΈ - 1λ¨κ³
1λ¨κ³μμλ κ°λ³ 리μμ€(Resource)μμ ν΅μ μ μ€μν΄μΌ νλ€.
λͺ¨λ μμμ κ°λ³ 리μμ€μ λ§λ μλν¬μΈνΈ(Endpoint)λ₯Ό μ¬μ©ν΄μΌνλ©° μμ²νκ³ λ°λ μμμ λν μ 보λ₯Ό μλ΅μΌλ‘ μ λ¬ν΄μΌ νλ€λ κ²μ΄ 1λ¨κ³μ ν΅μ¬μ΄λ€.
ν΄λΌμ΄μΈνΈλ μνν μ‘μ κ³Ό 맀κ°λ³μκ° μ§μ λ POST μμ²μ νλ€.
HTTP headers μ Content-Type μ΄λ Cache κ΄λ ¨ μ 보λ₯Ό μ ν μ 곡νκ³ μμ§ μλ€.
β₯ μμ²νλ 리μμ€κ° 무μμΈμ§μ λ°λΌ κ°κΈ° λ€λ₯Έ μλν¬μΈνΈλ‘ ꡬλΆνμ¬ μ¬μ©νλ€.
- μμ½ κ°λ₯ν μκ° νμΈμ΄λΌλ μμ²μ μλ΅μΌλ‘ λ°κ² λλ μμ(리μμ€)μ νμ€μ΄λΌλ μμ¬μ μμ½ κ°λ₯ν μκ°λμ΄λ€.
κ·Έλμ μμ² μ /doctors/νμ€μ΄λΌλ μλν¬μΈνΈλ₯Ό μ¬μ©νλ€.
- νΉμ μκ°μ μμ½νκ² λλ©΄, μ€μ slotsλΌλ 리μμ€μ 123μ΄λΌλ idλ₯Ό κ°μ§ 리μμ€κ° λ³κ²½λκΈ° λλ¬Έμ, νλ¨μ νΉμ μκ°μ μμ½μ΄λΌλ μμ²μμλ /slots/123μΌλ‘ μ€μ λ³κ²½λλ 리μμ€λ₯Ό μλν¬μΈνΈλ‘ μ¬μ©νλ€.
π μ΄λ€ 리μμ€λ₯Ό λ³νμν€λμ§ νΉμ μ΄λ€ μλ΅μ΄ μ 곡λλμ§μ λ°λΌ κ°κΈ° λ€λ₯Έ μλν¬μΈνΈλ₯Ό μ¬μ©νκΈ° λλ¬Έμ, μ μ ν μλν¬μΈνΈλ₯Ό μμ±νλ κ²μ΄ μ€μ!! π μλν¬μΈνΈ μμ± μμλ λμ¬, HTTP λ©μλ, νΉμ μ΄λ€ νμμ λν λ¨μ΄ μ¬μ©μ μ§μνκ³ , 리μμ€μ μ§μ€ν΄ λͺ μ¬ ννμ λ¨μ΄λ‘ μμ±νλ κ²μ΄ λ°λμ§ν λ°©λ²μ΄λ€.
π μμ²μ λ°λ₯Έ μλ΅μΌλ‘ 리μμ€λ₯Ό μ λ¬ν λμλ μ¬μ©ν 리μμ€μ λν μ 보μ ν¨κ» 리μμ€ μ¬μ©μ λν μ±κ³΅/μ€ν¨ μ¬λΆλ₯Ό λ°νν΄μΌ νλ€.
REST μ±μλ λͺ¨λΈ - 2λ¨κ³
CRUDμ λ§κ² μ μ ν HTTP λ©μλλ₯Ό μ¬μ©νλ κ²μ μ€μ μ λλ€.
μμ 0λ¨κ³μ 1λ¨κ³ μμμμλ λͺ¨λ μμ²μ CRUD(Create, Read, Update, Delete)μ μκ΄μμ΄ POST λ©μλλ₯Ό μ¬μ©νκ³ μλλ°, 2λ¨κ³μμλ CRUDμ λ°λ₯Έ μ ν©ν λ©μλλ₯Ό μ¬μ©νλ€!
Resource λ₯Ό URI λ‘ μλ³νκ³ , HTTP method λ₯Ό μ¬μ©ν΄μ CRUD λ₯Ό νννλλ°,
2 λ¨κ³μμλ HTTP method μΈ GET, POST, PUT, DELETE λ₯Ό μ¬μ©ν΄μ CRUD λ₯Ό λνλ΄λ©° λ©μμ§μ Status Code λ λ΄κ²¨ λ°νλλ€. μ±μλ 2 λ¨κ³μμ GET μ μνλ₯Ό λ³νμν€μ§ μλ μμ ν Actionμ΄ λλ€. GET μ μμ νκ² μ΄λ€ μμλ‘λ μΌλ§λ μ§ νΈμΆν μ μκ³ , λ§€λ² κ°μ κ²°κ³Ό(λ©±λ±μ±)λ₯Ό μ»λλ‘ νλ€. μ¦, Cache λ₯Ό μ μ©ν΄μ μ¬μ©μ μ μ₯μμ μ±λ₯ ν₯μμ λλ μ μλ€.
μλΉμ€λ HTTP λμ¬λ₯Ό μ΄μ©ν΄μ μ‘μ μ μννκ³ (μ: GETμ μ‘°ν, POSTλ μμ±, PUTμ μμ ), μμ² μΏΌλ¦¬ 맀κ°λ³μ λ° λ³Έλ¬Έ, νμ μ 맀κ°λ³μλ₯Ό μ§μ νλ€. λλΆμ μλΉμ€λ GET μμ²μ μΊμ±νλ λ± μΉ μΈνλΌλ₯Ό νμ©ν μ μλ€.
μ±μλ 2 λ¨κ³μμλ λ μ΄μ URI μ action μ΄ λ΄κΈ°μ§ μλλ€. κ·Έλ¦¬κ³ λ©±λ±μ±μ 보μ₯νλ GET μλ Cache κ° μ μ©λλ©°, Response μ HTTP Status Code κ° μλ―Έμκ² λ°νλλ€. HTTP Status Code λ₯Ό λͺ¨λ νμ©ν νμλ μλ€.
ν΄λΌμ΄μΈνΈ κ°λ°μμ μ μ₯μμ μμ μ μμ²μ΄ μ±κ³΅(200 OK) μΈμ§ μ€ν¨μΈμ§λ§ μκ³ μΆμ΄νλ κ²½μ°κ° λ§λ€.
μ€ν¨λΌλ©΄ ν΄λΌμ΄μΈνΈ μλͺ»(400 Bad Request) μΈμ§ μλ² μλͺ»(500 Internal Server Error) μ λλ©΄ μΆ©λΆνλ€κ³ νλ€. λ€λ§, μ€ν¨λΌλ©΄ Body μ μ μ€ν¨νλμ§μ λν μ 보λ₯Ό λ³΄λ΄ μ£Όλ κ²μ΄ μ’λ€.
- μμ½ κ°λ₯ν μκ°μ νμΈνλ€λ κ²μ μμ½ κ°λ₯ν μκ°μ μ‘°ν(READ)νλ νμ
β₯ μ‘°ν(READ)νκΈ° μν΄μλ GET λ©μλλ₯Ό μ¬μ©νμ¬ μμ²νλ€.
(μ΄λ GET λ©μλλ bodyλ₯Ό κ°μ§μ§ μκΈ° λλ¬Έμ query parameterλ₯Ό μ¬μ©νμ¬ νμν 리μμ€λ₯Ό μ λ¬νλ€.)
- νΉμ μκ°μ μμ½νλ€λ κ²μ ν΄λΉ νΉμ μκ°μ μμ½μ μμ±(CREATE)νλ€λ κ²
β₯ μμ½μ μμ±(CREATE)νκΈ° μν΄μλ POST λ©μλλ₯Ό μ¬μ©νμ¬ μμ²νλ€.
(POST μμ²μ λν μλ΅μ μλ‘κ² μμ±λ 리μμ€λ₯Ό 보λ΄μ£ΌκΈ° λλ¬Έμ, μλ΅ μ½λλ 201 Created λ‘ λͺ ννκ² μμ±ν΄μΌ νλ€.
κ·Έλ¦¬κ³ κ΄λ ¨ 리μμ€λ₯Ό ν΄λΌμ΄μΈνΈκ° Location ν€λμ μμ±λ URIλ₯Ό ν΅ν΄ νμΈν μ μλλ‘ νλ€. )
<HTTP λ©μλ μ¬μ© κ·μΉ>
- GET λ©μλ κ°μ κ²½μ°λ μλ²μ λ°μ΄ν°λ₯Ό λ³νμν€μ§ μλ μμ²μ μ¬μ©ν΄μΌ νλ€.
- POST λ©μλλ μμ²λ§λ€ μλ‘μ΄ λ¦¬μμ€λ₯Ό μμ±νκ³ PUT λ©μλλ μμ²λ§λ€ κ°μ 리μμ€λ₯Ό λ°ννλ€. μ΄λ κ² λ§€ μμ²λ§λ€ κ°μ 리μμ€λ₯Ό λ°ννλ νΉμ§μ λ©±λ±(idempotent)νλ€κ³ νλ€. κ·Έλ κΈ° λλ¬Έμ λ©±λ±μ±μ κ°μ§λ λ©μλ PUTκ³Ό κ·Έλ μ§ μμ λ©μλPOSTλ ꡬλΆνμ¬ μ¬μ©ν΄μΌ νλ€.
- PUT λ©μλμ PATCH λ©μλλ ꡬλΆνμ¬ μ¬μ©ν΄μΌ νλ€. PUTμ κ΅μ²΄, PATCHλ μμ μ μ©λλ‘ μ¬μ©νλ€.
π APIλ₯Ό μμ±ν λ, REST μ±μλ λͺ¨λΈμ 2λ¨κ³κΉμ§ μ μ©νλ©΄ λ체μ μΌλ‘ μ μμ±λ APIλΌκ³ νλ€.
λ‘μ΄ νλ©μ μμ μ΄μΌκΈ°ν λ°μ κ°μ΄ 3λ¨κ³κΉμ§ λ§μ‘±νμ§ λͺ»ν APIλ REST APIκ° μλ HTTP APIλΌκ³ λΆλ¬μΌ νλ€κ³ μ£Όμ₯νμ§λ§, λͺ¨λ²μ μΈ API λμμΈμ΄λΌκ³ νλ κ²λ REST μ±μλ λͺ¨λΈμ 3λ¨κ³κΉμ§ μ μ©ν κ²½μ°λ λλ¬Όλ€κ³ νλ€.
κ·Έλμ 3λ¨κ³κΉμ§ 무쑰건μ μΌλ‘ λͺ¨λ μ μ©ν΄μΌ νλ κ²μ μλλ€.
<HTTP API λμμΈμ μ νκΈ° μν΄ κΌ κΈ°μ΅ν΄μΌ ν 5κ°μ§ λ©μλ>
REST μ±μλ λͺ¨λΈ - 3λ¨κ³
HATEOAS(Hypertext As The Engine Of Application State)λΌλ μ½μ΄λ‘ ννλλ νμ΄νΌλ―Έλμ΄ μ»¨νΈλ‘€μ μ μ©νλ€.
3λ¨κ³μ μμ²μ 2λ¨κ³μ λμΌνμ§λ§, μλ΅μ 리μμ€μ URIλ₯Ό ν¬ν¨ν λ§ν¬ μμλ₯Ό μ½μ νμ¬ μμ±ν΄μΌ νλ€.
μ΄λ μλ΅μ λ€μ΄κ°κ² λλ λ§ν¬ μμλ μλ΅μ λ°μ λ€μμ ν μ μλ λ€μν μ‘μ λ€μ μν΄ λ§μ νμ΄νΌλ―Έλμ΄ μ»¨νΈλ‘€μ ν¬ν¨νκ³ μλ€.
μλΉμ€λ₯Ό HATEOAS(Hypertext As The Engine Of Application State, μ ν리μΌμ΄μ μν μμ§μΌλ‘μμ νμ΄νΌλ―Έλμ΄) μμΉμ κΈ°λ°νμ¬ μ€κ³νλ€. HATEOASλ GET μμ²μΌλ‘ λ°νλ 리μμ€ νννμ κ·Έ 리μμ€μ λν μ‘μ μ λ§ν¬λ ν¨κ» 보λ΄λ κ²μ΄λ€. κ°λ Ή ν΄λΌμ΄μΈνΈλ GET μμ²μΌλ‘ μ£Όλ¬Έ λ°μ΄ν°λ₯Ό μ‘°ννκ³ μ΄λ λ°νλ ννν λ΄λΆ λ§ν¬λ₯Ό μ΄μ©ν΄μ ν΄λΉ μ£Όλ¬Έμ μ·¨μν μλ μμ΅λλ€. HATEOASλ₯Ό μ¬μ©νλ©΄ νλ μ½λ©ν URLμ ν΄λΌμ΄μΈνΈ μ½λμ μ±μ¬λ£μ§ μμλ λλ€κ³ νλ€.
β₯νμ€μ΄λΌλ μμ¬μ μμ½ κ°λ₯ μκ°μ νμΈν νμλ κ·Έ μκ°λμ μμ½μ ν μ μλ λ§ν¬λ₯Ό μ½μ νκ±°λ, νΉμ μκ°μ μμ½μ μλ£νκ³ λμλ κ·Έ μμ½μ λ€μ νμΈν μ μλλ‘ λ§ν¬λ₯Ό μμ±ν΄ λ£μ μλ μλ€. μ΄λ κ² μλ΅ λ΄μ μλ‘μ΄ λ§ν¬λ₯Ό λ£μ΄ μλ‘μ΄ κΈ°λ₯μ μ κ·Όν μ μλλ‘ νλ κ²μ΄ 3λ¨κ³μ ν΅μ¬ ν¬μΈνΈμ λλ€.
λ§μ½ ν΄λΌμ΄μΈνΈ κ°λ°μλ€μ΄ μλ΅μ λ΄κ²¨ μλ λ§ν¬λ€μ λμ¬κ²¨λ³Έλ€λ©΄, μ΄λ¬ν λ§ν¬λ€μ μ‘°κΈ λ μ½κ³ , ν¨μ¨μ μΌλ‘ 리μμ€μ κΈ°λ₯μ μ κ·Όν μ μκ² νλ μμκ° λ μ μμ΅λλ€.
RESTλ₯Ό ꡬμ±νλ μ€νμΌ
- client-server
- stateless
- cache
- uniform interface
- layered system
- code-on-demand (optional)
μνΈμ΄μ©μ±(interoperability)μ λν μ§μ°©
- Referer μ€νμ§λ§ μ κ³ μΉ¨
- charset μλͺ» μ§μ μ΄λ¦μ΄μ§λ§ μ κ³ μΉ¨
- HTTP μν μ½λ 416 ν¬κΈ°ν¨ (I'm a teapot)
- HTTP/0.9 μμ§λ μ§μν¨ (ν¬λ‘¬, νμ΄μ΄νμ€)
무쑰건 RESTλ₯Ό μ¨μΌνλκ°?
μμ€ν μ 체λ₯Ό ν΅μ ν μ μλ€κ³ μκ°νκ±°λ, μ§νμ κ΄μ¬μ΄ μλ€λ©΄ RESTμ λν΄ λ°μ§λλΌ μκ°λλΉνμ§ λ§λΌ. -by Roy Fielding
μ°Έκ³ )
https://bentist.tistory.com/37
https://github.com/Microsoft/api-guidelines/blob/master/Guidelines.md
https://cloud.google.com/apis/design/resources?hl=ko
π μλͺ»λ κ°λ μ λ¬μ΄ μλ€λ©΄ λκΈ λΆνλ립λλ€. μ μ μ±μ₯μ ν° λμμ΄ λ©λλ€π€
'π¬Computer Science > λ€νΈμν¬' μΉ΄ν κ³ λ¦¬μ λ€λ₯Έ κΈ
TIL) νμ κ΅ν λ°©μκ³Ό ν¨ν· κ΅ν λ°©μ μ°¨μ΄, IP ν¨ν·μ νκ³, TCPμ UDP (0) | 2022.07.13 |
---|---|
CORS μ SOP, CORS λμ λ°©μ, ν리νλΌμ΄νΈ μμ² (Preflight Request) (0) | 2022.06.16 |
TIL) SSRκ³Ό CSR μ°¨μ΄μ , μΉ κ°λ°μμ μ€μν κ°λ (0) | 2022.06.09 |
TIL) AJAX, AJAX μ₯λ¨μ (0) | 2022.06.09 |
TIL) HTTPλ? HTTP Messages, HTTP Requests, HTTP Responses (0) | 2022.06.09 |