λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ’» DEV/Computer Science

[CS] REST API κ°œμš”

by vodkassi 2021. 11. 4.
728x90

✨  REST API  κ°œμš” 

REST API λŠ” Representational State Transfer API 의 μ•½μžμ΄λ‹€. REST 와 API λŠ” λ”°λ‘œ κ΅¬λΆ„ν•΄μ„œ μƒκ°ν•˜λ©΄ 쒋은데, REST λŠ” ν•˜λ‚˜μ˜ 아킀텍쳐 (방법둠) 에 가깝닀. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— λͺ‡ 가지 μ£Όμš” 원칙듀이 μ‘΄μž¬ν•˜λ©°, 이λ₯Ό 잘 지킨 API λ₯Ό "RESTful" ν•˜λ‹€κ³  ν‘œν˜„ν•œλ‹€. API λŠ” Application Programming Interface 의 μ•½μžλ‘œ, μ„œλ²„κ°€ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ μ œκ³΅ν•˜λŠ” λ¦¬μ†ŒμŠ€ ν™œμš© 방법이 λ‹΄κΈ΄ μΈν„°νŽ˜μ΄μŠ€μ΄λ‹€. 

 

πŸ“  API 

API λ₯Ό 처음 λ“€μœΌλ©΄ μ„œλ²„, DB 의 κ°œλ…κ³Ό ν—·κ°ˆλ¦΄ 수 μžˆλ‹€. ν•˜μ§€λ§Œ API λŠ” μ„œλ²„λ„ DB 도 μ•„λ‹ˆλ‹€. μ„œλ²„μ™€ DB κ°€ μ œκ³΅ν•˜λŠ” 데이터 λ˜λŠ” κΈ°λŠ₯에 μ ‘κ·Όν•  수 μžˆλ„λ‘ ν•΄μ£ΌλŠ” μ•ˆλ‚΄νŒμ— 가깝닀. κ°€λ Ή, vodkamitlime.com 의 μ„œλ²„μ—μ„œ sayHello() λΌλŠ” ν•¨μˆ˜λ₯Ό μ€€λΉ„ν•΄λ†“μ•˜λ‹€κ³  ν•˜μž. μ„œλ²„λŠ” μ™ΈλΆ€μ—μ„œ 이 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λ©΄ μ–Έμ œλ“ μ§€ "hello world!" λ₯Ό 좜λ ₯ν•˜μ—¬ λ°˜ν™˜ν•  μ€€λΉ„κ°€ λ˜μ–΄ μžˆλ‹€. ν•˜μ§€λ§Œ API κ°€ μ—†λ‹€λ©΄ κ·Έ λˆ„κ΅¬λ„ 이 ν•¨μˆ˜λ₯Ό ν˜ΈμΆœν•˜λŠ” 방법을 λͺ¨λ₯Ό 것이닀. vodkamitlime.com/test 에 μ ‘μ†ν•΄μ•Όν•˜λŠ”μ§€, vodkamitlime.com?order=true 둜 접속해야 ν•˜λŠ”μ§€ λ“±μ˜ 정보가 μ—†λ‹€λ©΄ μ„œλ²„μ—μ„œ μ›ν•˜λŠ” λ¦¬μ†ŒμŠ€λ₯Ό μ–»μ–΄μ˜¬ 수 μ—†λ‹€. 

 

이처럼 μ™ΈλΆ€μ—μ„œ μ„œλ²„μ˜ μžμ›μ„ 적절히 뢈러올 수 μžˆλ„λ‘ ν™œμš© 방법을 κ΅¬μ„±ν•œ 것이 API λ‹€. 

 

μ›Ή APIκ°€ 점차 ν™•μ‚°λ˜λ©° 이λ₯Ό ν‘œμ€€ν™”ν•˜κΈ° μœ„ν•œ ν”„λ‘œν† μ½œμΈ SOAP(Simple Object Access Protocol)이 κ°œλ°œλ˜μ—ˆλ‹€. SOAP APIλŠ” XML을 μ‚¬μš©ν•˜λ©° HTTP, SMTP, TCP λ“±μ˜ μš”μ²­μ„ μ£Όκ³ λ°›μ•˜μœΌλ©°, κ°„νŽΈν•œ λ°©λ²•μœΌλ‘œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λ‹€μ–‘ν•œ ν™˜κ²½μ—μ„œ μ‹€ν–‰ν•  수 μžˆμ—ˆλ‹€. 

 

POST http://www.stgregorioschurchdc.org/cgi/websvccal.cgi HTTP/1.1 
Accept-Encoding: gzip,deflate 
Content-Type: text/xml;charset=UTF-8 
SOAPAction: "http://www.stgregorioschurchdc.org/Calendar#easter_date" 
Content-Length: 479 
Host: www.stgregorioschurchdc.org 
Connection: Keep-Alive 
User-Agent: Apache-HttpClient/4.1.1 (java 1.5) 
<?xml version="1.0"?> 
<soapenv:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:cal="http://www.stgregorioschurchdc.org/Calendar"> 
<soapenv:Header/> 
<soapenv:Body> 
   <cal:easter_date soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> 
   <year xsi:type="xsd:short">2014</year> 
</cal:easter_date> 
</soapenv:Body> 
</soapenv:Envelope>

 

μœ„μ˜ μ˜ˆμ‹œλŠ” SOAP API 둜 보낸 μš”μ²­μ˜ μ˜ˆμ‹œλ‹€. λ³΄μ΄λ‹€μ‹œν”Ό XML 둜 μš”μ²­μ„ 주고받을 경우 payload 의 양이 ꡉμž₯히 크기 λ•Œλ¬Έμ— λ„€νŠΈμ›Œν¬ λŒ€μ—­ν­μ„ 많이 μ°¨μ§€ν•˜λŠ” λ¬Έμ œκ°€ 생겨, 인터넷 톡신이 κΈ°ν•˜κΈ‰μˆ˜μ μœΌλ‘œ λŠ˜μ–΄λ‚œ 21μ„ΈκΈ° ν†΅μ‹ μ—λŠ” μ–΄μšΈλ¦¬μ§€ μ•Šμ•˜λ‹€. μ΄λŸ¬ν•œ λ¬Έμ œμ μ„ ν•΄κ²°ν•˜λ©΄μ„œ λ™μ‹œμ— 인터넷 톡신을 νŽΈλ¦¬ν•˜κ²Œ ν•˜κ³ μž ν–ˆλ˜ 것이 λ°”λ‘œ 2000년에 λ“±μž₯ν•œ REST 아킀텍쳐 API 인 것이닀. 

 

✨  ꡬ성 μš”μ†Œ 

REST API λŠ” μžμ›, ν–‰μœ„, ν‘œν˜„μœΌλ‘œ κ΅¬μ„±λ˜λ©°, 자체 ν‘œν˜„ ꡬ쑰 (Self-descriptiveness) 둜 κ΅¬μ„±λ˜μ–΄ API λ§ŒμœΌλ‘œλ„ HTTP 의 μš”μ²­μ„ μ§κ΄€μ μœΌλ‘œ 이해할 수 μžˆλ‹€. 

 

πŸ“  μžμ›(Resource) : URI

μžμ›μ€ μ„œλ²„μ— μ €μž₯λ˜μ–΄ 있으며, ν•΄λ‹Ή μžμ›μ— μ ‘κ·Όν•  수 μžˆλŠ” URI κ°€ μ‘΄μž¬ν•œλ‹€. ν΄λΌμ΄μ–ΈνŠΈλŠ” URI λ₯Ό 톡해 ν•΄λ‹Ή μžμ›μ„ μ‘°μž‘ν•˜κ³ , CRUD μž‘μ—…μ„ μˆ˜ν–‰ν•  수 μžˆλ‹€. 

 

πŸ“  ν–‰μœ„(Verb) : HTTP Method

μžμ›μ— λŒ€ν•œ ν–‰μœ„μ΄λ‹€. POST, GET, PUT, DELETE 와 같은 HTTP μš”μ²­ λ©”μ„œλ“œλ₯Ό μ˜λ―Έν•œλ‹€.

 

πŸ“  ν‘œν˜„(Representation of Resource)

ν–‰μœ„μ˜ ꡬ체적인 λ‚΄μš©μ΄λ‹€. 

 

 

✨  μ£Όμš” 원칙

μ–΄λ– ν•œ APIκ°€ RESTful ν•˜κΈ° μœ„ν•΄μ„œλŠ” λ‹€μŒ 두 가지 μ „μ œλ₯Ό μΆ©μ‘±ν•΄μ•Ό ν•œλ‹€. 

 

1) URI λŠ” λ¦¬μ†ŒμŠ€λ₯Ό ν‘œν˜„ν•΄μ•Ό ν•œλ‹€.

2) λ¦¬μ†ŒμŠ€μ— λŒ€ν•œ ν–‰μœ„λŠ” HTTP μš”μ²­ λ©”μ„œλ“œλ‘œ ν‘œν˜„ν•œλ‹€. 

 

이 두 가지λ₯Ό ν•˜λ‚˜μ”© ꡬ체적으둜 μ‚΄νŽ΄λ³΄μž. 

 

πŸ“ 1) URI λŠ” λ¦¬μ†ŒμŠ€λ₯Ό ν‘œν˜„ν•΄μ•Ό ν•œλ‹€.

"λ¦¬μ†ŒμŠ€λ₯Ό ν‘œν˜„ν•΄μ•Ό ν•œλ‹€"λŠ” 말의 μ˜λ―ΈλŠ” "ν–‰μœ„λ₯Ό 톡해 μ‘°μž‘λ˜λŠ” μžμ›μ„ μƒμ§•ν•˜λŠ” 단어λ₯Ό ν‘œκΈ°ν•΄μ•Ό ν•œλ‹€" 에 가깝닀. 사싀 이 원칙은 λΆ€μ •λ¬ΈμœΌλ‘œ ν‘œν˜„ν•˜λŠ” 것이 더 적합할 λ“― 싢기도 ν•œλ‹€. 달리 λ§ν•˜λ©΄, "URI λŠ” ν–‰μœ„λ₯Ό ν‘œν˜„ν•˜λ©΄ μ•ˆλœλ‹€" 에 가깝닀. μ‚¬λžŒμ΄λΌλ©΄ 보톡 action μœ„μ£Όλ‘œ μƒκ°ν•˜κΈ° λ§ˆλ ¨μ΄λ‹€. λ•Œλ¬Έμ— "이 uri 에 μ ‘μ†ν•˜λ©΄ κ²Œμ‹œλ¬Ό μ‚­μ œκ°€ 될 것이닀" λŠ” 생각이 URI 에 λ…ΈμΆœλ˜λŠ” κ²½μš°κ°€ 생긴닀.

 

ex ) vodkamitlime.com/delete/boardPost/1

 

ν•˜μ§€λ§Œ μ΄λŠ” REST μ—μ„œλŠ” ꢌμž₯ν•˜μ§€ μ•ŠλŠ” 방법이닀. URI 에 ν–‰μœ„κ°€ μ§μ ‘μ μœΌλ‘œ λ…ΈμΆœλ˜κ³ , μ–΄λ–€ μžμ›μ΄ μ „λ‹¬λ˜λŠ”μ§€ μ§κ΄€μ μœΌλ‘œ νŒŒμ•…ν•˜κΈ° νž˜λ“€κΈ° λ•Œλ¬Έμ΄λ‹€.

 

πŸ“ 2) λ¦¬μ†ŒμŠ€μ— λŒ€ν•œ ν–‰μœ„λŠ” HTTP μš”μ²­ λ©”μ„œλ“œλ‘œ ν‘œν˜„ν•œλ‹€.

 

λ‘λ²ˆμ§Έ 원칙은 HTTP λ©”μ„œλ“œμ™€ 직결된 λ‚΄μš©μ΄λ‹€. μ£Όμš”ν•œ HTTP μš”μ²­ λ©”μ„œλ“œλŠ” 크게 5가지가 있으며, 각각의 역할은 λ‹€μŒκ³Ό κ°™λ‹€.

 

GET: λ¦¬μ†ŒμŠ€ 취득

POST: λ¦¬μ†ŒμŠ€ 생성

PUT: λ¦¬μ†ŒμŠ€ 전체 ꡐ체

PATCH: λ¦¬μ†ŒμŠ€ 일뢀 μˆ˜μ • 

DELETE: λ¦¬μ†ŒμŠ€ μ‚­μ œ 

 

HTTP λ©”μ„œλ“œλŠ” λ¦¬μ†ŒμŠ€ (μžμ›) 에 λŒ€ν•΄ μˆ˜ν–‰ν•  수 μžˆλŠ” ν–‰μœ„μ˜ μ’…λ₯˜μ΄λ‹€. λ”°λΌμ„œ μ—­μ‹œλ‚˜ URI 에 직접 λ…ΈμΆœλ˜μ–΄μ„œλŠ” μ•ˆλœλ‹€. μ•žμ„œ κ²Œμ‹œλ¬Όμ„ μ‚­μ œν•˜λŠ” URI λ‘œλŠ” λ‹€μŒ μΌ€μ΄μŠ€κ°€ 더 μ μ ˆν•˜λ‹€. ν–‰μœ„λ₯Ό 직접 λ…ΈμΆœν•˜μ§€λ„ μ•Šκ³  μ„œλ²„κ°€ μ²˜λ¦¬ν•˜λŠ” λ¦¬μ†ŒμŠ€ (μžμ›) 을 μ •ν™•νžˆ λͺ…μ‹œν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

DELETE     vodkamitlime.com/boardPost/1

 

 

πŸ“Œ  기타 원칙 

REST API λ₯Ό κ΅¬μ„±ν•˜λŠ” μ†Œμ†Œν•œ λͺ‡ 가지 μΆ”κ°€ 원칙이 있으며, μ΄λŠ” λ‹€μŒκ³Ό κ°™λ‹€. 

 

- μš”μ²­κ³Ό 응닡 payload λŠ” JSON 으둜 μ£Όκ³ λ°›λŠ”λ‹€. 

/  둜 κ΅¬λΆ„λœ path λ₯Ό 톡해 계측관계λ₯Ό λ‚˜νƒ€λ‚Έλ‹€.

- 응닡을 보낼 λ•Œ μ μ ˆν•œ HTTP μƒνƒœ μ½”λ“œλ₯Ό 보낸닀. 

- Spinal-case λ₯Ό ꢌμž₯ν•œλ‹€.

- HTTP 헀더에 μš”μ²­κ³Ό 응닡에 λŒ€ν•œ μ£Όμš” 정보λ₯Ό λ‹΄λŠ”λ‹€. (General/Request/Response Headers)

- resource λŠ” μ†Œλ¬Έμž, λ‹¨μˆ˜ λͺ…사 μ‚¬μš©μ„ 지ν–₯ν•œλ‹€.

- νŒŒμΌν™•μž₯μžλŠ” ν¬ν•¨ν•˜μ§€ μ•ŠλŠ”λ‹€.

 

 

✨  μ°Έκ³  자료

λŒ“κΈ€