REST API

ryudjae
|2021. 10. 9. 11:52
728x90

πŸ‘‰RESTλž€ 

RESTλž€ Representational State Transfer의 μ•½μžλ‘œ μžμ›μ„ μ΄λ¦„μœΌλ‘œ κ΅¬λΆ„ν•˜μ—¬ ν•΄λ‹Ή μžμ›(Resourse)의 μƒνƒœλ₯Ό μ£Όκ³  λ°›λŠ” λͺ¨λ“  것을 μ˜λ―Έν•œλ‹€.

즉, μžμ›μ˜ ν‘œν˜„μ— μ˜ν•œ μƒνƒœ 전달이닀. μžμ›μ˜ ν‘œν˜„μ€ κ·Έ μžμ›μ„ ν‘œν˜„ν•˜κΈ° μœ„ν•œ 이름을 μ˜λ―Έν•˜κ³  μƒνƒœ 전달은 데이터가 μš”μ²­λ˜λŠ” μ‹œμ μ—μ„œ μžμ›μ˜ μƒνƒœλ₯Ό μ „λ‹¬ν•˜λŠ”κ²ƒμ΄λ‹€.일반적으둜 JSON μ΄λ‚˜ XML을 톡해 데이터λ₯Ό μ£Όκ³  λ°›λŠ” 것이 μžˆλ‹€.

WWW(World Wide Web)κ³Ό 같은 뢄상 ν•˜μ΄νΌλ―Έλ””μ–΄ μ‹œμŠ€ν…œμ„ μœ„ν•œ μ†Œν”„νŠΈμ›¨μ–΄ 개발 μ•„ν‚€νƒμ³μ˜ ν•œ ν˜•μ‹μ΄λ‹€.RESTλŠ” 기본적으둜 μ›Ήμ˜ 기쑴의 기술과 HTTPν”„λ‘œν† μ½œμ„ κ·ΈλŒ€λ‘œ ν™œμš©ν•˜κΈ° λ•Œλ¬Έμ— μ›Ήμ˜ μž₯점을 μ΅œλŒ€ν•œ ν™œμš©ν•  수 μžˆλŠ” 아킀택쳐이닀.

REST의 μžμ„Έν•œ κ°œλ…μ€  HTTP URIλ₯Ό 톡해 μžμ›μ„ λͺ…μ‹œν•˜κ³ ,HTTP Method(POST,GET,PUT,DELETE)λ₯Ό 톡해 ν•΄λ‹Ή μžμ›μ— λŒ€ν•œ CRUD μž‘μ—…μ„ 적용 ν•˜λŠ”κ²ƒμ΄λ‹€.

RESTλŠ” μžμ› 기반의 ꡬ쑰 μ„€κ³„μ˜ 쀑심에  μžμ›(Resourse)κ°€ 있고 HTTP Methodλ₯Ό 톡해 μžμ›μ„ μ²˜λ¦¬ν•˜λ„λ‘ μ„€κ³„λœ 아킀텍쳐이닀.

 

πŸ‘‰RESTκ°€ ν•„μš”ν•œ 이유

  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 뢄리 및 톡합 
  • λ‹€μ–‘ν•œ ν΄λΌμ΄μ–ΈνŠΈ λ“±μž₯
  • μ„œλ²„ν”„λ‘œκ·Έλž¨μ€ λ‹€μ–‘ν•œ λΈŒλΌμš°μ €μ™€ μ•ˆλ“œλ‘œμ΄λ“œ ,아이폰 λ“± λͺ¨λ°”일 λ””λ°”μ΄μŠ€μ—μ„œλ„ 톡신이 κ°€λŠ₯ν•΄μ•Όν•œλ‹€.

πŸ‘‰REST의 μž₯단점

  • μž₯점
    • REST APIλ₯Ό μ‚¬μš©ν•˜κΈ°μœ„ν•΄ λ³„λ„λ‘œ 인프라λ₯Ό ꡬ좕할 ν•„μš”κ°€ μ—†λ‹€.
    • HTTP ν‘œμ€€ ν”„λ‘œν† μ½œμ— λ”°λ₯΄λŠ” λͺ¨λ“  ν”Œλž«νΌμ΄ μ‚¬μš©κ°€λŠ₯ν•˜λ‹€.
    • ν•˜μ΄νΌλ―Έλ””μ–΄API 의 기본을 μΆ©μ‹€νžˆ μ§€ν‚€λ©΄μ„œ λ²”μš©μ„±μ„ 보μž₯ν•œλ‹€.
    • μ„œλ²„μ™€ ν΄λΌμ΄μ–ΈνŠΈ μ—­ν•  뢄리가 ν™•μ‹€ν•˜λ‹€.
    • HTTP ν”„λ‘œν† μ½œμ˜ ν‘œμ€€μ„ μ΅œλŒ€ν•œ ν™œμš©ν•˜μ—¬ 좔가적인 μž₯점을 ν•¨κ»˜ κ°€μ Έκ°ˆ 수 있게 ν•΄μ€€λ‹€.
  • 단점 
    • λͺ…ν™•ν•œ ν‘œμ€€μ΄ μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ”λ‹€.
    • HTTP Methodν˜•νƒœκ°€ μ œν•œμ μ΄λ‹€.
    • κ΅¬ν˜• λΈŒλΌμš°μ €λŠ” 아직 μ œλŒ€λ‘œ 지원해주지 λͺ»ν•΄ PUT,DELETEλ₯Ό  μ‚¬μš©ν•˜μ§€ λͺ»ν•œλ‹€.

πŸ‘‰REST의 κ΅¬μ„±μš”μ†Œ 

  • μžμ›(Resourse)
    • λͺ¨λ“  μžμ›μ—λŠ” κ³ μœ ν•œ IDκ°€ μ‘΄μž¬ν•˜κ³ , 이 μžμ›μ€ Server에 μ‘΄μž¬ν•œλ‹€.
    • μžμ›μ„ κ΅¬λ³„ν•˜λŠ” κ³ μœ ν•œ IDλŠ” HTTP URI이닀.
    • ν΄λΌμ΄μ–ΈνŠΈλŠ” URIλ₯Ό μ΄μš©ν•΄μ„œ μžμ›μ„ μ„ νƒν•˜κ³  ν•΄λ‹Ή μžμ›μ˜ μƒνƒœμ— λŒ€ν•œ μ‘°μž‘μ„ Server에 μš”μ²­ν•œλ‹€.
  • ν–‰μœ„(Verb)
    • HTTP ν”„λ‘œν† μ½œμ€ GET, POST, PUT, DELETE μ™€ κ°™μ€ λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•œλ‹€.
  • ν‘œν˜„(Representations)
    • ν΄λΌμ΄μ–ΈνŠΈκ°€ μžμ›μ˜ μƒνƒœμ— λŒ€ν•œ μ‘°μž‘μ„ μš”μ²­ν•˜λ©΄ ServerλŠ” 이에 μ μ •ν•œ 응닡을 보낸닀.
    • RESTμ—μ„œ ν•˜λ‚˜μ˜ μžμ›μ€ JSON, XML, TEXT, RSS λ“± μ—¬λŸ¬ ν˜•νƒœμ˜ Representation으둜 λ‚˜νƒ€λ‚΄μ–΄ μ§ˆ μˆ˜ μžˆλ‹€.
    • JSON ν˜Ήμ€ XMLλ₯Ό ν†΅ν•΄ λ°μ΄ν„°λ₯Ό μ£Όκ³  λ°›λŠ” κ²ƒμ΄ μΌλ°˜μ μ΄λ‹€.

πŸ‘‰REST νŠΉμ§• 

  • Server-Client
    • μžμ›μ΄ μžˆλŠ” μͺ½μ΄ Server, μžμ›μ„ μš”μ²­ν•˜λŠ” μͺ½μ΄ Clientκ°€ λœλ‹€.
      • Server : APIλ₯Ό μ œκ³΅ν•˜κ³  λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 처리 및 μ €μž₯을 μ±…μž„μ§„λ‹€.
      • Client : μ‚¬μš©μž μΈμ¦μ΄λ‚˜ context등을 직접 κ΄€λ¦¬ν•˜κ³  μ±…μž„μ§„λ‹€.
    • μ„œλ‘œ κ°„μ˜ μ˜μ‘΄μ„±μ΄ 쀄어든닀.
  • Stateless(λ¬΄μƒνƒœ)
    • HTTP ν”„λ‘œν† μ½œμ€ Stateless Protocolμ΄λ―€λ‘œ REST λ˜ν•œ λ¬΄μƒνƒœμ„±μ„ κ°–λŠ”λ‹€.
    • ν΄λΌμ΄μ–ΈνŠΈμ˜ contextλ₯Ό μ„œλ²„μ— μ €μž₯ν•˜μ§€ μ•ŠλŠ”λ‹€.(μ„Έμ…˜κ³Ό 쿠킀와 같은 context정보λ₯Ό μ‹ κ²½μ“°μ§€ μ•Šμ•„λ„ λ˜λ―€λ‘œ κ΅¬ν˜„μ΄ λ‹¨μˆœν•΄μ§„λ‹€.)
    • μ„œλ²„λŠ” 각각의 μš”μ²­μ„ μ™„μ „νžˆ λ³„κ°œμ˜ κ²ƒμœΌλ‘œ μΈμ‹ν•˜κ³  μ²˜λ¦¬ν•œλ‹€.
      • APIμ„œλ²„λŠ” Client의 μš”μ²­λ§Œμ„ μ²˜λ¦¬ν•œλ‹€.
      • 이전 μš”μ²­μ΄ λ‹€μŒμš”μ²­μ— 영ν–₯을 μ£Όμ–΄μ„œλŠ” μ•ˆλœλ‹€.(DBλ₯Ό μˆ˜μ •ν•˜μ—¬ DB에 μ˜ν•΄ λ°”λ€ŒλŠ” 것은 μƒκ΄€μ—†μŒ)
      • μ„œλ²„μ˜ 처리 방식에 일관성을 λΆ€μ—¬ν•˜κ³  뢀담이 쀄어듀어 μ„œλΉ„μŠ€μ˜ μžμœ λ„κ°€ λ†’μ•„μ§„λ‹€.
  • Cacheable
    • HTTPν”„λ‘œν† μ½œμ„ μ‚¬μš©ν•˜λ―€λ‘œ μ›Ήμ—μ„œ μ‚¬μš©ν•˜λŠ” 기쑴의 인프라λ₯Ό κ·ΈλŒ€λ‘œ ν™œμš©κ°€λŠ₯ν•˜λ‹€.(λŒ€ν‘œμ μœΌλ‘œ 캐싱기λŠ₯ μ‚¬μš©κ°€λŠ₯)
    • λŒ€λŸ‰μ˜ μš”μ²­μ„ 효율적으둜 μ²˜λ¦¬ν•˜κΈ° μœ„ν•΄ μΊμ‹œκ°€ μš”κ΅¬λœλ‹€.
    • μΊμ‹œ μ‚¬μš©μ„ 톡해 μ‘λ‹΅μ‹œκ°„μ΄ 빨리지고 REST μ„œλ²„ νŠΈλžœμž­μ…˜μ΄ λ°œμƒν•˜μ§€ μ•ŠκΈ° λ•Œλ¬Έμ— 전체 μ‘λ‹΅μ‹œκ°„μ΄λ‚˜ μ„±λŠ₯, μ„œλ²„μ˜ μžμ› 이용λ₯ μ„ ν–₯상 μ‹œν‚¬μˆ˜ μžˆλ‹€.
  • Layered System
    • ν΄λΌμ΄μ–ΈνŠΈλŠ” REST API μ„œλ²„λ§Œ ν˜ΈμΆœν•œλ‹€.
    • REST μ„œλ²„λŠ” 닀쀑 κ³„μΈ΅μœΌλ‘œ ꡬ성 κ°€λŠ₯ν•˜λ‹€.(λ‘œλ“œλ°ΈλŸ°μ‹±,κ³΅μœ μΊμ‹œ 등을 톡해 ν™•μž₯μ„±κ³Ό λ³΄μ•ˆμ„±μ„ ν–₯μƒμ‹œν‚¬ 수 μžˆλ‹€.)
    • λ„€νŠΈμ›Œν¬ 기반의 쀑간 맀체λ₯Ό μ‚¬μš©ν•  수 μžˆλ‹€.(EX: proxy,Gateway)
  • Code-on-Demand
    • μ„œλ²„λ‘œ λΆ€ν„° 슀크립트λ₯Ό λ°›μ•„μ„œ Clientμ—μ„œ μ‹€ν–‰ν•œλ‹€.
  • Uniform Interface
    • URI둜 μ§€μ •ν•œ Resourse에 λŒ€ν•œ μ‘°μž‘μ„ ν†΅μΌλ˜κ³  ν•œμ •μ μΈ μΈν„°νŽ˜μ΄μŠ€λ‘œ μˆ˜ν–‰ν•œλ‹€.
    • HTTP ν‘œμ€€μ„ λ”°λ₯΄λŠ” λͺ¨λ“  ν”Œλž«νΌμ—μ„œ μ‚¬μš©κ°€λŠ₯ν•˜λ‹€.

 

πŸ‘‰REST APIλž€ 

API(Application programming Interface)

  • 데이터와 κΈ°λŠ₯을 λͺ¨μ•„μ„œ 컴퓨터 ν”„λ‘œκ·Έλž¨κ°„μ— μƒν˜Έμž‘μš©μ„ μ΄‰μ§„ν•˜λ©°, μ„œλ‘œ 정보λ₯Ό κ΅ν™˜κ°€λŠ₯ ν•˜λ„λ‘ ν•˜λŠ”κ²ƒ

REST API

 

  • REST APIλŠ” REST기반으둜 APIλ₯Ό κ΅¬ν˜„ν•œ 것이닀.
  • REST 기반으둜 μ‹œμŠ€ν…œμ„ 뢄상해 ν™•μž₯μ„±κ³Ό μž¬μ‚¬μš©μ„±μ„ λ†’μ—¬ μœ μ§€λ³΄μˆ˜ 및 μš΄μš©μ„ νŽΈλ¦¬ν•˜κ²Œ ν• μˆ˜μžˆλ‹€.
  • RESTλŠ” HTTP 기반으둜 κ΅¬ν˜„ν•˜λ―€λ‘œ,HTTPλ₯Ό μ§€μ›ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ–Έμ–΄λ‘œ  ν΄λΌμ΄μ–ΈνŠΈ ,μ„œλ²„λ₯Ό κ΅¬ν˜„ν•  수 μžˆλ‹€.

πŸ‘‰REST API  μ„€κ³„  κ·œμΉ™

URIλŠ” μ •λ³΄μ˜ μžμ›μ„ ν‘œν˜„ν•΄μ•Ό ν•œλ‹€.

  • λ¦¬μ†ŒμŠ€λŠ” 동사보닀 λͺ…사,λŒ€λ¬Έμžλ³΄λ‹€λŠ” μ†Œλ¬Έμžλ₯Ό μ‚¬μš©ν•œλ‹€.
  • λ¦¬μ†ŒμŠ€λŠ” λ„νλ¨ΌνŠΈ μ΄λ¦„μœΌλ‘œλŠ” λ‹¨μˆ˜ λͺ…사λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.
  • λ¦¬μ†ŒμŠ€μ˜ μ»¬λ ‰μ…˜ μ΄λ¦„μœΌλ‘œλŠ” 볡수 λͺ…사λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.
  • λ¦¬μ†ŒμŠ€μ˜ μŠ€ν† μ–΄ μ΄λ¦„μœΌλ‘œλŠ” 볡수 λͺ…사λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€.
    • EX) GET /Member/1 -> GET /members/1

λ¦¬μ†ŒμŠ€μ— λŒ€ν•œ ν–‰μœ„λŠ” HTTP Method(GET, PUT ,POST DELETE)둜 ν‘œν˜„ν•œλ‹€.

  • URI에 HTTP Methodκ°€ λ“€μ–΄κ°€λ©΄ μ•ˆλœλ‹€.
    • EX)GET /store/delete/1  -> DELETE /stores/1
  • URI에 ν–‰μœ„μ— λŒ€ν•œ 동사 ν‘œν˜„μ΄ λ“€μ–΄κ°€λ©΄ μ•ˆλœλ‹€.
    • EX)GET /store/show/1  -> GET /stores/1
    • EX)GET /store/insert/12  -> POST /store/1
  • 경둜 λΆ€λΆ„ 쀑 λ³€ν•˜λŠ” 뢀뢄은 μœ μΌν•œ κ°’μœΌλ‘œ λŒ€μ²΄ν•œλ‹€.
    • id = 1 인 μƒν’ˆ μ‚­μ œν•˜λŠ” route : DELETE/product/1

πŸ‘‰μ„€κ³„ κ·œμΉ™

  • μŠ¬λž˜μ‹œ(/)λŠ” 계측 관계λ₯Ό λ‚˜νƒ€λ‚΄λŠ”λ° μ‚¬μš©ν•œλ‹€.
    • EX)http://localhost.com/product/1
  • URI λ§ˆμ§€λ§‰ 문자둜 μŠ¬λž˜μ‹œ(/)λ₯Ό ν¬ν•¨ν•˜μ§€ μ•ŠλŠ”λ‹€.
    • URI에 ν¬ν•¨λ˜λŠ” λͺ¨λ“  κΈ€μžλŠ” λ¦¬μ†ŒμŠ€μ˜ μœ μΌν•œ μ‹λ³„μžλ‘œ μ‚¬μš©λ˜μ–΄μ•Ό ν•œλ‹€.
    • URI 경둜 λ§ˆμ§€λ§‰μ—λŠ” μŠ¬λž˜μ‹œ(/)λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€.
    • EX)http://localhost.com/product/1/  (X)
  • ν•˜μ΄ν”ˆ( - )은 가독성을 λ†’μ΄λŠ”λ° ν™œμš©ν•œλ‹€.
    • κΈ΄ URI경둜λ₯Ό μ‚¬μš©ν•˜κ²Œλ˜λ©΄ ν•˜μ΄ν”ˆμ„ μ‚¬μš©ν•΄ 가독성을 높인닀.
  • 밑쀄(_)은 URI에 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€.
    • λ¬Έμžμ— κ°€λ €μ§ˆμˆ˜ μžˆμœΌλ―€λ‘œ 밑쀄은 μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€.
  • URIκ²½λ‘œμ—λŠ” μ†Œλ¬Έμžκ°€ μ ν•©ν•˜λ‹€.
    • RFC 3986은 URI μŠ€ν‚€λ§ˆμ™€ 호슀트λ₯Ό μ œμ™Έν•˜κ³ λŠ” λŒ€μ†Œλ¬Έμžλ₯Ό κ΅¬λ³„ν•˜λ„λ‘ κ·œμ •ν•˜κΈ° λ•Œλ¬Έμ— λŒ€λ¬Έμžλ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠλŠ”λ‹€.
  • νŒŒμΌν™•μž₯μžλŠ” URI에 ν¬ν•¨ν•˜μ§€ μ•ŠλŠ”λ‹€.
    • REST APIμ—μ„œλŠ” λ©”μ‹œμ§€ λ°”λ”” λ‚΄μš©μ˜ ν¬λ§·μ„ λ‚˜νƒ€λ‚΄κΈ° μœ„ν•œ νŒŒμΌ ν™•μž₯자λ₯Ό URI μ•ˆμ— ν¬ν•¨μ‹œν‚€μ§€ μ•ŠλŠ”λ‹€.
    • Ex) http://localhost.com/product/1/photo.jpg (X)
      Ex) GET /product/1/photo HTTP/1.1 Host: localhost.com Accept: image/jpg (O)

 


πŸ“REFERENCE

 

 

728x90