REST API
Last updated
Last updated
APIλ Application Programming Interfaceμ μ½μλ‘ μμ© νλ‘κ·Έλ¨μμ μ¬μ©ν μ μλλ‘, μ΄μ체μ λ νλ‘κ·Έλλ° μΈμ΄κ° μ 곡νλ κΈ°λ₯μ μ μ΄ν μ μκ² λ§λλ μΈν°νμ΄μ€λ₯Ό λ»νλ€.μ£Όλ‘ νμΌ μ μ΄, μ°½ μ μ΄, νμ μ²λ¦¬, λ¬Έμ μ μ΄ λ± μμ μ΄ μνλ κΈ°λ₯μ μ μ΄ν μ μλλ‘ νλ μΈν°νμ΄μ€λ₯Ό μ 곡νλ€. λ°λΌμ μνλ κΈ°λ₯μ μ μ΄νλ APIλ₯Ό μ§μ λ§λ€ μλ μλ€.β
μΉ μλ² λλ μΉ λΈλΌμ°μ λ₯Ό μν μ ν리μΌμ΄μ νλ‘κ·Έλλ° μΈν°νμ΄μ€μ΄λ€. HTTP μλΉμ€μ΄κ³ λ€μν ν΄λΌμ΄μΈνΈμμ μ κ·Όμ΄ κ°λ₯νλλ‘ μ€κ³λμ΄μλ€. Web νκ²½μ ν΅ν΄ μ 곡λλ λ°μ΄ν° CRUD μΈν°νμ΄μ€λ₯Ό μ 곡νλ€.HTTP νμ€ μ κ·Ό λ°©μμ μ΄μ©νλ©° νλ«νΌ νκ²½, ν΄λΌμ΄μΈνΈ νκ²½μ μ νμ΄ μλ μλΉμ€ ꡬνμ΄ κ°λ₯νλ€.
RESTλ Representational State Transferμ μ½μμ΄λ€. μμμ URIλ‘ νμνκ³ ν΄λΉ μμμ μνλ₯Ό μ£Όκ³ λ°λ κ²μ μλ―Ένλ€. RESTλ νλ‘ν μ½μ΄λ νμ€μ΄ μλ μν€ν μ² μμΉ μΈνΈμ΄λ©° API κ°λ°μλ RESTλ₯Ό λ€μν λ°©μμΌλ‘ ꡬνν μ μλ€.
μμ(Resource): URI
λͺ¨λ μμμ κ³ μ ν IDκ° μ‘΄μ¬νκ³ , μ΄ μμμ Serverμ μ‘΄μ¬νλ€.
μμμ ꡬλ³νλ IDλ /orders/order_id/1 μ κ°μ HTTP URI μ΄λ€.
νμ(Verb): HTTP Method
HTTP νλ‘ν μ½μ Methodλ₯Ό μ¬μ©νλ€.
HTTP νλ‘ν μ½μ GET, POST, PUT, DELETEμ κ°μ λ©μλλ₯Ό μ 곡νλ€.
νν(Representations) : HTTP Message Payload
Clientκ° μμμ μν (μ 보)μ λν μ‘°μμ μμ²νλ©΄ Serverλ μ΄μ μ μ ν μλ΅ (Representation)μ 보λΈλ€.
RESTμμ νλμ μμμ JSON, XML, TEXT, RSS λ± μ¬λ¬ ννμ RepresentationμΌλ‘ λνλΌ μ μλ€. (νμ¬λ JSONμΌλ‘ μ£Όκ³ λ°λ κ²μ΄ λλΆλΆμ΄λ€.)
λ°λΌμ, RESTλ URIλ₯Ό ν΅ν΄ μμμ νμνκ³ HTTP METHODλ₯Ό μ΄μ©νμ¬ ν΄λΉ μμμ νμλ₯Ό μ ν΄μ£Όλ©° κ·Έ κ²°κ³Όλ₯Ό λ°λ κ²μ λ§νλ€.
Method
CRUD
SQL
μ€λͺ
POST
Create
INSERT
μμ±
GET
Read
SELECT
μ½κΈ°
PUT
Update
UPDATE
κ°±μ
DELETE
Delete
DELETE
μμ
β
RESTλ₯Ό RESTλ΅κ² μ°κΈ° μν λ°©λ²μΌλ‘ 곡μμ μ΄μ§ μμ κ°λ°μλ€μ΄ λΉκ³΅μμ μΌλ‘ μ μν κ²μ΄λ€. μ΄ν΄νκΈ° μ½κ³ μ¬μ©νκΈ° μ¬μ΄ REST APIλ₯Ό λ§λλ κ²μ΄ λͺ©μ .HTTPμ URI κΈ°λ°μΌλ‘ μμμ μ κ·Όν μ μλλ‘ μ 곡νλ μ ν리μΌμ΄μ κ°λ° μΈν°νμ΄μ€μ΄λ€. κΈ°λ³Έμ μΌλ‘ κ°λ°μλ HTTP λ©μλμ URI λ§μΌλ‘ μΈν°λ·μ μλ£λ₯Ό CRUD ν μ μλ€.
CRUDμ κΈ°λ₯μ μ λΆ νμ©ν΄μΌνλ€. (μ. POSTλ‘λ§ λͺ¨λ κ²μ μ²λ¦¬νλ©΄ RESTfulμ΄ μλλ€.)
URIμ resourceκ³Ό idμΈ μ λ³΄λ§ λ€μ΄κ°μΌνλ€. (μ. "/students/updateName"μ RESTfulμ΄ μλλ€.)
μμΈν μ€λͺ μ μλ μ¬μ΄νΈ μ°Έκ³
[URL]
νλ‘ν μ½: http, https, ftp λ±
νΈμ€νΈλ€μ: λλ©μΈ or IP (μλ²μ»΄ν¨ν°μ μ΄λ¦ - μμΉ)
URL path: μλ²μ»΄ν¨ν°(host)μμ ν΄λΌμ΄μΈνΈκ° μμ²ν νμΌ λλ ν 리
쿼리: μΆκ°μ μ§λ¬Έμ¬ν
[URI]
Identifier: μλ³μ, μμ μλ³μ, idκ°(index)
URIκ° URLμ ν¬ν¨
μμ: http://localhost/article/7 -> article(μλ₯Ό λ€μ΄ db ν μ΄λΈ μ΄λ¦)μ΄λΌλ dbμ μ μ₯λ λ°μ΄ν° 7λ²μ§Έ κ²μ λνλ
μ¦, URLμ μλ²μ»΄ν¨ν°μμ ν΄λΌμ΄μΈνΈκ° μμ²ν νμΌμ λλ ν 리λ₯Ό λνλ΄μ§λ§ URIλ μμμ κ³ μ μλ³μ(idκ°)μ΄λ€.β
1.μ μ κ° ID/PW λ₯Ό μ λ ₯νλ€. (POST /authenticate username=***&password=***)
2.μλ²λ request κ° λ€μ΄μ€λ©΄ μ°λλ κ³μ DBλ₯Ό 쿼리νμ¬ μ μ λ₯Ό κ²μ¦νκ³ , μ ν¨ν μ μ λΌλ©΄ μΈμ μ μμ±νκ³ μΈμ μ 보λ₯Ό response ν€λμ ν¬ν¨μμΌ λ°ννλ€.
3.ν΄λΌμ΄μΈνΈλ μ νλ end points μ μ κ·Όν λ λͺ¨λ request header μ λ°νλ°μ μΈμ μ 보λ₯Ό ν¬ν¨μν¨λ€.
4.λ§μ½ μΈμ μ λ³΄κ° μ ν¨νλ©΄, μλ²λ μ μ κ° νΉμ end point μ μ κ·Όνλ κ²μ νμ©νκ³ λ λλ§λ HTML λ΄μ©μ λ°ννλ€.
μ΄λ¬ν μ ν΅μ μΈ μΈμ¦ μμ€ν μ λ¬Έμ κ° μμλ€. μΉ μ΄ν리μΌμ΄μ μ μ λμνκ³ , μ¬μ©μ μΈμ¦μ κ±°μ³ νΉμ end point λ‘μ μ κ·Όμ μ νν μ μλ€. νμ§λ§ μ ν΅μ μΈ μΈμ¦ λ°©μμΌλ‘ λμνλ μ΄ν리μΌμ΄μ μ λͺ¨λ°μΌ ν΄λΌμ΄μΈνΈ(μλλ‘μ΄λ λ±)μμ λμΌνκ² μ¬μ©ν μ μλ€λ λ¬Έμ κ° μλ€. μ΄μ λ μλμ κ°λ€.
μΈμ κ³Ό μΏ ν€λ λͺ¨λ°μΌ μ΄ν리μΌμ΄μ μμ make sense νμ§ μλ€. μλ²μμ μμ±λ μΈμ κ³Ό μΏ ν€λ₯Ό λͺ¨λ°μΌ ν΄λΌμ΄μΈνΈμμλ 곡μ ν μ μλ€.
νμ¬ μ΄ν리μΌμ΄μ μμ λ λλ§λ HTML μ΄ λ°ν λμμΌλ, λͺ¨λ°μΌ ν΄λΌμ΄μΈνΈμμλ JSON λλ XML κ³Ό κ°μ ν¬λ§·μ μλ΅μ΄ νμνλ€.
μ¦ μ΄λ¬ν κ²½μ°, ν΄λΌμ΄μΈνΈ λ 립μ μΈ μ΄ν리μΌμ΄μ μ΄ νμνλ€. (ν΄λΌμ΄μΈνΈμ μ’ λ₯μ λ°λΌ μ΄ν리μΌμ΄μ μ κ°λ°νλ κ²μ΄ μλλΌ, ν΄λΌμ΄μΈνΈμ μ’ λ₯μ μκ΄μμ΄ λμΌν λμμ ν μ μλ μ΄ν리μΌμ΄μ μ΄ νμνλ€λ μλ―Έμ΄λ€. )β
ν ν° κΈ°λ° μΈμ¦μμλ μΏ ν€μ μΈμ μ΄ μ¬μ©λμ§ μλλ€. ν ν°μ μλ²λ‘μ λͺ¨λ request μ λν΄ μ μ λ₯Ό μΈμ¦νκΈ° μν΄ μ¬μ©λλ€. μ ν΅μ μΈ μΈμ¦ μμ€ν μμμ μΈμ¦ μλ리μ€λ₯Ό ν ν° κΈ°λ° μΈμ¦ μμ€ν μΌλ‘ μ¬μ€κ³νλ©΄ μλμ κ°λ€.
1.μ μ κ° ID/PW λ₯Ό μ λ ₯νλ€ (POST /authentication username=***&password=***)
2.μλ²λ request κ° λ€μ΄μ€λ©΄ μ°λλ κ³μ DBλ₯Ό 쿼리νμ¬ μ μ λ₯Ό κ²μ¦νκ³ , μ ν¨ν μ μ λΌλ©΄ ν ν°μ μμ±νκ³ ν ν° μ 보λ₯Ό response ν€λμ ν¬ν¨μμΌ λ°ννλ€. μ΄λ‘ μΈν΄, μ μ λ local storage μ ν ν°μ μ μ₯ν μ μλ€.
3.ν΄λΌμ΄μΈνΈλ μ νλ end points μ μ κ·Όν λ λͺ¨λ request header μ λ°νλ°μ ν ν° μ 보λ₯Ό ν¬ν¨ μν¨λ€.
4.λ§μ½ ν ν° μ λ³΄κ° μ ν¨νλ©΄, μλ²λ μ μ κ° νΉμ end point μ μ κ·Όνλ κ²μ νμ©νκ³ json λν xml ν¬λ§·μΌλ‘ μλ΅νλ€.
ν ν° κΈ°λ° μΈμ¦ μμ€ν μ μμ μ€ν€λ§λ λ€μκ³Ό κ°λ€.
1.μΉ μ΄ν리μΌμ΄μ μ΄λ λͺ¨λ°μΌ ν΄λΌμ΄μΈνΈ λ±μμ API μ λν request κ° μμ±λλ€.
2.request λ μλΉμ€λ‘ μ λ¬ λκ³ , λ§μ request κ° μμ±λλ©΄ λ€μ μλ²κ° νμνλ€.
3.λ€μ μλ² μ€ κ°μ₯ μ ν©ν μλ²λ‘ request λ₯Ό μ λ¬νκΈ° μν΄ LB(Load Balencer)κ° μ¬μ©λλ€. request κ° λ°μνλ©΄, LB κ° request λ₯Ό μ μ΄νκ³ νΉμ μλ²(κ°μ₯ μ ν©ν)λ‘ request λ₯Ό redirect μν¨λ€.
4.νλμ μ΄ν리μΌμ΄μ μ μ¬λ¬ μλ²λ‘ λ°°μΉλλ€. request κ° μμ±λ λλ§λ€ λ°±μλ μ΄ν리μΌμ΄μ μ request header λ₯Ό κ°λ‘μ±μ authentication header λ΄μ ν ν° μ 보λ₯Ό μΆμΆν΄λ΄κ³ , DB 쿼리λ ν΄λΉ ν ν°μ μ¬μ©νμ¬ μνλλ€. λ§μ½ ν ν°μ΄ μ ν¨νκ³ end point μ κ·Ό κΆνμ κ°μ§κ³ μλ€λ©΄ μλΉμ€κ° μ 곡λκ³ , κ·Έλ μ§ μλ€λ©΄ 403 response (forbidden status) λ₯Ό λ°ννλ€.
β
2xx μ±κ³΅
200: ν΄λΌμ΄μΈνΈμ μμ²μ μ μμ μΌλ‘ μνν¨.
201: ν΄λΌμ΄μΈνΈμκ² μμ± μμ μ μμ² λ°μκ³ , μμ± μμ μ μ±κ³΅ν¨.
204: μμ²μ μ±κ³΅ νμ§λ§ μλ΅ν μ½ν μΈ κ° μμ.
3xx 리λ€μ΄λ μ
301: ν΄λΌμ΄μΈνΈκ° μμ²ν 리μμ€μ λν URIκ° μꡬμ μΌλ‘ λ³κ²½λμμ λ μ¬μ©ν¨.
302: 301κ³Ό κ°μΌλ μμμ μΌλ‘ μ£Όμκ° λ°λμμ κ²½μ° μ¬μ©ν¨.
304: μ΄μ μ λ°©λ¬Ένμ λμ μμ² κ²°κ³Όμ λ€λ₯΄μ§ μμ κ²½μ° μ¬μ©ν¨. μΊμλ νμ΄μ§λ₯Ό κ·Έλλ‘ μ¬μ©.
307: μμ νμ΄μ§λ‘ 리λ€μ΄λ νΈ.
4xx ν΄λΌμ΄μΈνΈ μ€λ₯
400: ν΄λΌμ΄μΈνΈκ° μ¬λ°λ₯΄μ§ λͺ»ν μμ²μ 보λ.
401: λ‘κ·ΈμΈμ νμ§ μμ νμ΄μ§λ₯Ό μ΄ κΆνμ΄ μμ.
403: κΈμ§λ νμ΄μ§, λ‘κ·ΈμΈμ νλ μνλ μ κ·Όν μ μμ. (κ΄λ¦¬μ νμ΄μ§)
404: μ°Ύμ μ μλ νμ΄μ§, μ£Όμλ₯Ό μ λͺ» μ λ ₯νμ λ μ¬μ©ν¨.
403 λμ μ μ¬μ©ν μλ μμ.(ν΄μ»€λ€μ 곡격μ λ°©μ§νκ³ μ νμ΄μ§κ° μλ κ²μ²λΌ μμ₯ν¨)
408: μμ² μκ°μ΄ μ΄κ³Όλ¨.
409: μλ²κ° μμ²μ μ²λ¦¬νλ κ³Όμ μμ μΆ©λμ΄ λ°μν κ²½μ°. (νμκ°μ μ€ μ€λ³΅λ μμ΄λμΈ κ²½μ°)
410: μꡬμ μΌλ‘ μ¬μ©ν μ μλ νμ΄μ§.
5xx μλ² μ€λ₯
501: ν΄λΉ μμ²μ μ²λ¦¬νλ κΈ°λ₯μ΄ λ§λ€μ΄μ§μ§ μμ.
502: μλ²λ‘ κ°λ₯ μμ²μ΄ μ€κ°μμ μ μ€λ κ²½μ°.
503: μλ²κ° ν°μ‘κ±°λ μ μ§ λ³΄μ μ€ (μ μ§ λ³΄μ μ€μΌλλ μ μ§ λ³΄μμ€μ΄λΌλ κ²μ μλ €μ£Όλ νμ΄μ§λ‘ μ μ‘ν΄μ£Όλ κ²μ΄ μ’μ)
504: μλ² κ²μ΄νΈμ¨μ΄μ λ¬Έμ κ° μ겨 μκ° μ΄κ³Όκ° λ κ²½μ°.
505: HTTP λ²μ μ΄ λ¬λΌ μμ²μ΄ μ²λ¦¬ν μ μμ.
ββ