λͺ¨λ JS Deep dive #44 | REST API
2022λ 12μ 01μΌ 15:38
REST
π RESTμ λ°°κ²½
RESTλ Representational State TransferλΌλ μ©μ΄μ μ½μλ‘μ 2000λ λμ λ‘μ΄ νλ© (Roy Fielding)μ λ°μ¬νμ λ Όλ¬Έμμ μ΅μ΄λ‘ μκ°λμλ€.
λ‘μ΄ νλ©μ HTTPμ μ£Όμ μ μ μ€ ν μ¬λμΌλ‘ κ·Έ λΉμ μΉ(HTTP) μ€κ³μ μ°μμ±μ λΉν΄ μ λλ‘ μ¬μ©λμ΄μ§μ§ λͺ»νλ λͺ¨μ΅μ μνκΉμνλ©° μΉμ μ₯μ μ μ΅λν νμ©ν μ μλ μν€ν μ²λ‘μ¨ RESTλ₯Ό λ°ννλ€κ³ νλ€.
REST μν€ν μ³λ₯Ό μΉ μν€ν μ³μ€ νλμΈ HTTP νλ‘ν μ½κ³Ό λμΌ μ μμμ ν΄μνλ μλ£κ° λ§μ§λ§ λ‘μ΄ νλ©μ μμνκ² REST μμ€ν μ ꡬμ±νλ λ°©λ²μ λν΄μλ§ μκ°νλ€.
μΉκ³Ό 무κ΄ν REST μμ€ν μ λ³Έμ§μ λ¨Όμ μ΄ν΄νκ³ , HTTP νλ‘ν μ½μ μ΄μ©νμ¬ REST μμ€ν μ μ€κ³νλ λ°©λ²μ λν΄ μ΄ν΄νλ κ²μ λͺ©νλ‘ νμ.
π REST ꡬμ±
RESTλ₯Ό κ°λ¨νκ² λ§νμλ©΄, μ‘΄μ¬νλ μμμ μλ³νκ³ μ μ΄νλ λ°©λ²λ‘ μ΄λ€.
RESTλ μμ(URI), μ μ΄(HTTP μμ² λ©μλ), νν(νμ΄λ‘λ)μΌλ‘ μ΄λ£¨μ΄μ Έμλ€.
-
μμ(Resource): μΌμ΄ μ²λ¦¬λλ λΉμ©μ μλ―Ένλ€. RESTλ μννΈμ¨μ΄ μν€ν μ³ μ΄λ―λ‘ μ»΄ν¨ν° μμμ μλ―Ένλ κ²μ΄λ€. μ»΄ν¨ν° μμμ CPUκ° μννλ λͺ λ Ή, νλλμ€ν¬μ μ μ₯λλ νμΌλ€, λ©λͺ¨λ¦¬μ μ μ₯λλ λ°μ΄ν°λ€μ μλ―Ένλ€.
RESTμ μλ³μ
RESTλ μ»΄ν¨ν° μμμ μ¬μ©νμ¬ μ²λ¦¬νλ νλμ λ¨μ μμ μ μλ³ν μ μμ΄μΌ νκΈ° λλ¬Έμ μλ³μκ° νμνλ€.
μλ₯Όλ€μ΄ TIMESTAMP λ UUID κ°μ μ€λ³΅λμ§ μλ μ 보λ€μ μλ³μλ‘ μ¬μ©ν μ μλ€.
-
μμμ μ μ΄(Methods): CRUD λΌ λΆλ₯΄λ μμ±, μ½κΈ°, λ³κ²½, μμ νμλ₯Ό μμμ μννλ κ²μ μλ―Ένλ€. μ΄λ μ μ΄ λ°©λ²μ μΌκ΄μ μΈ μΈν°νμ΄μ€λ‘ ꡬμ±λμ΄μΌ νλ€(μΌκ΄μ μ΄κ² κ·μΉμ λ°λΌμΌ νλ€).
μλ₯Όλ€μ΄ μΉ κΈ°λ°(HTTP)μ μμ€ν μμ μμμ λ³κ²½μ POST λ©μλλ‘ νλ€λ©΄(PUTμ΄ λ μ΄μΈλ¦΄μ§λΌλ) μμμ λ³κ²½μ POST λ©μλλ‘ μΌκ΄μ μ΄κ² μ²λ¦¬ν΄μΌ νλ€.
-
μμμ νν(Representations): μ‘°νν μκ°μ μμ μνλ₯Ό μλ―Ένλ€.
RESTμ μμμ ννμ μκΈ° μμ μ μΈ(self-descriptive, λ°μ΄ν°λ₯Ό μ€λͺ νλ λ©ν λ°μ΄ν°) λ©μμ§μ HATEOAS(hypermedia as the engine of application state, λ€μ μμμΌλ‘μ μ΄λμ μλ΄νλ νμ΄νΌ ν μ€νΈ λ±μ΄ ν¬ν¨ λλ λ°μ΄ν°)λ‘ κ΅¬μ±λλ€.
REST μμ€ν μ ν΄λΌμ΄μΈνΈκ° μμμ ννλ§ λ³΄λλΌλ μ΄ν΄λλ κ²μ λͺ©νλ‘ νλ€.
π REST-FUL
μ°μ REST μμ€ν μ κ΅¬μ± μμλ λ€μκ³Ό κ°μ΄ 6κ°λ‘ ꡬμ±λλ€.
- Client-Server
- Stateless
- Cacheable
- Unitform-Interface
- Layered-System
- Code on demand (optional)
6κ°μ§ νλͺ©μ λ§μ‘±νλ HTTP REST μμ€ν μ ꡬννλ€κ³ κ°μ ν λ, Unitform-Interface νλͺ©μ μ μΈν λλ¨Έμ§ νλͺ©λ€μ μμ°μ€λ½κ² ꡬνμ΄ λκ±°λ μ‘°κΈλ§ μ κ²½μ μ΄λ€λ©΄ μ΄λ ΅μ§ μκ² κ΅¬νν μ μλ€.
Unitform-Interface νλͺ©μ΄ μ μΈνλ μ΄μ λ Unitform-Interfaceλ₯Ό μ 곡νκΈ° μν΄ μνν΄μΌν νΉμ§ μ€ self-descriptiveκ³Ό HATEOSλ HTTP μμ€ν μμ μμ°μ€λ½κ² μ²λ¦¬ λμ§ μκΈ° λλ¬Έμ΄λ€.
μ¬μ€ self-descriptiveκ³Ό HATEOSμμ±μ λ°μ΄ν°κ° λ 립μ μΌλ‘ μμνκΈ° μν΄ νμν μμλ€μ΄λΌ λ³Ό μ μλ€.
κ·Έλ λ€λ³΄λ HTTPμλ² μ€νμ ꡬνν λ λ°μ΄ν° λ 립μ μΈ μμλ€κΉμ§ μ±κΈ°μ§ μλ κ²½μ°λ λ§μ΅λλ€. νμ§λ§ RESTμ μ² νμ λ°λ₯΄λ―λ‘ RESTμμ€ν μ΄λΌ λΆλ₯΄κ³ μλ€.
RESTμ ꡬμ±μμλ₯Ό μλ²½νκ² μ§ν€μ§ μμ REST μμ€ν μ ꡬλΆνκΈ° μν΄μμΈμ§ RESTμ ꡬμ±μμ (νΉν Unitform-Interface)λ₯Ό μλ²½νκ² μ§ν¨ RESTμμ€ν μ REST-FUL μμ€ν μ΄λΌ λΆλ₯΄κ³ μλ€.
λ‘μ΄ νλ©μ REST μμ€ν μ κ·μΉμ νλλΌλ μ 곡νμ§ μλλ€λ©΄ REST μμ€ν μ΄ μλλΌκ³ μ£Όμ₯νλ€.
μ 리νμλ©΄ REST μμ€ν μΌλ‘ μκ° λκ³ μλ μμ€ν μ Unitfor-Interfaceμ self-descriptive μ HATEOSκ° μ§μΌμ§μ§ μλ κ²½μ°λ λ§μΌλ©°, λλ¨Έμ§ νλͺ©κΉμ§λ μλ²½ν ꡬνν μμ€ν μ REST-FUL νλ€κ³ νν ν©λλ€.
REST API
π REST APIλ
λ§ κ·Έλλ‘ RESTλ₯Ό κΈ°λ°μΌλ‘ μλΉμ€ APIλ₯Ό ꡬνν κ²μ μλ―Ένλ€.
APIλ μ»΄ν¨ν°μ μμ μ μ΄ λ°©λ²μ μ§ν©μ΄κΈ° λλ¬Έμ, REST APIλ REST μμ€ν μ μμ μ μ΄ λ°©λ²μ μ§ν©μΌλ‘ μ μν μ μλ€.
νλ¨κ³ λ λμκ° REST-FUL APIλ RESTμ ꡬμ±μμλ₯Ό μλ²½ν λ°λ₯Έ μμ€ν μ μμ μ μ΄ λ°©λ²μ μ§ν©μ΄λΌ μ μν μ μλ€.
π₯ REST API μ€κ³ μμΉ
REST API μ€κ³μ κ°μ₯ μ€μν κΈ°λ³Έμ μΈ μμΉμ 2κ°μ§λ‘ μμ½ν μ μλ€.
-
첫 λ²μ§Έ, URIλ μ 보μ μμμ ννν΄μΌ νλ€.
GET /members/delete/1 (x)URIλ μμμ νννλλ° μ€μ μ λμ΄μΌ νλ€. deleteμ κ°μ νμμ λν ννμ΄ λ€μ΄κ°μλ μλλ€.
DELETE /members/1 (o) -
λ λ²μ§Έ, μμμ λν νμλ HTTP Method(GET, POST, PUT, DELETE)λ‘ νννλ€. νμμ 보λ₯Ό κ°μ Έμ¬ λλ GET, νμ μΆκ° μμ νμλ₯Ό νννκ³ μ ν λλ POST METHODλ₯Ό μ¬μ©νμ¬ νννλ€.
GET /members/show/1 (x) GET /members/1 (o) GET /members/insert/2 (x) - GET λ©μλλ 리μμ€ μμ±μ λ§μ§ μμ΅λλ€. POST /members/2 (o)METHOD μν νμ΄λ‘λ GET λͺ¨λ /νΉμ 리μμ€λ₯Ό μ‘°ννκ³ ν΄λΉ λνλ¨ΌνΈμ λν μμΈν μ 보λ₯Ό κ°μ Έμ΅λλ€. X POST ν΄λΉ URIλ₯Ό μμ²νλ©΄ 리μμ€λ₯Ό μμ±ν©λλ€. O PUT 리μμ€λ₯Ό μ 체 κ΅μ²΄ν©λλ€. O PATCH 리μμ€μ μΌλΆλ₯Ό μμ ν©λλ€. O DELETE λͺ¨λ /νΉμ 리μμ€λ₯Ό μμ ν©λλ€. X
λ€μκ³Ό κ°μ λ°©μμΌλ‘ URIλ μμμ νννλ λ°μ μ§μ€νκ³ νμμ λν μ μλ HTTP METHODλ₯Ό ν΅ν΄ νλ κ²μ΄ RESTν APIλ₯Ό μ€κ³νλ μ€μ¬ κ·μΉμ΄λ€.
μ°Έκ³ μλ£
μ΄μ λͺ¨, λͺ¨λ μλ°μ€ν¬λ¦½νΈ Deep Dive(μν€λΆμ€, 2020), μ 44μ₯.