Updated:

์†”์งํžˆ ์•„์ง ์ œ๋Œ€๋กœ ์ดํ•ดํ•˜๊ณ  ์žˆ์ง€ ์•Š์€ ๋ถ€๋ถ„๋„ ์žˆ๊ณ  ๋‚ด์šฉ๋„ ๋ถ€์กฑํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์—
๋‚˜์ค‘์— ๋‹ค์‹œ ๊ณต๋ถ€ํ•˜๊ฒŒ๋˜๋ฉด ์ˆ˜์ •ํ•ด์•ผํ•  ๊ฒƒ ๊ฐ™๋‹ค.

API ๋ž€?

API๋Š” Application Programing Interface์˜ ์•ฝ์ž๋กœ,
โ€œ์ปดํ“จํ„ฐ๋‚˜ ์ปดํ“จํ„ฐ ํ”„๋กœ๊ทธ๋žจ ์‚ฌ์ด์˜ ์—ฐ๊ฒฐ์ด๋‹ค. ์ผ์ข…์˜ ์†Œํ”„ํŠธ์›จ์–ด ์ธํ„ฐํŽ˜์ด์Šค์ด๋ฉฐ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ์†Œํ”„ํŠธ์›จ์–ด์— ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•œ๋‹ค.โ€ ๋ผ๊ณ  ์œ„ํ‚ค๋ฐฑ๊ณผ ๋‚˜์˜ค์ง€๋งŒโ€ฆ ์ด๋ ‡๊ฒŒ ๋ด์„œ๋Š” ์ดํ•ดํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์šธ ๊ฒƒ ๊ฐ™๋‹ค. (๋‚˜๋„..)
์ •ํ™•ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ์•„์ฃผ ์‰ฝ๊ฒŒ ์ดํ•ดํ•˜๋„๋ก ์„ค๋ช…์„ ํ•ด๋ณด์ž๋ฉด, ์–ด๋–ค ํ”„๋กœ๊ทธ๋žจ์ด ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋žจ๊ณผ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ๋Š” ๋งค๊ฐœ์ฒด๋ฅผ ๋งํ•œ๋‹ค.

์˜ˆ๋ฅผ๋“ค์–ด ๋‚ด๊ฐ€ ์–ด๋–ค ๊ฒŒ์ž„ ์‚ฌ์ดํŠธ์—์„œ ๋žญํ‚น ํŽ˜์ด์ง€๋ฅผ ๋ณธ๋‹ค๊ณ  ํ•ด๋ณด์ž. ๊ทธ ์‚ฌ์ดํŠธ ๋ฉ”๋‰ด๋“ค ์ค‘์— โ€˜๋žญํ‚นโ€™ ์ด๋ผ๋Š” ํŽ˜์ด์ง€์˜ ๋ฒ„ํŠผ์ด ์žˆ์„ ๊ฒƒ์ด๋‹ค. ์ด ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ๋‚ด๋ถ€์—์„œ๋Š” โ€œ๊ฒŒ์ž„ ์‚ฌ์ดํŠธ์˜ ์„œ๋ฒ„์—๊ฒŒ [๋žญํ‚น ๋ชฉ๋ก ๋ณด์—ฌ์ฃผ๊ธฐ API]๋ฅผ ์š”์ฒญํ•ฉ๋‹ˆ๋‹คโ€ ๋ผ๋Š” ์ฝ”๋“œ๊ฐ€ ๋™์ž‘ํ•˜๊ณ ,
๊ฒŒ์ž„ ์‚ฌ์ดํŠธ์˜ ์„œ๋ฒ„๋Š” ํ•ด๋‹น API ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด ๋žญํ‚น ๋ฐ์ดํ„ฐ๋“ค์„ ์‘๋‹ต ํ•œ๋‹ค(๋ณด๋‚ด์ค€๋‹ค). ์„œ๋ฒ„์—๊ฒŒ ๋žญํ‚น ๋ฐ์ดํ„ฐ๋“ค์„ ๋ฐ›๊ฒŒ๋˜๋ฉด ๋‚ด ํ™”๋ฉด์—์„œ๋Š” ๊ทธ ๋ฐ์ดํ„ฐ๋“ค๋กœ ๋žญํ‚น ํ™”๋ฉด์ด ํ‘œ์‹œ๋˜๊ฒŒ ๋œ๋‹ค. ์ด์ฒ˜๋Ÿผ ํ•ญ์ƒ ์š”์ฒญ๊ณผ ์‘๋‹ต์ด ์กด์žฌํ•˜๊ณ  ์ƒํ˜ธ์ž‘์šฉ์„ ํ•˜๊ฒŒ๋œ๋‹ค.

์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์š”์ฒญ์„ ํ•ด์•ผ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ฐ API ๋งˆ๋‹ค ๊ทœ๊ฒฉ๊ณผ ๊ทœ์น™์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๊ธฐ์ƒ์ฒญ API ๊ฐ™์€ ๊ณต๊ณต API์™€ ๋„ค์ด๋ฒ„์ง€๋„, Kakao๋งต ๋“ฑ ๊ณต๊ฐœ๋œ API๋“ค์€ ์ด๋ฅผ API Docs(Documents) ๋กœ ๋ฌธ์„œ/๋ฉ”๋‰ด์–ผ๋กœ ๊ณต๊ฐœํ•ด์„œ ์‚ฌ์šฉ์ž๋“ค์ด ์ž˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•œ๋‹ค.

REST API๋ž€? (Representational State Transfer)

2000๋…„๋„ ๋กœ์ด ํ•„๋”ฉ (Roy Fielding) ์˜ ๋ฐ•์‚ฌํ•™์œ„ ๋…ผ๋ฌธ์—์„œ ์ตœ์ดˆ๋กœ ์†Œ๊ฐœ๋œ โ€˜์›น์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ณ  ์ฒ˜๋ฆฌํ•˜๋Š” ์„ค๊ณ„๋ฐฉ์‹โ€™ ์„ ๋งํ•œ๋‹ค. ๋Œ€ํ‘œ์ ์ธ 2๊ฐ€์ง€ ์„ฑ๊ฒฉ์„ ๋ณด๋ฉด

  1. URI๋งŒ ๋ณด๊ณ ๋„ ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋ฅผ ์•Œ ์ˆ˜ ์žˆ๊ฒŒ ์ฃผ์†Œ๋ฅผ ์ž‘์„ฑํ•˜๊ธฐ โ€œhttps://school.com/class/02/student/24โ€ ๋งŒ ๋ณด๊ณ ๋„ ๋Œ€๋žต์ ์œผ๋กœ โ€œ์–ด๋–ค ํ•™๊ต ํ™ˆํŽ˜์ด์ง€์— 2๋ฐ˜ 24๋ฒˆ ํ•™์ƒ์— ๋Œ€ํ•œ ํŽ˜์ด์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๊ฒƒ ๊ฐ™๊ตฐ!โ€์ด๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค๊ฒŒ๋” ํ•œ๋ˆˆ์— ์ดํ•ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹จ์–ด์˜ ์„ ํƒ๋„ add, find, delete ์ฒ˜๋Ÿผ ๋™์‚ฌ๊ฐ€ ์•„๋‹ˆ๋ผ ๋ช…์‚ฌ๋งŒ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

  2. ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ๋Š” HTTP Method(GET, POST, PUT, DELETE)๋กœ ํ‘œํ˜„ํ•˜๊ธฐ
    Create: ๋ฐ์ดํ„ฐ ์ƒ์„ฑ (POST)
    Read: ๋ฐ์ดํ„ฐ ์กฐํšŒ (GET)
    Update: ๋ฐ์ดํ„ฐ ์ˆ˜์ • (PUT)
    Delete: ๋ฐ์ดํ„ฐ ์‚ญ์ œ (DELETE)

์ด๋Ÿฐ ํ˜•์‹์ด๋‹ค. ์œ„์— 1, 2๋ฒˆ์„ ํ•ฉ์ณ์„œ ์ •๋ฆฌํ•ด๋ณด๋ฉด โ€œ์–ด๋–ค ํ•™๊ต ํ™ˆํŽ˜์ด์ง€์—์„œ 2๋ฐ˜ 24๋ฒˆ ํ•™์ƒ์˜ ์ •๋ณด๋ฅผ ์ถ”๊ฐ€โ€ํ•˜๋Š” ํŽ˜์ด์ง€๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•  ๋•Œ, ์ด ํŽ˜์ด์ง€๋Š”
โ€œhttps://school.com/addData/class/02/student/24โ€ ์ด๋Ÿฐ์‹์œผ๋กœ ๋งŒ๋“ค๊ธฐ ๋ณด๋‹ค๋Š”,
[์š”์ฒญ์€: Create] [ํŽ˜์ด์ง€๋Š”: โ€œhttps://school.com/class/02/student/24โ€] ์ด๋Ÿฐ์‹์œผ๋กœ ๊ตฌ์„ฑ์„ ๋งŒ๋“ค์ž๋Š” ๊ฒƒ์ด๋‹ค.
์ด๋ ‡๊ฒŒ REST์˜ ๊ทœ์น™์„ ์ž˜ ์ง€ํ‚ค๋ฉฐ ๋งŒ๋“  ๊ตฌ์กฐ๋ฅผ โ€œRESTful ํ•˜๋‹คโ€๋ผ๊ณ  ํ‘œํ˜„ํ•˜๊ณ  ์ด๋ฅผ REST API ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

๋„์›€๋˜๋Š” ๊ธ€:
https://www.ibm.com/kr-ko/cloud/learn/rest-apis
https://www.youtube.com/watch?v=4DxHX95Lq2U

GraphQL ์ด๋ž€? (Graph Query Language)

GraphQL ์€ ํŽ˜์ด์Šค๋ถ์ด ๊ฐœ๋ฐœํ•œ ์ฟผ๋ฆฌ์–ธ์–ด์ด๋‹ค. ์ฟผ๋ฆฌ๋ฌธ์˜ ์ž‘์„ฑ์ด ์ง๊ด€์ ์ด๋ฉฐ API๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ฟผ๋ฆฌ๋ฌธ์„ ์›ํ•˜๋Š” ํ˜•์‹์œผ๋กœ ์ž‘์„ฑํ•˜์—ฌ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ ์‘๋‹ต๋ฐ›๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.
GraphQL ๊ตฌ์กฐ์—๋Š” ํฌ๊ฒŒ Query ์™€ Mutation ๋‘๊ฐ€์ง€๊ฐ€ ์žˆ๋Š”๋ฐ, Query ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๋Š”(Read)๋ฐ์— ์‚ฌ์šฉํ•˜๊ณ , Mutation ์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑ/์ˆ˜์ •/์‚ญ์ œ(Creat/Update/Delete) ํ•˜๋Š”๋ฐ์— ์‚ฌ์šฉ๋œ๋‹ค.

Apollo Server?

Apollo Server๋Š” GraphQL ๊ธฐ๋ฐ˜์˜ ์„œ๋ฒ„๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ํ”„๋ก ํŠธ์™€ ๋ฐฑ์—”๋“œ์—์„œ ๋ชจ๋‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
GraphQL Playground ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Apollo Server ๋‚ด์˜ API๋“ค์„ ๋ฉ”๋‰ด์–ผ์ฒ˜๋Ÿผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

GraphQL ๊ณผ REST API ๋น„๊ต

1. Endpoint์˜ ์ฐจ์ด

REST API ๋Š” URL ๊ณผ HTTP Method ๋“ฑ์„ ์กฐํ•ฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์–‘ํ•œ Endpoint๊ฐ€ ์กด์žฌํ•˜๋Š” ๋ฐ˜๋ฉด, GraphQL ์€ ๋‹จ ํ•˜๋‚˜์˜ Endpoint๊ฐ€ ์กด์žฌํ•œ๋‹ค.

  • REST API
// 3๋ฐ˜ 19๋ฒˆ ํ•™์ƒ์˜ ์ •๋ณด๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
axios.get("https://school.com/class/03/student/19").then((res) => {
    return res;
});

// 4๋ฐ˜ 12๋ฒˆ ํ•™์ƒ์˜ ์ •๋ณด๋ฅผ ์‚ญ์ œํ•˜๊ธฐ
axios.delete("https://school.com/class/04/student/12").then((res) => {
    return res;
});

// Jason ์„ ์ƒ๋‹˜์˜ ์ •๋ณด๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ
axios.update("https://school.com/teacher/jason").then((res) => {
    return res;
});

์ด์ฒ˜๋Ÿผ ์ƒํ™ฉ์— ๋”ฐ๋ผ ์š”์ฒญ์„ ํ•  ๋•Œ Endpoint(https://school.com/ ๋’ค์— ๋ถ€๋ถ„) ์˜ ๋ณ€ํ™”๊ฐ€ ๋งŽ๋‹ค.

  • GraphQL
await axios.post(
  "https://school.com/graphql",
  {
    query: `
        mutation {
          getStudentsData(class: 03) {
            id,
            name,
            address
          }
        }
      `,
  }
);

์š”์ฒญ ๋ฐฉ์‹์€ POST ๋กœ ํ•ญ์ƒ ๊ณ ์ •๋˜๋ฉฐ Endpoint ๋Š” /graphql ๋กœ ๋๋‚œ๋‹ค. ์•ˆ์— query๋ฌธ ํ˜•์‹์— ๋”ฐ๋ผ ์›ํ•˜๋Š” API ์š”์ฒญ์„ ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ญ์ƒ ๋ชจ๋“  Endpoint ๋“ค์„ ์™ธ์šฐ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

2. Overfetching, Underfetching

  • Overfetching

ํ•™์ƒ์˜ ๊ฐœ์ธ์ •๋ณด(์ด๋ฆ„, ์ƒ๋…„์›”์ผ, ์ฃผ์†Œ, ์—ฐ๋ฝ์ฒ˜)๊ฐ€ ๋‹ด๊ฒจ์žˆ๋Š” ๋ฐ์ดํ„ฐ์—์„œ REST API ๋Š” ํ•™์ƒ๋“ค์˜ ์ •๋ณด๋“ค ์ค‘์— ์—ฐ๋ฝ์ฒ˜๋งŒ์„ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ์–ด๋„ ๋ชจ๋“  ๋ฐ์ดํ„ฐ(์ด๋ฆ„, ์ƒ๋…„์›”์ผ, ์ฃผ์†Œ, ์—ฐ๋ฝ์ฒ˜)๋ฅผ ๊ฐ€์ ธ์˜ค๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ถˆํ•„์š”ํ•œ ๋ฆฌ์†Œ์Šค๊ฐ€ ๋‚ญ๋น„๋˜์ง€๋งŒ, GraphQL์€ ํ•™์ƒ๋“ค์˜ ์ •๋ณด๋“ค ์ค‘์—์„œ ์›ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋งŒ ๊ณจ๋ผ์„œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

  • Underfetching

ํ•™์ƒ๊ณผ ์„ ์ƒ๋‹˜, ๊ด€๋ฆฌ์ž๋“ค์˜ ์—ฐ๋ฝ์ฒ˜๋ฅผ ๋ชจ๋‘ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ์„ ๋•Œ REST API ๋Š” ๊ฐ๊ฐ ํ•œ๋ฒˆ์”ฉ ์š”์ฒญ์„ ํ•ด์•ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด 3๋ฒˆ์„ ์š”์ฒญํ•ด์•ผํ•˜์ง€๋งŒ, GraphQL์€ ํ•œ๋ฒˆ์˜ ์š”์ฒญ ์•ˆ์—์„œ ํ•™์ƒ, ์„ ์ƒ๋‹˜, ๊ด€๋ฆฌ์ž ๋“ฑ ํ•„์š”ํ•œ ์—ฌ๋Ÿฌ๊ฐœ์˜ ์ฟผ๋ฆฌ๋ฌธ์„ ๋‹ด์•„์„œ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋‹ค.


์ด๋ ‡๊ฒŒ ๋งˆ๋ฌด๋ฆฌํ•˜๋ฉด ์™ ์ง€ REST API ๊ฐ€ GraphQL ๋ณด๋‹ค ํ•ญ์ƒ ์•ˆ์ข‹์€ ๊ฒƒ ์ฒ˜๋Ÿผ ๋ณด์ด๊ฒ ์ง€๋งŒ, ๋‘˜๋‹ค ์ƒํ™ฉ์— ๋”ฐ๋ผ ์žฅ๋‹จ์ ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ž˜ ํŒŒ์•…ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผํ•˜๋Š” ๊ฒƒ ๊ฐ™๋‹ค.

Leave a comment