ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • REST API - ๋‚˜๋งŒ์˜ ์–ธ์–ด๋กœ ๋ธ”๋กœ๊น… ํ•ด๋ณด๊ธฐ
    codeStates front-end/node(server) 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๊ฐ€ ํ•„์š”

    ์„œ๋ฒ„ ๋ฌธ์„ ์—ฌ๋Š” ์—ด์‡ 

     

     

    ๋ฐ˜์‘ํ˜•

    ๋Œ“๊ธ€

Designed by Tistory.