[React] RESTful API๋ž€?

jinyยท2025๋…„ 2์›” 7์ผ

๊ธฐ์ˆ  ๋ฉด์ ‘

๋ชฉ๋ก ๋ณด๊ธฐ
53/78

๐Ÿ—ฃ๏ธ RESTful API์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ด์ฃผ์„ธ์š”.

  • ์˜๋„: ์ง€์›์ž๊ฐ€ RESTful API์˜ ๊ฐœ๋…๊ณผ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ดํ•ดํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ‰๊ฐ€

  • ํŒ

    • REST์˜ ์ •์˜์™€ ์›์น™์„ ์„ค๋ช…ํ•œ๋‹ค.
    • RESTful API์˜ ์ฃผ์š” ํŠน์ง•๊ณผ HTTP ๋ฉ”์„œ๋“œ(GET, POST, PUT, DELETE)์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์–ธ๊ธ‰ํ•œ๋‹ค.
    • RESTful API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์˜ˆ์ œ๋ฅผ ๋– ์˜ฌ๋ ค ๋ณธ๋‹ค.
  • ๋‚˜์˜ ๋‹ต์•ˆ

    RESTful API๋Š” REST, ์ฆ‰ Representational State Transfer ์•„ํ‚คํ…์ฒ˜ ์Šคํƒ€์ผ์„ ๋”ฐ๋ฅด๋Š” API๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.
    REST์˜ ํ•ต์‹ฌ ์›์น™์€ ์ž์›์„ URI๋กœ ํ‘œํ˜„ํ•˜๊ณ , HTTP ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์ž์›์„ ์กฐ์ž‘ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

    RESTful API์˜ ํŠน์ง•์€ ๋ฌด์ƒํƒœ์„ฑ, ์ผ๊ด€๋œ ์ธํ„ฐํŽ˜์ด์Šค, ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ๋ถ„๋ฆฌ ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
    ์ด๋Ÿฐ ๊ตฌ์กฐ ๋•๋ถ„์— ํ”„๋ก ํŠธ์—”๋“œ์—์„œ๋Š” ๋ฐฑ์—”๋“œ์™€ ๋…๋ฆฝ์ ์œผ๋กœ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•˜๊ณ , ์ฝ”๋“œ์˜ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค.

  • ์ฃผ์–ด์ง„ ๋‹ต์•ˆ (๋ชจ๋ฒ” ๋‹ต์•ˆ)

    REST๋Š” Representational State Transfer์˜ ์•ฝ์ž๋กœ, ์ž์›์„ URI๋กœ ํ‘œํ˜„ํ•˜๊ณ  HTTP ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์กฐ์ž‘ํ•˜๋Š” ์•„ํ‚คํ…์ฒ˜ ์Šคํƒ€์ผ์ž…๋‹ˆ๋‹ค.
    RESTful API๋Š” ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ํ†ต์‹ ์„ ์œ„ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋กœ, ์ผ๊ด€์„ฑ๊ณผ ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

    GET์€ ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ๋•Œ, POST๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, PUT์€ ๋ฐ์ดํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ๋•Œ, DELETE๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์‚ญ์ œํ•  ๋•Œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.


๐Ÿ“ ๊ฐœ๋… ์ •๋ฆฌ

๐ŸŒŸ REST๋ž€?

  • REST(Representational State Transfer)๋Š” 2000๋…„ ๋กœ์ด ํ•„๋”ฉ(Roy Fiedling)์ด ๋ฐœํ‘œํ•œ ๋…ผ๋ฌธ์—์„œ ์ œ์•ˆํ•œ ์›น ์•„ํ‚คํ…์ฒ˜ ์Šคํƒ€์ผ์ด๋‹ค.
  • REST๋Š” ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๊ฐ„์˜ ํ†ต์‹ ์„ ๊ฐ„๊ฒฐํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ์›์น™๊ณผ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ •์˜ํ•œ๋‹ค.
  • RESTful API๋Š” ์ด๋Ÿฌํ•œ REST ์›์น™์„ ์ค€์ˆ˜ํ•˜์—ฌ ์„ค๊ณ„๋œ API๋ฅผ ์˜๋ฏธํ•œ๋‹ค.

๐ŸŒŸ REST์˜ ์ฃผ์š” ํŠน์ง•

RESTful API๋Š” ์•„๋ž˜ 6๊ฐ€์ง€ ์ œ์•ฝ ์กฐ๊ฑด์„ ์ค€์ˆ˜ํ•ด์•ผ ํ•œ๋‹ค.

  1. ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ๊ตฌ์กฐ (Client-Server Architecture)
    • ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„์˜ ์—ญํ• ์„ ๋ถ„๋ฆฌํ•˜์—ฌ ํ™•์žฅ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ธ๋‹ค.
    • ํด๋ผ์ด์–ธํŠธ๋Š” UI/UX๋ฅผ ๋‹ด๋‹นํ•˜๊ณ , ์„œ๋ฒ„๋Š” ๋ฐ์ดํ„ฐ ์ €์žฅ ๋ฐ ๋กœ์ง ์ฒ˜๋ฆฌ๋ฅผ ๋‹ด๋‹นํ•œ๋‹ค.
    • ์„œ๋ฒ„๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด๋„ ํด๋ผ์ด์–ธํŠธ์—๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋„๋ก ๋…๋ฆฝ์ ์œผ๋กœ ์„ค๊ณ„ํ•œ๋‹ค.
  1. ๋ฌด์ƒํƒœ์„ฑ (Stateless)
    • ์„œ๋ฒ„๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • ๊ฐ ์š”์ฒญ(Request)์€ ๋…๋ฆฝ์ ์ด๋ฉฐ, ํ•„์š”ํ•œ ๋ชจ๋“  ์ •๋ณด๋ฅผ ํฌํ•จํ•ด์•ผ ํ•œ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, ์„ธ์…˜(session) ๋Œ€์‹  ํ† ํฐ ๊ธฐ๋ฐ˜ ์ธ์ฆ(JWT, OAuth)์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ธ์ฆ ์ •๋ณด๋ฅผ ์ง์ ‘ ๊ด€๋ฆฌํ•˜๋„๋ก ์„ค๊ณ„ํ•  ์ˆ˜ ์žˆ๋‹ค.
  1. ์บ์‹œ ๊ฐ€๋Šฅ (Cacheable)
    • ์‘๋‹ต(Response)์— ์บ์‹ฑ ๊ฐ€๋Šฅ ์—ฌ๋ถ€๋ฅผ ๋ช…์‹œํ•˜์—ฌ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด, HTTP ์‘๋‹ต ํ—ค๋”์— Cache-Control, ETag ๋“ฑ์„ ์„ค์ •ํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์บ์‹ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
  1. ๊ณ„์ธตํ™”๋œ ์‹œ์Šคํ…œ (Layered System)
    • ํด๋ผ์ด์–ธํŠธ๋Š” API ์„œ๋ฒ„์™€ ์ง์ ‘ ํ†ต์‹ ํ•˜์ง€๋งŒ, ๋‚ด๋ถ€์ ์œผ๋กœ๋Š” ์—ฌ๋Ÿฌ ๊ณ„์ธต(์˜ˆ: ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ, ํ”„๋ก์‹œ, ์ธ์ฆ ์„œ๋ฒ„ ๋“ฑ)์ด ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์ด๋Ÿฌํ•œ ๊ณ„์ธตํ™” ๊ตฌ์กฐ๋Š” ๋ณด์•ˆ ๊ฐ•ํ™” ๋ฐ ํ™•์žฅ์„ฑ ์ฆ๊ฐ€์— ๋„์›€์„ ์ค€๋‹ค.
  1. ์ธํ„ฐํŽ˜์ด์Šค ์ผ๊ด€์„ฑ (Uniform Interface)
    • RESTful API๋Š” ์ผ๊ด€๋œ URI ๋ฐ ์š”์ฒญ ๋ฐฉ์‹์„ ์œ ์ง€ํ•ด์•ผ ํ•œ๋‹ค.
    • ์ฃผ์š” ์›์น™
      • ์ž์›(Resource)์„ ์‹๋ณ„ํ•˜๋Š” ๊ณ ์œ ํ•œ URI
      • HTTP ๋ฉ”์„œ๋“œ(GET, POST, PUT, DELETE)์˜ ๋ช…ํ™•ํ•œ ์‚ฌ์šฉ
      • Self-descriptive ๋ฉ”์‹œ์ง€ (๋ช…ํ™•ํ•œ ์š”์ฒญ๊ณผ ์‘๋‹ต ๊ตฌ์กฐ)
      • HATEOAS(Hypermedia As The Engine Of Application State) ์ ์šฉ ๊ฐ€๋Šฅ

        โญ HATEOAS๋ž€?
        HATEOAS๋Š” RESTful API์˜ ์›์น™ ์ค‘ ํ•˜๋‚˜๋กœ, ํด๋ผ์ด์–ธํŠธ๊ฐ€ API์˜ ์‘๋‹ต์„ ํ†ตํ•ด ๋‹ค์Œ์— ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์•ก์…˜(๋งํฌ)์„ ๋™์ ์œผ๋กœ ์•Œ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฐœ๋…์ด๋‹ค.
        ์ฆ‰, API ์‘๋‹ต์ด ๋‹จ์ˆœํ•œ ๋ฐ์ดํ„ฐ๋งŒ์ด ์•„๋‹ˆ๋ผ, ๊ด€๋ จ๋œ ์•ก์…˜์„ ํฌํ•จํ•˜๋Š” ํ•˜์ดํผ๋ฏธ๋””์–ด(hypermedia)๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•œ๋‹ค๋Š” ์›์น™์ด๋‹ค.

        โญ HATEOAS ๊ฐœ๋… ์ •๋ฆฌ

        • HATEOAS์˜ ํ•ต์‹ฌ ์•„์ด๋””์–ด
          ๐Ÿ’– ํด๋ผ์ด์–ธํŠธ๋Š” API์˜ ์—”๋“œํฌ์ธํŠธ(URL)๋ฅผ ์‚ฌ์ „์— ๋ชฐ๋ผ๋„ ๋œ๋‹ค.
          ๐Ÿ’– ์„œ๋ฒ„๊ฐ€ ์‘๋‹ต์— ๊ด€๋ จ๋œ ๋งํฌ๋ฅผ ํฌํ•จํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ž๋™์œผ๋กœ ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
          ๐Ÿ’– RESTful API์—์„œ ํ•˜์ดํผ๋งํฌ๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฆฌ์†Œ์Šค ๊ฐ„์˜ ๊ด€๊ณ„๋ฅผ ํ‘œํ˜„ํ•œ๋‹ค.
        • ์˜ˆ์ œ ์—†์ด ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•˜๋ฉด?
          ๐Ÿ’– ์›น์‚ฌ์ดํŠธ์—์„œ ํ•˜๋‚˜์˜ ๋งํฌ๋ฅผ ํด๋ฆญํ•˜๋ฉด ๋‹ค์Œ ๋™์ž‘(ํŽ˜์ด์ง€ ์ด๋™, ๋” ๋ณด๊ธฐ ๋“ฑ)์ด ๊ฐ€๋Šฅํ•˜๋“ฏ์ด,
          ๐Ÿ’– API ์‘๋‹ต์—์„œ๋„ ํ˜„์žฌ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์ •๋ณด + ๋‹ค์Œ ์š”์ฒญ์„ ์œ„ํ•œ ๋งํฌ๋ฅผ ํฌํ•จํ•˜๋Š” ๋ฐฉ์‹

        โญ HATEOAS ์ ์šฉ ์˜ˆ์ œ

        • HATEOAS ์—†์ด ์ผ๋ฐ˜์ ์ธ REST API ์‘๋‹ต
          {
            "id": 1,
            "name": "์ด์ˆœ์‹ ",
            "email": "lee@example.com"
          }
          ๋ฌธ์ œ์ 
          ๐Ÿ’– ํด๋ผ์ด์–ธํŠธ๊ฐ€ "์ด์ˆœ์‹ "์˜ ์ •๋ณด๋ฅผ ์ˆ˜์ •ํ•˜๋ ค๋ฉด ์‚ฌ์ „์— ์—”๋“œํฌ์ธํŠธ(/users/1/edit ๋“ฑ)๋ฅผ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•œ๋‹ค.
          ๐Ÿ’– API๊ฐ€ ํ™•์žฅ๋  ๊ฒฝ์šฐ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋„ ๋ณ€๊ฒฝํ•ด์•ผ ํ•œ๋‹ค.
        • HATEOAS๋ฅผ ์ ์šฉํ•œ REST API ์‘๋‹ต
          {
            "id": 1,
            "name": "์ด์ˆœ์‹ ",
            "email": "lee@example.com",
            "_links": {
              "self": { "href": "/users/1" },
              "edit": { "href": "/users/1/edit" },
              "delete": { "href": "/users/1/delete" },
              "orders": { "href": "/users/1/orders" }
            }
          }
          ๊ฐœ์„ ๋œ ์ 
          ๐Ÿ’– API ์‘๋‹ต์— ์‚ฌ์šฉ์ž๊ฐ€ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์•ก์…˜์„ ํฌํ•จํ•œ๋‹ค.
          ๐Ÿ’– ํด๋ผ์ด์–ธํŠธ๋Š” ์‘๋‹ต๋งŒ ๋ณด๊ณ ๋„ ๋‹ค์Œ ๋™์ž‘(์ˆ˜์ •, ์‚ญ์ œ, ์ฃผ๋ฌธ ๋ณด๊ธฐ ๋“ฑ)์„ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
          ๐Ÿ’– API ๊ตฌ์กฐ๊ฐ€ ๋ฐ”๋€Œ์–ด๋„ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•˜๋“œ์ฝ”๋”ฉํ•œ URL์„ ๋ฐ”๊พธ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

        โญ HATEOAS์˜ ์žฅ์ 

        1. ํด๋ผ์ด์–ธํŠธ์˜ ์œ ์—ฐ์„ฑ ์ฆ๊ฐ€
          API ๊ตฌ์กฐ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚˜๋„, ํด๋ผ์ด์–ธํŠธ๋Š” ์„œ๋ฒ„์˜ ์‘๋‹ต์„ ์ฐธ๊ณ ํ•˜์—ฌ ๋™์ ์œผ๋กœ API๋ฅผ ํƒ์ƒ‰ํ•œ๋‹ค.
        2. ๋ฌธ์„œํ™” ํ•„์š”์„ฑ์ด ์ค„์–ด๋“ฆ
          API ์‘๋‹ต ๋‚ด์— ๊ฐ€๋Šฅํ•œ ์•ก์…˜(๋งํฌ)์„ ํฌํ•จํ•˜๋ฏ€๋กœ, ๋ช…์‹œ์ ์ธ API ๋ฌธ์„œ ์—†์ด๋„ ์‚ฌ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.
        3. REST์˜ ์ž์œจ ํƒ์ƒ‰์„ฑ(self-discoverability) ๋ณด์žฅ
          ํด๋ผ์ด์–ธํŠธ๋Š” ์‚ฌ์ „ ์ง€์‹ ์—†์ด๋„ API๋ฅผ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

        โญ HATEOAS์˜ ๋‹จ์ 

        1. ์‘๋‹ต ํฌ๊ธฐ๊ฐ€ ์ปค์ง
          ๋งํฌ ์ •๋ณด๋ฅผ ํฌํ•จํ•˜๋‹ค ๋ณด๋‹ˆ, ์ผ๋ฐ˜์ ์ธ JSON ์‘๋‹ต๋ณด๋‹ค ๋ฐ์ดํ„ฐ๊ฐ€ ์ฆ๊ฐ€ํ•œ๋‹ค.
        2. ๊ตฌํ˜„์ด ๋ณต์žก
          ์„œ๋ฒ„์—์„œ ๊ฐ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด ์ ์ ˆํ•œ ๋งํฌ๋ฅผ ๋™์ ์œผ๋กœ ์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค.
        3. REST API๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์˜ค๋ฒ„ํ—ค๋“œ ๋ฐœ์ƒ
          ํ•„์š”ํ•œ ๋งํฌ๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ API ํ˜ธ์ถœ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋‹ค.
  1. ์ฝ”๋“œ ์˜จ ๋””๋งจ๋“œ (Code on Demand, ์„ ํƒ์ )
    • ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ•„์š”ํ•  ๋•Œ ์„œ๋ฒ„์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ฝ”๋“œ๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๋Š” ๊ธฐ๋Šฅ (์˜ˆ: JavaScript ์ฝ”๋“œ)
    • ํ•˜์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์˜ RESTful API์—์„œ๋Š” ํ•„์ˆ˜ ์š”์†Œ๊ฐ€ ์•„๋‹ˆ๋‹ค.

๐ŸŒŸ RESTful API์˜ ๊ตฌ์„ฑ ์š”์†Œ

RESTful API๋Š” ๋ฆฌ์†Œ์Šค(Resource)๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์„ค๊ณ„๋˜๋ฉฐ, HTTP ํ‘œ์ค€์„ ํ™œ์šฉํ•œ๋‹ค.

  1. ์ž์›(Resource)
    URI(Uniform Resource Identifier)๋ฅผ ํ†ตํ•ด ์‹๋ณ„๋œ๋‹ค.
    • ์˜ˆ์ œ
      https://api.example.com/users/123
      • /users/123 : ID๊ฐ€ 123์ธ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ์˜๋ฏธ
  1. HTTP ๋ฉ”์„œ๋“œ
    RESTful API๋Š” HTTP ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ CRUD(Create, Read, Update, Delete) ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.

    HTTP ๋ฉ”์„œ๋“œ๋ชฉ์ ์„ค๋ช…
    GET์กฐํšŒ(Read)๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒ
    POST์ƒ์„ฑ(Create)์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑ
    PUT์ „์ฒด ์ˆ˜์ •(Update)ํŠน์ • ๋ฆฌ์†Œ์Šค๋ฅผ ์ „์ฒด ์—…๋ฐ์ดํŠธ
    PATCH๋ถ€๋ถ„ ์ˆ˜์ •(Update)ํŠน์ • ๋ฆฌ์†Œ์Šค๋ฅผ ๋ถ€๋ถ„ ์—…๋ฐ์ดํŠธ
    DELETE์‚ญ์ œ(Delete)ํŠน์ • ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ญ์ œ
    • ์˜ˆ์ œ: /users/123 ์ž์›์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ž‘์—…
      • GET /users/123 : ID๊ฐ€ 123์ธ ์‚ฌ์šฉ์ž ์ •๋ณด ์กฐํšŒ
      • POST /users : ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž ์ƒ์„ฑ
      • PUT /users/123 : ID๊ฐ€ 123์ธ ์‚ฌ์šฉ์ž ์ •๋ณด ์ „์ฒด ์ˆ˜์ •
      • PATCH /users/123 : ID๊ฐ€ 123์ธ ์‚ฌ์šฉ์ž ์ •๋ณด ์ผ๋ถ€ ์ˆ˜์ •
      • DELETE /users/123 : ID๊ฐ€ 123์ธ ์‚ฌ์šฉ์ž ์‚ญ์ œ

๐ŸŒŸ RESTful API์˜ ์„ค๊ณ„ ์›์น™ (Best Practices)

  1. ๋ช…ํ™•ํ•˜๊ณ  ์ผ๊ด€๋œ URI ์„ค๊ณ„
    • ๋ฆฌ์†Œ์Šค๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ช…์‚ฌ ์‚ฌ์šฉ (๋™์‚ฌ X)
      โŒ /getUser
      โœ… /users/{ID}
    • ๋ณต์ˆ˜ํ˜•์„ ์‚ฌ์šฉํ•˜์—ฌ ์ผ๊ด€์„ฑ ์œ ์ง€
      โŒ /user
      โœ… /users
    • ๊ณ„์ธต ๊ตฌ์กฐ๋ฅผ ๋ฐ˜์˜ํ•˜์—ฌ URI ์„ค๊ณ„
      โœ… /users/{id}/orders โžก๏ธ ํŠน์ • ์‚ฌ์šฉ์ž์˜ ์ฃผ๋ฌธ ๋ชฉ๋ก ์กฐํšŒ
  1. HTTP ์ƒํƒœ ์ฝ”๋“œ(Status Code) ํ™œ์šฉ
    RESTful API๋Š” ์ ์ ˆํ•œ HTTP ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•œ๋‹ค.

    ์ƒํƒœ ์ฝ”๋“œ์˜๋ฏธ์„ค๋ช…
    200 OK์„ฑ๊ณต์š”์ฒญ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ฒ˜๋ฆฌ๋จ
    201 Created์ƒ์„ฑ ์™„๋ฃŒ์ƒˆ๋กœ์šด ๋ฆฌ์†Œ์Šค๊ฐ€ ์ƒ์„ฑ๋จ
    204 No Content์„ฑ๊ณต (์‘๋‹ต ๋ณธ๋ฌธ ์—†์Œ)์š”์ฒญ ์„ฑ๊ณต, ํ•˜์ง€๋งŒ ๋ฐ˜ํ™˜ํ•  ๋ฐ์ดํ„ฐ ์—†์Œ
    400 Bad Request์ž˜๋ชป๋œ ์š”์ฒญํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์ด ์ž˜๋ชป๋จ
    401 Unauthorized์ธ์ฆ ์‹คํŒจ์ธ์ฆ๋˜์ง€ ์•Š์€ ์‚ฌ์šฉ์ž
    403 Forbidden์ ‘๊ทผ ๊ฑฐ๋ถ€๊ถŒํ•œ์ด ์—†์Œ
    404 Not Found๋ฆฌ์†Œ์Šค ์—†์Œ์š”์ฒญํ•œ ์ž์›์ด ์กด์žฌํ•˜์ง€ ์•Š์Œ
    409 Conflict์ถฉ๋Œ ๋ฐœ์ƒ์ค‘๋ณต๋œ ๋ฐ์ดํ„ฐ ๋˜๋Š” ์ถฉ๋Œ ๋ฐœ์ƒ
    500 Internet Server Error์„œ๋ฒ„ ์˜ค๋ฅ˜์„œ๋ฒ„ ๋‚ด๋ถ€ ์˜ค๋ฅ˜
    • ์˜ˆ์ œ
      • GET /users/99999 (์กด์žฌํ•˜์ง€ ์•Š๋Š” ์‚ฌ์šฉ์ž) โ†’ 404 Not Found
      • POST /users (ํ•„์ˆ˜ ํ•„๋“œ ๋ˆ„๋ฝ) โ†’ 400 Bad Request
      • DELETE /users/123 (์‚ญ์ œ ์„ฑ๊ณต) โ†’ 204 No Content
  1. JSON์„ ๊ธฐ๋ณธ ์‘๋‹ต ํ˜•์‹์œผ๋กœ ์‚ฌ์šฉ
    ๋Œ€๋ถ€๋ถ„์˜ RESTful API๋Š” JSON์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š”๋‹ค.
    • ์‘๋‹ต ์˜ˆ์ œ
      {
        "id": 123,
        "name": "ํ™๊ธธ๋™",
        "email": "hong@example.com"
      }
    • ์‘๋‹ต ํ—ค๋”์— JSON ๋ช…์‹œ
      Content-Type: application/json
  1. ํ•„ํ„ฐ๋ง, ์ •๋ ฌ, ํŽ˜์ด์ง• ์ง€์›
    ๋Œ€๋Ÿ‰์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๊ฒฝ์šฐ ํ•„ํ„ฐ๋ง, ์ •๋ ฌ, ํŽ˜์ด์ง•์ด ํ•„์š”ํ•˜๋‹ค.
    • ํ•„ํ„ฐ๋ง: GET /users?role=admin
    • ์ •๋ ฌ: GET /users?sort=name,desc
    • ํŽ˜์ด์ง•: GET /users?page=2&size=20

๐ŸŒŸ ๊ฒฐ๋ก 

RESTful API๋Š” ๊ฐ„๊ฒฐํ•˜๊ณ  ํ™•์žฅ์„ฑ์ด ๋›ฐ์–ด๋‚˜๋ฉฐ, HTTP ํ‘œ์ค€์„ ํ™œ์šฉํ•˜์—ฌ ํšจ๊ณผ์ ์ธ ํด๋ผ์ด์–ธํŠธ-์„œ๋ฒ„ ํ†ต์‹ ์„ ์ œ๊ณตํ•œ๋‹ค.
์˜ฌ๋ฐ”๋ฅธ RESTful API ์„ค๊ณ„๋ฅผ ์œ„ํ•ด์„œ๋Š” URI ๋ช…๋ช… ๊ทœ์น™, HTTP ๋ฉ”์„œ๋“œ ํ™œ์šฉ, ์ƒํƒœ ์ฝ”๋“œ ๋ฐ˜ํ™˜, JSON ์‘๋‹ต ํ˜•์‹ ๋“ฑ์˜ ์›์น™์„ ์ž˜ ๋”ฐ๋ฅด๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•˜๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€