REST API

REST๋ž€?๐Ÿ‘

`REST๋ž€ (Representational State Transfer) ์˜ ์•ฝ์ž`

์ž์›(resourece)์˜ ํ‘œํ˜„(representation)์œผ๋กœ ๊ตฌ๋ถ„ํ•˜์—ฌ ํ•ด๋‹น์žฅ์›์˜ ์ƒํƒœ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ชจ๋“ ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹คโœ๏ธ

  • ์ฆ‰ REST๋ž€
    • HTTP URI(Uniform Resource Identifier)๋ฅผ ํ†ตํ•ด ์ž์›(Resource)์„ ๋ช…์‹œํ•˜๊ณ ,
    • HTTP Method(POST, GET, PUT, DELETE)๋ฅผ ํ†ตํ•ด
    • ํ•ด๋‹น ์ž์›(URI)์— ๋Œ€ํ•œ CRUD Operation์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

CRUD Operation์ด๋ž€

CRUD๋Š” ๋Œ€๋ถ€๋ถ„์˜ ์ปดํ“จํ„ฐ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ๊ฐ€์ง€๋Š” ๊ธฐ๋ณธ์ ์ธ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ ๊ธฐ๋Šฅ์ธ Create(์ƒ์„ฑ), Read(์ฝ๊ธฐ), Update(๊ฐฑ์‹ ), Delete(์‚ญ์ œ)๋ฅผ ๋ฌถ์–ด์„œ ์ผ์ปซ๋Š” ๋ง๋กœ

REST์—์„œ์˜ CRUD Operation ๋™์ž‘ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

REST ๊ตฌ์„ฑ ์š”์†Œ

**REST๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ 3๊ฐ€์ง€๋กœ ๊ตฌ์„ฑ์ด ๋˜์–ด์žˆ๋‹ค.**

  • ์ž์›(Resource) : HTTP URI
  • ์ž์›์— ๋Œ€ํ•œ ํ–‰์œ„(Verb) : HTTP Method
  • ์ž์›์— ๋Œ€ํ•œ ํ–‰์œ„์˜ ๋‚ด์šฉ (Representations) : HTTP Message Pay Load

REST์˜ ํŠน์ง•

  • Server-Client(์„œ๋ฒ„-ํด๋ผ์ด์–ธํŠธ ๊ตฌ์กฐ)
  • Stateless(๋ฌด์ƒํƒœ)
  • Cacheable(์บ์‹œ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ)
  • Layered System(๊ณ„์ธตํ™”)
  • Uniform Interface(์ธํ„ฐํŽ˜์ด์Šค ์ผ๊ด€์„ฑ)

REST์˜ ์žฅ๋‹จ์ 

  • **์žฅ์ **
    • HTTP ํ”„๋กœํ† ์ฝœ์˜ ์ธํ”„๋ผ๋ฅผ ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ REST API ์‚ฌ์šฉ์„ ์œ„ํ•œ ๋ณ„๋„์˜ ์ธํ”„๋ผ๋ฅผ ๊ตฌ์ถœํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.
    • HTTP ํ”„๋กœํ† ์ฝœ์˜ ํ‘œ์ค€์„ ์ตœ๋Œ€ํ•œ ํ™œ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ์ถ”๊ฐ€์ ์ธ ์žฅ์ ์„ ํ•จ๊ป˜ ๊ฐ€์ ธ๊ฐˆ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ค€๋‹ค.
    • HTTP ํ‘œ์ค€ ํ”„๋กœํ† ์ฝœ์— ๋”ฐ๋ฅด๋Š” ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
    • Hypermedia API์˜ ๊ธฐ๋ณธ์„ ์ถฉ์‹คํžˆ ์ง€ํ‚ค๋ฉด์„œ ๋ฒ”์šฉ์„ฑ์„ ๋ณด์žฅํ•œ๋‹ค.
    • REST API ๋ฉ”์‹œ์ง€๊ฐ€ ์˜๋„ํ•˜๋Š” ๋ฐ”๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚ด๋ฏ€๋กœ ์˜๋„ํ•˜๋Š” ๋ฐ”๋ฅผ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์„œ๋น„์Šค ๋””์ž์ธ์—์„œ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ๋ฅผ ์ตœ์†Œํ™”ํ•œ๋‹ค.
    • ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ์˜ ์—ญํ• ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•œ๋‹ค.
  • **๋‹จ์ **
    • ํ‘œ์ค€์ด ์ž์ฒด๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์•„ ์ •์˜๊ฐ€ ํ•„์š”ํ•˜๋‹ค.
    • ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์†Œ๋“œ๊ฐ€ 4๊ฐ€์ง€๋ฐ–์— ์—†๋‹ค.
    • HTTP Method ํ˜•ํƒœ๊ฐ€ ์ œํ•œ์ ์ด๋‹ค.
    • ๋ธŒ๋ผ์šฐ์ €๋ฅผ ํ†ตํ•ด ํ…Œ์ŠคํŠธํ•  ์ผ์ด ๋งŽ์€ ์„œ๋น„์Šค๋ผ๋ฉด ์‰ฝ๊ฒŒ ๊ณ ์น  ์ˆ˜ ์žˆ๋Š” URL๋ณด๋‹ค Header ์ •๋ณด์˜ ๊ฐ’์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ „๋ฌธ์„ฑ์ด ์š”๊ตฌ๋œ๋‹ค.
    • ๊ตฌํ˜• ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ˜ธํ™˜์ด ๋˜์ง€ ์•Š์•„ ์ง€์›ํ•ด์ฃผ์ง€ ๋ชปํ•˜๋Š” ๋™์ž‘์ด ๋งŽ๋‹ค.(์ต์Šคํด๋กœ์–ด)
  • **REST API ์„ค๊ณ„ ์˜ˆ์‹œ** 1. URI๋Š” ๋™์‚ฌ๋ณด๋‹ค๋Š” ๋ช…์‚ฌ๋ฅผ, ๋Œ€๋ฌธ์ž๋ณด๋‹ค๋Š” ์†Œ๋ฌธ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์•ผ ํ•œ๋‹ค. Bad Example http://khj93.com/Running/
    Good Example http://khj93.com/run/ 2. ๋งˆ์ง€๋ง‰์— ์Šฌ๋ž˜์‹œ (/)๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค. Bad Example http://khj93.com/test/
    Good Example http://khj93.com/test 3. ์–ธ๋”๋ฐ” ๋Œ€์‹  ํ•˜์ดํฐ์„ ์‚ฌ์šฉํ•œ๋‹ค. Bad Example http://khj93.com/test_blog
    Good Example http://khj93.com/test-blog 4. ํŒŒ์ผํ™•์žฅ์ž๋Š” URI์— ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค. Bad Example http://khj93.com/photo.jpg
    Good Example http://khj93.com/photo

**REST API ์„ฑ์ˆ™๋„ ๋ชจ๋ธ (Maturity Model)**

Level 0 : 1 URI, 1 HTTP method

level 0์€ ์›น ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  HTTP๋ฅผ ์›๊ฒฉ ํ†ต์‹ ์„ ์œ„ํ•œ ์ „์†ก ์‹œ์Šคํ…œ์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค. RPC(Remote Precedure Call) ํ˜•ํƒœ๋กœ ๋ฆฌ์†Œ์Šค ๊ตฌ๋ถ„ ์—†์ด ์„ค๊ณ„๋œ HTTP API์ด๋‹ค.

๊ทธ์ € ๋‹จ์ˆœํ•˜๊ฒŒ POX(Plain Old XML)๋ฅผ ์ฃผ๊ณ  ๋ฐ›๋Š” RPC ์Šคํƒ€์ผ ์‹œ์Šคํ…œ์„ ๋งํ•œ๋‹ค. ๋‹จ ํ•˜๋‚˜์˜ endpoint๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , ์ „๋‹ฌ๋˜๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํ†ตํ•ด ํ•˜๋‚˜์˜ endpoint์—์„œ ์—ฌ๋Ÿฌ ๋™์ž‘์„ ํ•˜๊ฒŒ ๋œ๋‹ค. ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ body๋กœ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด HTTP method๋Š” POST๊ฐ€ ๋œ๋‹ค.

  • Request,Response,CRUD Request
    POST https://api/user
    {
      "function": "getUser",
      "arguments" [
        "1"
      ]
    }
    Response
    HTTP/1.1 200 OK
    {
      "result" {
      	"id": "1"
        "name": "yoonyoung",
      }
    }
    CRUD
    CREATE : POST /api/user
    READ :   POST /api/user
    UPDATE : POST /api/user
    DELETE : POST /api/user

Level 1 : N URI, 2 HTTP method

๋ฆฌ์†Œ์Šค๋ฅผ ๋„์ž…ํ•œ๋‹ค. ๋ชจ๋“  ์š”์ฒญ์„ ๋‹จ์ผ ์„œ๋น„์Šค endpoint๋กœ ๋ณด๋‚ด๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๊ฐœ๋ณ„ ๋ฆฌ์†Œ์Šค์™€ ํ†ต์‹ ํ•˜๊ฒŒ ๋œ๋‹ค. ๋ฆฌ์†Œ์Šค๋ณ„๋กœ ๊ณ ์œ ํ•œ URI๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์‹๋ณ„ํ•œ๋‹ค.

  • Request,Response,CRUD Request
    POST https://api/users/create
    {
      "name": "yoonyoung"
    }
    Response
    HTTP/1.1 200 OK
    {
      "result" {
        "error": "already exist member"
      }
    }
    CRUD
    CREATE : POST /api/users/create
    READ :   GET /api/users/1
    UPDATE : POST /api/users/update
    DELETE : POST /api/users/remove/1

HTTP method๋Š” GET๊ณผ POST๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ณ , Response์—์„œ๋Š” error์ธ ๊ฒฝ์šฐ์—๋„ Status Code๋ฅผ 200์œผ๋กœ ์ „๋‹ฌํ•˜๊ณ  ์žˆ๋‹ค. ๋˜ HTTP headers์— Content-Type์ด๋‚˜ Cache ๊ด€๋ จ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”๋‹ค.

Level 2 : N URI, 4 HTTP method

2๋‹จ๊ณ„์—์„œ๋Š” HTTP method์ธ GET, POST, PUT, DELETE๋ฅผ ์‚ฌ์šฉํ•ด CRUD๋ฅผ ๋‚˜ํƒ€๋‚ด๊ณ  ๋ฉ”์‹œ์ง€์— Status Code๋„ ๋‹ด๊ฒจ ๋ฐ˜ํ™˜ํ•œ๋‹ค. GET์€ ์ƒํƒœ๋ฅผ ๋ณ€ํ™”์‹œํ‚ค์ง€ ์•Š๋Š” ์•ˆ์ „ํ•œ Action์„ ๋‚˜ํƒ€๋‚ด๊ณ , ์•ˆ์ „ํ•˜๊ฒŒ ์–ผ๋งˆ๋“ ์ง€ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๊ณ  ๋งค๋ฒˆ ๊ฐ™์€ ๊ฒฐ๊ณผ๋ฅผ ์–ป๋„๋ก ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์บ์‹ฑ์„ ํ•  ์ˆ˜ ์žˆ์–ด ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ ์„ฑ๋Šฅ ํ–ฅ์ƒ๋„ ๋Š๋‚„ ์ˆ˜ ์žˆ๋‹ค.

์„ค๋ช…์—์„œ๋Š” GET, POST, PUT, DELETE์˜ 4๊ฐ€์ง€ CRUD๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๋‚˜์™€์žˆ์ง€๋งŒ, POST์™€ GET๋งŒ ์‚ฌ์šฉํ•ด๋„ ์ถฉ์กฑ๋˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

  • Request,Response,CRUD Request
    PUT https://api/users
    {
      "name": "yoonyoung"
    }
    Response
    HTTP/1.1 201 Created
    Content-Type: application/json
    {
      "result" {
        "id": "1",
        "name": "yoonyoung"
      }
    }
    CRUD
    CREATE : POST /api/users
    READ :   GET /api/users/1
    UPDATE : PUT /api/users/1
    DELETE : DELETE /api/users/1

2๋‹จ๊ณ„์—์„œ๋Š” URI์— action์ด ๋‹ด๊ธฐ์ง€ ์•Š๊ณ , ๋ฉฑ๋“ฑ์„ฑ์„ ๋ณด์žฅํ•˜๋Š” GET์—๋Š” ์บ์‹œ๊ฐ€ ์ ์šฉ๋œ๋‹ค. Response์—๋Š” ์˜๋ฏธ์žˆ๋Š” HTTP Status Code๊ฐ€ ๋ฐ˜ํ™˜๋œ๋‹ค. Status Code๋ฅผ ๋ชจ๋‘ ํ™œ์šฉํ•  ํ•„์š”๋Š” ์—†๊ณ , ํด๋ผ์ด์–ธํŠธ ์ž…์žฅ์—์„œ 200 OK์ธ์ง€, ํด๋ผ์ด์–ธํŠธ ์ž˜๋ชป(400 Bad Request) ์ธ์ง€, ์„œ๋ฒ„ ์ž˜๋ชป(500 Internal Server Error)์ธ์ง€ ์ •๋„๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋„๋ก ์ „๋‹ฌํ•ด์ฃผ๋ฉด ์ถฉ๋ถ„ํ•˜๋‹ค. ๋‹ค๋งŒ, ์‹คํŒจ์ผ ๊ฒฝ์šฐ Body์— ์™œ ์‹คํŒจํ–ˆ๋Š”์ง€ ์ •๋ณด๋ฅผ ๋ณด๋‚ด์ฃผ๋ฉด ์ข‹๋‹ค.

Level 3 : Hypermedia As Engine of Application State

3๋‹จ๊ณ„๊นŒ์ง€๋Š” ์™€์•ผ ์ง„์ •ํ•œ REST API๋ผ๊ณ  ํ•œ๋‹ค. API ์„œ๋น„์Šค์˜ ๋ชจ๋“  endpoint๋ฅผ ์ตœ์ดˆ ์ง„์ž…์ ์ด ๋˜๋Š” URI๋ฅผ ํ†ตํ•ด Hypertext Link ํ˜•ํƒœ๋กœ ์ œ๊ณตํ•œ๋‹ค. ์š”์ฆ˜ API๋Š” API ๋ฌธ์„œ๋ฅผ ์ œ๊ณตํ•˜์ง€๋งŒ ๋‹จ์ˆœํ•œ API ๋ชฉ๋ก ์ œ๊ณต๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์–ด๋–ค request์˜ ๋‹ค์Œ request์— ํ•„์š”ํ•œ endpoint๊นŒ์ง€ ์ œ๊ณตํ•œ๋‹ค. ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋‹ค์Œ์— ์–ด๋–ค ๋™์ž‘์ด ๊ฐ€๋Šฅํ•œ์ง€ ํžŒํŠธ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์Œ์— ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€, ๊ทธ๊ฒƒ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฃจ์–ด์•ผ ํ•  ๋ฆฌ์†Œ์Šค์˜ URI๋ฅผ ์•Œ๋ ค์ค„ ์ˆ˜ ์žˆ๋‹ค. ์„œ๋ฒ„๊ฐ€ ํด๋ผ์ด์–ธํŠธ์— ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค์ง€ ์•Š๊ณ  URI scheme์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค. ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋งํฌ URI๋ฅผ ์ฐพ๋Š” ๋™์•ˆ, ์„œ๋ฒ„ ํŒ€์€ ์ตœ์ดˆ ์ง„์ž…์ ์„ ์ œ์™ธํ•œ ๋ชจ๋“  URI ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๋‹ค.

  • Request,Response,CRUD,Response Request
    GET https://api/
    Response
    HTTP/1.1 200 OK
    Content-Type: application/json
    {
      "/api/users",
      "/api/users/{userId}/roles",
      "/api/products",
      "/api/..."
    }
    CRUD
    GET https://api/users/1
    Response
    HTTP/1.1 200 OK
    Content-Type: application/json
    {
     "result" {
        "id": "1",
        "name": "yoonyoung",
        "nextActions": {
           "/api/users/{userId}/roles",
         }
      }
    }

OPEN API ์™€ API KEY

Open API

Open API๋Š” ๋ง ๊ทธ๋Œ€๋กœ ๊ฐœ๋ฐฉํ˜• API

API๊ฐ€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐœ๋ฐœํ•  ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ž€ ์˜๋ฏธ์ด๋ฏ€๋กœ Open API๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐœ๋ฐฉ ์ƒํƒœ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋งํ•˜๊ณ  ์žˆ๋‹ค.

๋‹ค์Œ์ด๋‚˜ ๊ตฌ๊ธ€,๋„ค์ด๋ฒ„ ๋“ฑ์˜ ํฌํ„ธ์‚ฌ์ดํŠธ๋‚˜ ํ†ต๊ณ„์ฒญ,๊ธฐ์ƒ์ฒญ ๋“ฑ์—์„œ ์ˆ˜์ง‘ํ•œ ์ž๋ฃŒ๋ฅผ ์‘์šฉํ”„๋กœ๊ทธ๋ž˜๋ฐ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ œ๊ณตํ•˜๋Š” ์„œ๋น„์Šค์ด๋‹ค.

API KEY

API๋ฅผ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” API Key๊ฐ€ ํ•„์š”ํ•˜๋‹ค. API Key๋Š” ์„œ๋ฒ„์˜ ๋ฌธ์„ ์—ฌ๋Š” ์—ด์‡ ์ด๋‹ค. (์„œ๋ฒ„๋ฅผ ์šด์šฉํ•˜๋Š”๋ฐ ๋น„์šฉ์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์„œ๋ฒ„ ์ž…์žฅ์—์„œ๋Š” ์•„๋ฌด๋Ÿฐ ์กฐ๊ฑด ์—†์ด ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฐ์ดํ„ฐ ์ œ๊ณตํ•  ์˜๋ฌด X)

'codestates' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

Effect Hook ์‚ฌ์šฉํ•˜๊ธฐ  (0) 2022.06.20
URL & URI  (0) 2022.06.16
React Props, State  (0) 2022.06.13
React ๋ฆฌ์•กํŠธ ๋ผ์šฐํ„ฐ๋กœ SPA๊ฐœ๋ฐœ  (0) 2022.06.10
React intro  (0) 2022.06.09