πŸ“ŒCS/Web

[Web] REST & RESTful

dar0m! 2021. 4. 3. 21:37

REST & RESTful

RESTλŠ” HTTP, ν”„λ‘œν† μ½œμ΄ μ•„λ‹ˆλ‹€! RESTλŠ” μΌμ’…μ˜ κ°€μ΄λ“œλΌμΈμ΄λ‹€. 

REST API λŠ” REST 기반으둜 μ„œλΉ„μŠ€ APIλ₯Ό κ΅¬ν˜„ν•œ 것

REST 원리λ₯Ό 따라λ₯΄λŠ” μ‹œμŠ€ν…œ(μ„œλΉ„μŠ€)λ₯Ό RESTful 이라고 ν•œλ‹€. = REST API λ₯Ό μ œκ³΅ν•˜λŠ” μ›Ή μ„œλΉ„μŠ€λ₯Ό RESTful ν•˜λ‹€κ³  ν•  수 μžˆλ‹€.

 

REST

RESTλŠ” Representational State Transfer의 μ•½μžλ‘œ λΆ„μ‚° ν•˜μ΄νΌ λ―Έλ””μ–΄ μ‹œμŠ€ν…œμ„ μœ„ν•œ μ†Œν”„νŠΈμ›¨μ–΄ μ•„ν‚€ν…μ²˜μ˜ ν•œ ν˜•μ‹μ΄λ‹€.

웹에 μ‘΄μž¬ν•˜λŠ” λͺ¨λ“  μžμ›(이미지, λ™μ˜μƒ, DBμžμ›)에 κ³ μœ ν•œ URL을 λΆ€μ—¬ν•΄ ν™œμš©ν•˜λŠ” κ²ƒμœΌλ‘œ μžμ›μ„ μ •μ˜ν•˜κ³  μžμ›μ— λŒ€ν•œ μ£Όμ†Œλ₯Ό μ§€μ •ν•˜λŠ” 방법둠을 μ˜λ―Έν•œλ‹€. → URL에 μžμ›μ„ ν‘œν˜„ν•˜λŠ” 것

HTTP URI λ₯Ό 톡해 μžμ›μ„ λͺ…μ‹œν•˜κ³  HTTP Methodλ₯Ό 톡해 ν•΄λ‹Ή μžμ›μ˜ λŒ€ν•œ CRUD Operation(생성, 쑰회, λ³€κ²½, μ‚­μ œ)을 μ μš©ν•œλ‹€.

 

HTTP URI(Uniform Resource Identifier)

URIλŠ” λ„€νŠΈμ›Œν¬ 상에 μ‘΄μž¬ν•˜λŠ” μžμ›μ„ κ΅¬λΆ„ν•˜λŠ” μ‹λ³„μžμ΄λ‹€. URI은 URL, URN둜 μ΄λ£¨μ–΄μ ΈμžˆμœΌλ©° URL은 Where의 κ°œλ…, λ¦¬μ†ŒμŠ€μ˜ ꡬ체적인 μœ„μΉ˜λ₯Ό μ•Œλ €μ£Όκ³ , URN은 What의 κ°œλ…, μ΄λ¦„μœΌλ£Œ ν‘œμ‹œλ˜λ©° μœ μΌν•œ 값이고 독립적이닀.

URN, URL을 합쳐 ν•˜λ‚˜μ˜ μ‹λ³„μžλ‘œ ν™œμš©ν•  수 μžˆλ‹€. (좜처)

HTTP Method

 

HTTP μ‘λ‹΅μ½”λ“œ λ©”μ†Œλ“œ 정리 GET, POST, PUT, PATCH, DELETE, TRACE, OPTIONS

HTTP Request 정보  GET /index.html HTTP/1.1  μš”μ²­ URL정보 (Mehotd /URI HTTP버젼)  user-agent: MSIE 6.0; Window NT 5.0  μ‚¬μš©μž μ›Ή 브라우져 μ’…λ₯˜  accept: test/html; */*  μš”μ²­ 데이터 νƒ€μž… (응닡..

javaplant.tistory.com

 

κ΅¬μ„±μš”μ†Œ

  1. Resource : μžμ›, HTTP URI
  2. Verb : μžμ›μ— λŒ€ν•œ ν–‰μœ„, HTTP Method
  3. Representations : μžμ›μ— λŒ€ν•œ ν–‰μœ„μ˜ λ‚΄μš©, HTTP Message Pay Load

 

REST 의 νŠΉμ§•

6가지 μ œμ•½ 쑰건. ν•΄λ‹Ή νŠΉμ§•μ„ μ§€μΌœμ•Ό APIκ°€ RESTful둜 간주될 수 μžˆλ‹€.
  1. ν΄λΌμ΄μ–ΈνŠΈ / μ„œλ²„ ꡬ쑰 (Client-Server)

    μžμ›μ΄ μžˆλŠ” Server
    , μžμ›μ„ μš”μ²­ν•˜λŠ” Client의 ꡬ쑰
  2. λ¬΄μƒνƒœ (Stateless)

    HTTPλŠ” Stateless ν”„λ‘œν† μ½œ μ΄λ―€λ‘œ REST μ—­μ‹œ λ¬΄μƒνƒœμ„±μ„ 가진닀. ν΄λΌμ΄μ–ΈνŠΈμ˜ Content λ₯Ό μ„œλ²„μ— μ €μž₯ν•˜μ§€ μ•ŠλŠ”λ‹€.
    λŒ€μ‹  μ„Έμ…˜μ˜ μƒνƒœμ— λŒ€ν•œ 정보가 ν΄λΌμ΄μ–ΈνŠΈμ— μ €μž₯됨
  3. μΊμ‹œ 처리 κ°€λŠ₯ (Cacheable)

    μ›Ή ν‘œμ€€ HTTP ν”„λ‘œν† μ½œμ„ κ·ΈλŒ€λ‘œ μ‚¬μš©ν•˜λ―€λ‘œ , μ›Ήμ—μ„œ μ‚¬μš©ν•˜λŠ” 기쑴의 인프라λ₯Ό κ·ΈλŒ€λ‘œ ν™œμš© κ°€λŠ₯ν•˜λ‹€.
    ν΄λΌμ΄μ–ΈνŠΈ-μ„œλ²„ μƒν˜Έ μž‘μš©μ„ κ°„μ†Œν™”ν•¨

    β–·GET - 일반적으둜 λΈŒλΌμš°μ €μ—μ„œ cache μ‚¬μš© κ°€λŠ₯
    β–·POST - 일반적으둜 cache μ‚¬μš© λΆˆκ°€λŠ₯. ν•˜μ§€λ§Œ Expires와 Cache-Control headerλ₯Ό μ΄μš©ν•˜μ—¬ caching을 κ΅¬ν˜„ν•˜μ—¬ 응닡할 수 μžˆλ‹€.
    β–·PUT, DELETE - ν•΄λ‹Ή RequestλŠ” cacheλ₯Ό μ μš©ν•  수 μ—†λ‹€.
  4. 계측화

    API μ„œλ²„λŠ” 순수 λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ„ μˆ˜ν–‰ν•˜κ³  κ·Έ μ•žλ‹¨μ— μ‚¬μš©μž 인증 , μ•”ν˜Έν™” , λ‘œλ“œλ°ΈλŸ°μ‹± 등을 ν•˜λŠ” 계측을 μΆ”κ°€ν•˜μ—¬ κ΅¬μ‘°μƒμ˜ μœ μ—°μ„±μ„ 쀄 수 μžˆλ‹€.
  5. μΈν„°νŽ˜μ΄μŠ€ 일관성(Uniform Interface)

    URI둜 μ§€μ •ν•œ μžμ›μ— λŒ€ν•œ μ‘°μž‘μ„ ν†΅μΌλ˜κ³  ν•œμ •μ μΈ μΈν„°νŽ˜μ΄μŠ€λ‘œ μˆ˜ν–‰ν•œλ‹€.
    HTTP ν‘œμ€€μ—λ§Œ λ”°λ₯Έλ‹€λ©΄ λͺ¨λ“  ν”Œλž«νΌμ— μ‚¬μš©μ΄ κ°€λŠ₯ν•˜λ‹€.
  6. 자체 ν‘œν˜„ ꡬ쑰

    동사(Method) + λͺ…사(URI) 둜 μ΄λ£¨μ–΄μ Έμžˆμ–΄ μ–΄λ–€ λ©”μ„œλ“œμ— 무슨 ν–‰μœ„λ₯Ό ν•˜λŠ”μ§€ μ•Œ 수 있으며 REST API μžμ²΄κ°€ 맀우 μ‰¬μ›Œμ„œ API 메세지 자체만 보고도 APIλ₯Ό 이해할 수 μžˆλ‹€.

 

REST API μ—μ„œ λ©±λ“±μ„±μ΄λž€?

λ©±λ“±μ„±μ΄λž€ μ–΄λ–€ λŒ€μƒμ— 같은 연산을 μ—¬λŸ¬λ²ˆ μ μš©ν•΄λ„ κ²°κ³Όκ°€ 달라지지 μ•ŠλŠ” μ„±μ§ˆμ΄λ‹€.

REST API μ—μ„œ λ©±λ“±μ„±μ΄λž€ 응닡이 λ‹€λ₯Ό μˆ˜λŠ” μžˆμ§€λ§Œ, μš”μ²­μ΄ μ˜λ„ν•œ 효과λ₯Ό λ°œνœ˜ν•  λ•Œ 멱등성이 μœ μ§€λ¨μ„ μ˜λ―Έν•œλ‹€. (μ—¬λŸ¬λ²ˆ μš”μ²­μ„ 보내도 μš”μ²­μ— μ˜ν•œ μ„œλ²„μ˜ μƒνƒœλŠ” 항상 κ°™μŒ)

Method λ©±λ“±μ„± 보μž₯ μ„€λͺ…
GET O λ‹¨μˆœ λ¦¬μ†ŒμŠ€ μ½μ–΄μ˜€λŠ” ν–‰μœ„μ΄λ―€λ‘œ μ—¬λŸ¬λ²ˆ μˆ˜ν–‰ν•΄λ„ κ²°κ³Όκ°€ 달라지지 μ•ŠμŒ
HEAD O GETκ³Ό λ§ˆμ°¬κ°€μ§€
PUT(μžμ› 전체 κ°±μ‹ ) O 데이터가 μ—†λŠ” 경우 생성될 수 있음, 이미 μ‘΄μž¬ν•œλ‹€λ©΄ λ°μ΄ν„°λŠ” μˆ˜μ •λœλ‹€.
μš”μ²­μ— λ‹΄κΈ΄ λ¦¬μ†ŒμŠ€λ‘œ κΈ°μ‘΄ λ¦¬μ†ŒμŠ€λ₯Ό λŒ€μ²΄ν•΄λ²„λ¦¬κΈ° λ•Œλ¬Έμ— μ—¬λŸ¬λ²ˆ μˆ˜ν–‰ν•΄λ„ μš”μ²­μ— λ‹΄κΈ΄ λ¦¬μ†ŒμŠ€κ°€ λ³€ν•˜μ§€ μ•ŠλŠ” 이상 μ—°μ‚° κ²°κ³ΌλŠ” 동일
DELETE O 이미 μ‘΄μž¬ν•˜λ“ , μ‘΄μž¬ν•˜μ§€ μ•Šλ“  κ·Έ λ°μ΄ν„°λŠ” DELETE μš”μ²­μ„ 보낸 μ‹œμ μ—μ„œ μ‚¬λΌμ§€κ²Œ λœλ‹€. 즉, μš°λ¦¬κ°€ μš”μ²­ν•œ 사항은 이루어 쑌음
POST X λ¦¬μ†ŒμŠ€λ₯Ό μƒˆλ‘­κ²Œ μƒμ„±ν•˜λŠ” ν–‰μœ„μ΄κΈ° λ•Œλ¬Έμ— μ—¬λŸ¬λ²ˆ μˆ˜ν–‰ν•˜κ²Œ 되면 맀번 μƒˆλ‘œμš΄ λ¦¬μ†ŒμŠ€κ°€ μƒμ„±λœ 것이고, 연산을 μˆ˜ν–‰ν•œ κ²°κ³Όκ°€ 맀번 달라진닀.
PATCH(μžμ›μ˜ 일뢀 ꡐ체) β–³ κ΅¬ν˜„ 방법에 따라 PUT λ©”μ†Œλ“œμ²˜λŸΌ 보μž₯될 μˆ˜λ„ 있고, 보μž₯λ˜μ§€ μ•Šμ„ μˆ˜λ„ μžˆλ‹€. PUT λ©”μ†Œλ“œμ²˜λŸΌ λ¦¬μ†ŒμŠ€λ₯Ό λŒ€μ²΄ν•˜λŠ” ν–‰μœ„κ°€ μ•„λ‹ˆκΈ° λ•Œλ¬Έμ— μš”μ²­μ„ μ–΄λ–€ λ°©μ‹μœΌλ‘œ μ‚¬μš©ν•˜λŠ”μ§€μ— λŒ€ν•œ μ œν•œμ΄ λ”±νžˆ μ—†κΈ° λ•Œλ¬Έμ΄λ‹€.

1. μˆ˜μ •ν•  λ¦¬μ†ŒμŠ€μ˜ μΌλΆ€λΆ„λ§Œ λ‹΄μ—μ„œ μš”μ²­ν•˜λŠ” κ²½μš°μ—λŠ” λ‹Ήμ—°νžˆ 멱등성이 보μž₯λœλ‹€.
2. ν•˜μ§€λ§Œ, μ•„λž˜μ™€ 같은 경우 $increaseν•„λ“œ 값은 μ¦κ°€μ‹œν‚€κ³  싢은 속성을 μ˜λ―Έν•˜κ³ , value ν•„λ“œ 값은 κ·Έ 속성을 μ–Όλ§ˆλ‚˜ μ¦κ°€μ‹œν‚¬ 것인지λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. 이 경우 APIκ°€ 호좜될 λ•Œλ§ˆλ‹€ λ‚˜μ΄κ°€ 1μ”© μ¦κ°€ν•˜κΈ° λ•Œλ¬Έμ— 이 APIλŠ” 멱등성을 보μž₯ν•˜μ§€ μ•ŠλŠ”λ‹€.

PATCH users/1 {
  $increase: 'age',
  value: 1,
}

μ΄λŸ°μ‹μœΌλ‘œ PATCH λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” κ²½μš°λŠ” λͺ»λ΄€μ§€λ§Œ μŠ€νŽ™ 상 μ œμ•½μ΄ μ—†κΈ° λ•Œλ¬Έμ— ν‘œμ€€μ„ μ–΄κΈ°λŠ” 것은 μ•„λ‹ˆλ‹€. λ”°λΌμ„œ PATCH λ©”μ†Œλ“œλŠ” APIλ₯Ό μ–΄λ–»κ²Œ κ΅¬ν˜„ν•˜λŠλƒμ— 따라 멱등성을 보μž₯ν•  μˆ˜λ„ 있고 아닐 μˆ˜λ„ μžˆλ‹€.

μ•ˆμ „ν•œ λ©”μ†Œλ“œ : GET, HEAD와 같이 μ„œλ²„μΈ‘μ˜ μƒνƒœ 정보λ₯Ό λ³€κ²½ν•˜μ§€ μ•ŠλŠ” λ©”μ†Œλ“œ
λ©±λ“±ν•œ λ©”μ†Œλ“œ : μ„œλ²„μ˜ μƒνƒœλ₯Ό λ³€κ²½μ‹œν‚¬ μˆ˜λ„ 있고, μ‹œν‚€μ§€ μ•Šμ„ μˆ˜λ„ μžˆλ‹€. λ‹€λ§Œ, μš°λ¦¬κ°€ μš”μ²­ν•œ 사항은 μ—λŸ¬κ°€ λ‚˜κ±°λ‚˜, 지연이 λ°œμƒν•˜μ§€ μ•ŠλŠ” ν•œ μš”μ²­μ— λŒ€ν•œ μ„œλ²„μ˜ μƒνƒœλŠ” 항상 κ°™λ‹€.

 

REST μž₯단점

μž₯점

  1. μ‰¬μš΄ μ‚¬μš©

    HTTP 인프라λ₯Ό κ·ΈλŒ€λ‘œ μ‚¬μš©ν•˜λ―€λ‘œ λ³„λ„μ˜ 인프라 ꡬ좕이 ν•„μš” μ—†λ‹€.
  2. ν΄λΌμ΄μ–ΈνŠΈ-μ„œλ²„ μ—­ν• μ˜ λͺ…ν™•ν•œ 뢄리

    ν΄λΌμ΄μ–ΈνŠΈμ˜ Contextλ₯Ό μœ μ§€ν•  ν•„μš” μ—†μŒ
  3. νŠΉμ • 데이터 ν‘œν˜„μ„ μ‚¬μš© κ°€λŠ₯

    헀더 뢀뢄에 URI 처리 λ©”μ†Œλ“œλ₯Ό λͺ…μ‹œν•˜κ³  ν•„μš”ν•œ μ‹€μ œ 데이터λ₯Ό body에 ν‘œν˜„ν•  수 μžˆλ„λ‘ λΆ„λ¦¬μ‹œν‚΄. JSON, XML λ“± μ›ν•˜λŠ” Representation μ–Έμ–΄λ‘œ μ‚¬μš© κ°€λŠ₯

단점

  1. λ©”μ†Œλ“œ ν•œκ³„

    HTTP Method둜 URIλ₯Ό ν‘œν˜„ν•˜κΈ° λ•Œλ¬Έμ— μ‰½μ§€λ§Œ ν˜•νƒœκ°€ μ œν•œμ μž„
  2. ν‘œμ€€μ΄ μ—†μŒ

    RESTλŠ” 섀계 κ°€μ΄λ“œμΌ 뿐 λͺ…ν™•ν•œ ν‘œμ€€μ΄ μ—†λ‹€.

 

μ°Έκ³