λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
Spring

[Spring] RESTful API

by jaee_ 2021. 11. 16.

🀷‍♂️ REST?   REST API?   RESTful API?

REST λž€ μ›Ή(HTTP)의 μž₯점을 μ΅œλŒ€ν•œ ν™œμš©ν•  수 μžˆλŠ” μ•„ν‚€ν…μ³μž…λ‹ˆλ‹€.

 

REST API(REpresentational State Transfer)λŠ” REST 아킀텍쳐 μŠ€νƒ€μΌμ„ λ”°λ₯΄λŠ” API둜, μ›Ήμƒμ—μ„œ μ‚¬μš©λ˜λŠ” μ—¬λŸ¬ λ¦¬μ†ŒμŠ€λ₯Ό HTTP URI(Resourse)둜 ν‘œν˜„ν•˜κ³ , ν•΄λ‹Ή λ¦¬μ†ŒμŠ€μ— λŒ€ν•œ ν–‰μœ„λ₯Ό HTTP Method( GET, POST, PUT, PATCH, DELETE )둜 μ •μ˜ν•˜μ—¬ νŠΉμ •ν•œ ν˜•νƒœ(μžμ›μ˜ ν˜•νƒœ)둜 μ „λ‹¬ν•˜λŠ” λ°©μ‹μ„ λ§ν•©λ‹ˆλ‹€. 

 

RESTful APIλž€ REST API 섀계 κ°€μ΄λ“œλ₯Ό 따라 APIλ₯Ό λ§Œλ“€μ–΄ μ›Ήμ„œλΉ„μŠ€λ₯Ό μ œκ³΅ν•˜λ©΄ ν•΄λ‹Ή μ›Ή μ„œλΉ„μŠ€λŠ” RESTfulν•˜λ‹€κ³  λ§ν•˜λ©° RESTful ν•œ APIλ₯Ό RESTful API라고 ν•©λ‹ˆλ‹€.


REST의 ꡬ성

RESTλŠ” λ‹€μŒκ³Ό 같은 κ΅¬μ„±μœΌλ‘œ 이루어져 μžˆμŠ΅λ‹ˆλ‹€.

  • URI : μžμ› (Resource)
  • HTTP Method : ν–‰μœ„ (Verb) 
    • POST : 생성 (Create)
    • GET : 쑰회 (Read)
    • PUT : μˆ˜μ • (Update)
    • DELETE : μ‚­μ œ (Delete)
    • HEAD : header 정보 쑰회
  • Representations : ν‘œν˜„

REST API의 νŠΉμ§•

REST APIλŠ” μ•„λž˜μ™€ 같은 νŠΉμ§•μ„ κ°€μ§‘λ‹ˆλ‹€. 

 

  • Uniform interface(μΈν„°νŽ˜μ΄μŠ€ 일관성) : μœ λ‹ˆνΌ μΈν„°νŽ˜μ΄μŠ€λŠ” URI둜 μ§€μ •ν•œ λ¦¬μ†ŒμŠ€μ— λŒ€ν•œ μ‘°μž‘μ„ ν†΅μΌλ˜κ³  κ· μΌν•œ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€. μ•„ν‚€ν…μ²˜λ₯Ό λ‹¨μˆœν•˜κ²Œ λΆ„λ¦¬ν•˜μ—¬ λ…λ¦½μ μœΌλ‘œ λ§Œλ“€ 수 μžˆμŠ΅λ‹ˆλ‹€. 
    • Self-descriptiveness (자체 ν‘œν˜„ ꡬ쑰) : JSONν˜•νƒœμ˜ λ©”μ‹œμ§€λ₯Ό 톡해 λ‚΄μš©μ„ μ§κ΄€μ μœΌλ‘œ 이해할 수 μžˆμŠ΅λ‹ˆλ‹€. 즉, REST API λ©”μ‹œμ§€ κ΅¬μ‘°λ§Œμ„ 보고도 μ‰½κ²Œ 이해할 수 μžˆλŠ” 자체 ν‘œν˜„ ꡬ쑰둜 λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 
    • identification of resources (μžμ› 식별) : URIλ₯Ό ν†΅ν•œ μžμ› 식별을 λ§ν•©λ‹ˆλ‹€. μžμ›μ„ λ‚˜νƒ€λ‚Ό λ•Œμ—λŠ” 동사가 μ•„λ‹Œ λͺ…사λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. λ˜ν•œ, ν‘œν˜„ν•˜κ³ μž ν•˜λŠ” μžμ›μ΄ λ³΅μˆ˜ν˜•μΌλ• λͺ…μ‹œκ°€ ν•„μš”ν•©λ‹ˆλ‹€. ex. http://localhost:8080/movies/...
    • manipulation of resources through representation : representation 전솑을 ν†΅ν•΄μ„œ λ¦¬μ†ŒμŠ€λ₯Ό μ‘°μž‘ν•΄μ•Ό ν•©λ‹ˆλ‹€. ( λ¦¬μ†ŒμŠ€λ₯Ό λ§Œλ“€κ±°λ‚˜ μ‚­μ œν•˜κ±°λ‚˜ ν• λ•Œ λ¦¬μ†ŒμŠ€μ— HTTP λ©”μ‹œμ§€μ— κ·Έ ν‘œν˜„μ„ λ‹΄μ•„μ„œ 전달해야 ν•©λ‹ˆλ‹€. ) ex.content-type, HTTP method
    • HATEOAS : hypermedia as the engine of application state ( μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μƒνƒœμ— λŒ€ν•œ μ—”μ§„μœΌλ‘œμ„œ ν•˜μ΄νΌλ―Έλ””μ–΄ ) : μ–΄ν”Œλ¦¬μΌ€μ΄μ…˜μ€ μ‚¬μš©μžκ°€ μ–΄λ–€ ν–‰μœ„λ₯Ό ν•˜λŠλƒμ— 따라 μƒνƒœκ°€ λ°”λ€Œκ²Œ λ©λ‹ˆλ‹€.
  • Stateless (λ¬΄μƒνƒœμ„±) : μƒνƒœμ •λ³΄λ₯Ό λ”°λ‘œ μ €μž₯ν•˜κ±°λ‚˜ κ΄€λ¦¬ν•˜μ§€ μ•ŠλŠ” νŠΉμ§•μ„ κ°€μ§‘λ‹ˆλ‹€. 즉, μ„Έμ…˜ 및 쿠킀같은 정보λ₯Ό μ €μž₯ν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— API μ„œλ²„λŠ” λ“€μ–΄μ˜€λŠ” μš”μ²­μ„ 처리만 ν•˜λ©΄ λ©λ‹ˆλ‹€. λ”°λΌμ„œ μ„œλΉ„μŠ€μ˜ μžμœ λ„κ°€ 높아지고 μ„œλ²„κ°€ λΆˆν•„μš”ν•œ λ‚΄μš©λ“€μ„ κ΄€λ¦¬ν•˜μ§€ μ•ŠμŒμœΌλ‘œμ¨ λΉ„μš©μ΄ μ€„μ–΄λ“€κ²Œ λ©λ‹ˆλ‹€. 단, ν΄λΌμ΄μ–ΈνŠΈμ˜ λͺ¨λ“  μš”μ²­μ€ μ„œλ²„κ°€ μš”μ²­μ„ μ•Œμ•„λ“€μ„ 수 μžˆκ²Œλ” λͺ¨λ“  정보λ₯Ό λ‹΄κ³  μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. 
  • Cacheable (캐싱) : HTTPλΌλŠ” κΈ°μ‘΄ μ›Ήν‘œμ€€μ„ κ·ΈλŒ€λ‘œ μ‚¬μš©ν•˜κΈ°μ—, μ›Ήμ—μ„œ μ‚¬μš©ν•˜λŠ” κΈ°μ‘΄ 인프라λ₯Ό μ‚¬μš© ν•  수 있고 κ²°κ΅­ HTTPκ°€ 가진 캐싱 κΈ°λŠ₯을 μ‚¬μš© ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 
  • Server / Client ꡬ쑰 : ν΄λΌμ΄μ–ΈνŠΈμ™€ μ„œλ²„μ˜ 관심사가 λͺ…ν™•νžˆ λΆ„λ¦¬λ˜μ–΄ μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. μ„œλ²„λŠ” ν΄λΌμ΄μ–ΈνŠΈκ°€ μ›ν•˜λŠ” 데이터λ₯Ό μ œκ³΅ν•˜λŠ” μ—­ν• , ν΄λΌμ΄μ–ΈνŠΈλŠ” μ„œλ²„κ°€ 보내쀀 데이터λ₯Ό μ΄μš©ν•˜μ—¬ μ‚¬μš©μžκ°€ μ›ν•˜λŠ” 화면을 λ³΄μ—¬μ£ΌλŠ” 역할을 λ‹΄λ‹Ήν•©λ‹ˆλ‹€. 
  • κ³„μΈ΅ν˜• ꡬ쑰 : REST μ„œλ²„λŠ” 닀쀑 κ³„μΈ΅μœΌλ‘œ ꡬ성될 수 있으며 λ³΄μ•ˆ, λ‘œλ“œ λ°ΈλŸ°μ‹±, μ•”ν˜Έν™” 계측을 μΆ”κ°€ν•΄ κ΅¬μ‘°μƒμ˜ μœ μ—°μ„±μ„ λ‘˜ 수 있고 ν”„λ‘μ‹œ, κ²Œμ΄νŠΈμ›¨μ΄ 같은 λ„€νŠΈμ›Œν¬ 기반의 쀑간맀체λ₯Ό μ‚¬μš©ν•  수 있게 ν•©λ‹ˆλ‹€.
  • Code-On-Demand : μ„œλ²„κ°€ λ„€νŠΈμ›Œν¬λ₯Ό 톡해 ν΄λΌμ΄μ–ΈνŠΈμ— ν”„λ‘œκ·Έλž¨μ„ μ „λ‹¬ν•˜λ©΄ κ·Έ ν”„λ‘œκ·Έλž¨μ΄ ν΄λΌμ΄μ–ΈνŠΈμ—μ„œ 싀행될 수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€. (ν•„μˆ˜λŠ” μ•„λ‹Œ option)

 

μ°Έκ³ ν•œ μ‚¬μ΄νŠΈ

λŒ“κΈ€