codeStates front-end/node(server)

REST API - λ‚˜λ§Œμ˜ μ–Έμ–΄λ‘œ λΈ”λ‘œκΉ… 해보기

ν™˜ν…Œν¬ 2023. 1. 31. 20:01
λ°˜μ‘ν˜•

 

 

 

 

πŸ“Œ REST API

 

 

πŸ“REST( Representational State Transfer )

API μž‘λ™ 방식에 λŒ€ν•œ 쑰건을 λΆ€κ³Όν•˜λŠ” μ†Œν”„νŠΈμ›¨μ–΄ 아킀텍쳐

λŒ€κ·œλͺ¨μ˜ κ³ μ„±λŠ₯ 톡신을 μ•ˆμ •μ μœΌλ‘œ 지원

 

πŸ“API

μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ν”„λ‘œκ·Έλž˜λ° μΈν„°νŽ˜μ΄μŠ€

λ‹€λ₯Έ μ†Œν”„νŠΈμ›¨μ–΄ μ‹œμŠ€ν…œκ³Ό ν†΅μ‹ ν•˜κΈ° μœ„ν•΄ 따라야 ν•˜λŠ” κ·œμΉ™μ„ μ •μ˜

 

πŸ“ REST API

μ›Ήμ—μ„œ μ‚¬μš©λ˜λŠ” λ°μ΄ν„°λ‚˜ μžμ›μ„ HTTP URI둜 ν‘œν˜„ν•˜κ³ , HTTP ν”„λ‘œν† μ½œμ„ 톡해 μš”μ²­κ³Ό 응닡을 μ •μ˜ν•˜λŠ” 방식

 

 

REST ꡬ성

  • μžμ›(RESOURCE) - URI
  • ν–‰μœ„(Verb) - HTTP METHOD
  • ν‘œν˜„(Representations)

 

REST νŠΉμ§•

 

1) κ· μΌν•œ μΈν„°νŽ˜μ΄μŠ€ : μ„œλ²„κ°€ ν‘œμ€€ ν˜•μ‹μœΌλ‘œ 정보λ₯Ό 전솑

2) λ¬΄μƒνƒœ : μ„œλ²„κ°€ μ΄μ „μ˜ λͺ¨λ“  μš”μ²­κ³Ό λ…λ¦½μ μœΌλ‘œ λͺ¨λ“  ν΄λΌμ΄μ–ΈνŠΈ μš”μ²­μ„ μ™„λ£Œν•˜λŠ” 톡신 방법

3) 계측화 μ‹œμŠ€ν…œ : μ—¬λŸ¬ κ³„μΈ΅μœΌλ‘œ μ—¬λŸ¬ μ„œλ²„μ—μ„œ μ‹€ν–‰λ˜λ„λ‘ RESTful μ›Ή μ„œλΉ„μŠ€λ₯Ό 섀계

4) μΊμ‹œ κ°€λŠ₯μ„± : ν΄λΌμ΄μ–ΈνŠΈ λ˜λŠ” μ€‘κ°œμžμ— 일뢀 응닡을 μ €μž₯ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€μΈ 캐싱을 지원

5) μ˜¨λ””λ§¨λ“œ μ½”λ“œ : μ„œλ²„λŠ” ν΄λΌμ΄μ–ΈνŠΈ κΈ°λŠ₯을 μΌμ‹œμ μœΌλ‘œ ν™•μž₯ν•˜κ±°λ‚˜ μ‚¬μš©μž μ§€μ • κ°€λŠ₯

 

 

REST API 이점

 

ν™•μž₯μ„± μœ μ—°μ„± 독립성

 

 

μš©μ–΄ 정리

  • λ¦¬μ†ŒμŠ€(Resource): λ°μ΄ν„°μ˜ μΌλΆ€μž…λ‹ˆλ‹€. (예. user)
  • μ½œλ ‰μ…˜(Collection): λ¦¬μ†ŒμŠ€μ˜ μ§‘ν•©μž…λ‹ˆλ‹€. (예. users)
  • URL(Identifies the location): λ¦¬μ†ŒμŠ€ ν˜Ήμ€ μ½œλ ‰μ…˜μ„ 식별할 수 μžˆλŠ” κ²½λ‘œμž…λ‹ˆλ‹€

 

 

 

πŸ”—REST APIλ₯Ό λ””μžμΈν•˜λŠ” 방법

 

λ ˆμ˜€λ‚˜λ₯΄λ“œ λ¦¬μ°¨λ“œμŠ¨(Leonard Richardson) 4단계 λͺ¨λΈ

 

 

https://jaehoney.tistory.com/176

 

 

πŸ”—REST μ„±μˆ™λ„ λͺ¨λΈ - 0단계

 

REST APIλ₯Ό μž‘μ„±ν•˜κΈ° μœ„ν•œ κΈ°λ³Έ 단계

λ¦¬μ†ŒμŠ€ ꡬ뢄 없이 HTTP ν”„λ‘œν† μ½œμ„ μ‚¬μš©ν•˜κΈ°λ§Œ 해도 κ°€λŠ₯ν•˜λ‹€

 

ν•˜λ‚˜μ˜ End-pointλ₯Ό μ‚¬μš©ν•΄μ„œ HTTP Method도 λ°˜λ“œμ‹œ POSTκ°€ λœλ‹€

 

 

μ‚¬μš©μ˜ˆμ‹œ)

 

Reqest : μœ μ €λ₯Ό μš”μ²­ν•˜λ©΄

POST /api/user
{
  "function": "getUser",
  "arguments" [
    "1"
  ]
}

Resposne : μ½”λ“œλŠ” 200κ³Ό ν•¨κ»˜ μš”μ²­μ„ λ°›κ³ 

HTTP/1.1 200 OK
{
  "result" {
    "id": "1"
    "name": "honey",
  }
}

CRUD : HTTP Method도 λ°˜λ“œμ‹œ POSTκ°€ λœλ‹€

CREATE : POST /api/user
READ :   POST /api/user
UPDATE : POST /api/user
DELETE : POST /api/user

 

 

πŸ”—REST μ„±μˆ™λ„ λͺ¨λΈ - 1단계

 

λ¦¬μ†ŒμŠ€ κ°œλ…μ„ λ„μž…

λͺ¨λ“  μš”μ²­μ„ ν•˜λ‚˜μ˜ μ—”λ“œν¬μΈνŠΈ(λ„€νŠΈμ›Œν¬μ— μ—°κ²°ν•˜κ³  λ„€νŠΈμ›Œν¬λ₯Ό 톡해 ν†΅μ‹ ν•˜λŠ” λͺ¨λ“  λ””λ°”μ΄μŠ€)둜 λ³΄λ‚΄λŠ” 것

이 μ•„λ‹ˆλΌ κ°œλ³„ λ¦¬μ†ŒμŠ€μ™€ 톡신

μš”μ²­ν•˜κ³  받은 μžμ›μ— λŒ€ν•œ 정보λ₯Ό μ‘λ‹΅μœΌλ‘œ 전달해야 ν•œλ‹€λŠ” 것

 

HTTP MethodλŠ” GETκ³Ό POST만 μ‚¬μš©ν•˜κ³  μ½”λ“œλŠ” 200으둜 전달

 

 

μ‚¬μš©μ˜ˆμ‹œ)

 

Reqest : μ„ νƒν•œ μœ μ €μ˜ 유무λ₯Ό 물어보면

POST /api/users/create
{
  "name": "honey"
}

Resposne : μ½”λ“œλŠ” 200κ³Ό ν•¨κ»˜ μš”μ²­μ„ λ°›κ³ 

HTTP/1.1 200 OK
{
  "result" {
    "error": "already exist member"
  }
}

CRUD : GETκ³Ό POST만 μ‚¬μš©

CREATE : POST /api/users/create
READ :   GET /api/users/1
UPDATE : POST /api/users/update
DELETE : POST /api/users/remove/1

 

 

πŸ”—REST μ„±μˆ™λ„ λͺ¨λΈ - 2단계

 

 

2λ‹¨κ³„λŠ” CRUD에 맞게 μ μ ˆν•œ HTTP λ©”μ†Œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 것에 쀑점

쑰회(READ) -> GET, 생성(CREATE) -> POST

응닡 μ½”λ“œλ„ 201 Created둜 λͺ…ν™•ν•˜κ²Œ μž‘μ„±

ν˜„μž¬ κ°€μž₯ λ§Žμ€ REST APIκ°€ 이 단계에 ν•΄λ‹Ή

 

 

μ‚¬μš©μ˜ˆμ‹œ)

 

Reqest : μ„ νƒν•œ μœ μ €μ˜ 유무λ₯Ό 물어보면

POST /api/users/create
{
  "name": "honey"
}

Resposne : μ½”λ“œλŠ” 201κ³Ό ν•¨κ»˜ μš”μ²­μ„ λ°›κ³ 

HTTP/1.1 201 Created
Content-Type: application/json
{
  "result" {
    "id": "1",
    "name": "honey"
  }
}

CRUD : CREATE/READ/UPDATE/DELETE

CREATE : POST /api/users
READ :   GET /api/users/1
UPDATE : PUT /api/users/1
DELETE : DELETE /api/users/1

 

 

 

πŸ”—REST μ„±μˆ™λ„ λͺ¨λΈ - 3단계

 

HATEOAS(Hypertext As The Engine Of Application State)

ν•˜μ΄νΌλ―Έλ””μ–΄ μ»¨νŠΈλ‘€μ„ 적용

μš”μ²­μ€ 2단계와 동일 응닡은 URIλ₯Ό ν¬ν•¨ν•œ 링크 μš”μ†Œλ₯Ό μ‚½μž…ν•˜μ—¬ μž‘μ„±

응닡 내에 μƒˆλ‘œμš΄ 링크λ₯Ό λ„£μ–΄ μƒˆλ‘œμš΄ κΈ°λŠ₯을 μ ‘κ·Ό κ°€λŠ₯

 

μΆ”κ°€μ μœΌλ‘œ λ‹€μŒ Request에 ν•„μš”ν•œ End-pointκΉŒμ§€ μ œκ³΅μ„ ν•œλ‹€. μ΄λŠ” Uniform Interface의 HATEOASλ₯Ό 의미

 

 

μ‚¬μš©μ˜ˆμ‹œ)

 

Reqest

GET /api/

Resposne 

HTTP/1.1 200 OK
Content-Type: application/json
{
  "/api/users",
  "/api/users/{userId}/roles",
  "/api/products",
  "/api/..."
}

Reqest

GET /api/users/1

 

Resposne 

HTTP/1.1 200 OK
Content-Type: application/json
{
 "result" {
    "id": "1",
    "name": "honey",
    "_links": {
      "self" : {
        "href" : "https:/api/users/1"
      },
      "update" : {
        "href" : "https:/api/users/1"
      },
      "list" : {
        "href" : "https:/api/users/" // ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ ν₯λ―Έλ₯Ό 끌 수 μžˆλŠ” μš”μ†Œ
      },
  }
}

 

 

 

 

πŸ“OPEN API

 

λˆ„κ΅¬μ—κ²Œλ‚˜ μ ‘κ·Ό κ°€λŠ₯ν•œ API(이용 μˆ˜μΉ™ o, μ œν•œμ‚¬ν•­ o)

 

 

πŸ“ API Key

APIλ₯Ό μ΄μš©ν•˜κΈ° μœ„ν•΄μ„œλŠ” keyκ°€ ν•„μš”

μ„œλ²„ 문을 μ—¬λŠ” μ—΄μ‡ 

 

 

λ°˜μ‘ν˜•