λͺ¨λ˜ JS Deep dive #44 | REST API

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μž₯.

[λ„€νŠΈμ›Œν¬] REST API