๐Ÿ‘ฉโ€๐ŸŽจ REST API vs GraphQL

๊น€์ˆ˜์ง„ยท2025๋…„ 4์›” 27์ผ

API๋ž€?

API(Application Programming Interface)๋ž€ ํ”„๋กœ๊ทธ๋žจ๋ผ๋ฆฌ ์„œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์•ฝ์†์ด๋‹ค. ์•ฑ์—์„œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ์„œ๋ฒ„์— ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ , ์„œ๋ฒ„๊ฐ€ ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ๋ณด๋‚ด์ฃผ๋Š” ๊ณผ์ •์ด ๋ฐ”๋กœ API๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง„๋‹ค.

API, ์™œ ์ค‘์š”ํ• ๊นŒ?

  1. ํ”„๋กœ๊ทธ๋žจ๋ผ๋ฆฌ ์‰ฝ๊ฒŒ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค
    API ๋•๋ถ„์— ์„œ๋กœ ๋‹ค๋ฅธ ์‹œ์Šคํ…œ์ด๋‚˜ ์„œ๋น„์Šค๊ฐ€ ๋น ๋ฅด๊ณ  ์‰ฝ๊ฒŒ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋‹ค.

  2. ๊ฐœ๋ฐœ ์‹œ๊ฐ„์„ ์ค„์—ฌ์ค€๋‹ค
    ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ์ง์ ‘ ๋งŒ๋“ค ํ•„์š” ์—†์ด, ์ด๋ฏธ ๋งŒ๋“ค์–ด์ง„ API๋ฅผ ๊ฐ€์ ธ๋‹ค ์“ฐ๋ฉด ๋œ๋‹ค.

  3. ์„œ๋น„์Šค ํ™•์žฅ์— ์œ ๋ฆฌํ•˜๋‹ค
    ๋‚ด ์„œ๋น„์Šค๋ฅผ ์™ธ๋ถ€์— ๊ณต๊ฐœํ•˜๋ฉด, ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์ด API๋ฅผ ์ด์šฉํ•ด ์ƒˆ๋กœ์šด ์•ฑ์ด๋‚˜ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

  4. ์ผ๊ด€์„ฑ๊ณผ ๋ณด์•ˆ ์œ ์ง€
    ์ •ํ•ด์ง„ ๊ทœ์น™์— ๋”ฐ๋ผ ํ†ต์‹ ํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์‹œ์Šคํ…œ์ด ์ปค์ ธ๋„ ๊ด€๋ฆฌ๊ฐ€ ์‰ฝ๊ณ  ๋ณด์•ˆ๋„ ๊ฐ•ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

API์ข…๋ฅ˜

API ์ข…๋ฅ˜์—๋Š” ๋Œ€ํ‘œ์ ์œผ๋กœ REST API์™€ GraphQL์ด ์žˆ๋‹ค.

REST API

REST API(Representational State Transfer)๋Š” ๋Œ€ํ‘œ์ ์ธ API์ด๋‹ค. ์›น์˜ ๊ธฐ๋ณธ ์›์น™์„ ๋”ฐ๋ฅด๋ฉฐ, ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๊ฐ€ HTTP๋ฅผ ํ†ตํ•ด ๋ฆฌ์†Œ์Šค(๋ฐ์ดํ„ฐ)๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š” ๋ฐฉ์‹์ด๋‹ค.

REST API์˜ ๊ตฌ์„ฑ ์š”์†Œ

  1. ๋ฆฌ์†Œ์Šค (Resource)
    โ€ข ๋ฆฌ์†Œ์Šค๋Š” ์„œ๋ฒ„์— ์กด์žฌํ•˜๋Š” ๋ชจ๋“  ๋ฐ์ดํ„ฐ(๊ฐ์ฒด)์ด๋‹ค.
    โ€ข ๋ฆฌ์†Œ์Šค๋Š” ๊ฐ๊ฐ ๊ณ ์œ ํ•œ URI๋กœ ์‹๋ณ„๋œ๋‹ค.

  2. HTTP ๋ฉ”์„œ๋“œ
    REST์—์„œ๋Š” HTTP ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ํ–‰๋™(Action)์„ ๊ตฌ๋ถ„ํ•œ๋‹ค.
    โ€ข GET: ๋ฆฌ์†Œ์Šค ์กฐํšŒ
    โ€ข POST: ๋ฆฌ์†Œ์Šค ์ƒ์„ฑ
    โ€ข PUT: ๋ฆฌ์†Œ์Šค ์ „์ฒด ์ˆ˜์ •
    โ€ข PATCH: ๋ฆฌ์†Œ์Šค ๋ถ€๋ถ„ ์ˆ˜์ •
    โ€ข DELETE: ๋ฆฌ์†Œ์Šค ์‚ญ์ œ

  3. URI(Uniform Resource Identifier)
    โ€ข ๋ฆฌ์†Œ์Šค๋Š” URI๋กœ ์ ‘๊ทผํ•œ๋‹ค.
    โ€ข URI๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ โ€œ๋ฌด์—‡โ€์ธ์ง€๋งŒ ๋‚˜ํƒ€๋‚ด์•ผ ํ•˜๊ณ , โ€œ๋ฌด์Šจ ํ–‰๋™โ€์„ ํ•˜๋Š”์ง€๋Š” ๋ฉ”์„œ๋“œ๋กœ ๊ตฌ๋ถ„ํ•œ๋‹ค.

  4. ํ‘œํ˜„(Representation)
    โ€ข ๋ฆฌ์†Œ์Šค ์ž์ฒด๊ฐ€ ์•„๋‹Œ, ๋ฆฌ์†Œ์Šค๋ฅผ ํ‘œํ˜„ํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›๋Š”๋‹ค.

REST API์˜ ์žฅ์ 

โ€ข ๋‹จ์ˆœ & ์ง๊ด€์ 
URL๊ณผ ๋ฉ”์†Œ๋“œ๋งŒ ์ž˜ ์•Œ๋ฉด ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

โ€ข ํ™•์žฅ์„ฑ & ์œ ์—ฐ์„ฑ
์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ด๋„ ๊ตฌ์กฐ๋ฅผ ํฌ๊ฒŒ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

โ€ข ํ‘œ์ค€ HTTP ์‚ฌ์šฉ
๋ธŒ๋ผ์šฐ์ €, ์„œ๋ฒ„, ์•ฑ ์–ด๋””์„œ๋‚˜ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ ๊ฐ€๋Šฅํ•˜๋‹ค.

โ€ข ์บ์‹ฑ ๊ฐ€๋Šฅ
์บ์‹ฑ์ด๋ž€ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋น ๋ฅด๊ฒŒ ๊บผ๋‚ด ์“ฐ๊ธฐ ์œ„ํ•ด ์ž„์‹œ๋กœ ์ €์žฅํ•ด๋‘๋Š” ๊ฒƒ์ด๋‹ค. HTTP ์บ์‹œ๋ฅผ ํ†ตํ•œ GET ์š”์ฒญ์€ ์„ฑ๋Šฅ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

REST API์˜ ํ•œ๊ณ„

๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ์š”์ฒญ์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์—ฌ๋Ÿฌ ๋ฒˆ ์š”์ฒญํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๋˜ํ•œ, ๊ณ ์ •๋œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋กœ ์ธํ•ด ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์›ํ•˜์ง€ ์•Š๋Š” ๋ฐ์ดํ„ฐ๊นŒ์ง€ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

GraphQL

์ด๋Ÿฌํ•œ ํ•œ๊ณ„๋ฅผ ๊ทน๋ณตํ•˜๊ธฐ ์œ„ํ•ด GraphQL ๊ฐ™์€ ๋ฐฉ์‹์ด ๋“ฑ์žฅํ–ˆ๋‹ค.

GraphQL์˜ ๊ตฌ์„ฑ ์š”์†Œ

  1. Query: ์„œ๋ฒ„์—๊ฒŒ ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ฌ๋ผ๊ณ  ์š”์ฒญํ•˜๋Š” ๋ฌธ์„œ์ด๋‹ค.

  2. Mutation: ๋ฐ์ดํ„ฐ๋ฅผ ์ˆ˜์ •, ์ถ”๊ฐ€, ์‚ญ์ œํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

  3. Subscription: ์„œ๋ฒ„์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ์‹ค์‹œ๊ฐ„ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

๋˜ ํ•˜๋‚˜ ์ค‘์š”ํ•œ ๊ฑด, GraphQL ์„œ๋ฒ„๋Š” ํ•ญ์ƒ Schema(์Šคํ‚ค๋งˆ)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. Schema(์Šคํ‚ค๋งˆ)๋Š” ์„œ๋ฒ„์— ์กด์žฌํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ ๋ฌด์—‡์ด๋ฉฐ, ์–ด๋–ค ๋ชจ์–‘(๊ตฌ์กฐ)์ด๊ณ , ์„œ๋กœ ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š”์ง€๋ฅผ ๋ช…ํ™•ํžˆ ์ •์˜ํ•œ ๋ฌธ์„œ์ด๋‹ค. GraphQL์—์„œ๋Š” ์ด ์Šคํ‚ค๋งˆ๊ฐ€ ์–ด๋–ค ์ฟผ๋ฆฌ(Query), ๋ฐ์ดํ„ฐ ํƒ€์ž…(Type), ๊ด€๊ณ„(Relationship), ์ˆ˜์ •(Mutation)์ด ๊ฐ€๋Šฅํ•œ์ง€๋ฅผ ๋ชจ๋‘ ๊ฒฐ์ •ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์Šคํ‚ค๋งˆ๋ฅผ ๋ณด๋ฉด, ์ด ์„œ๋ฒ„์— ์–ด๋–ค ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์š”์ฒญํ•  ์ˆ˜ ์žˆ์„์ง€ ํ•œ๋ˆˆ์— ์•Œ ์ˆ˜ ์žˆ๋‹ค.

GraphQL์˜ ์žฅ์ 

โ€ข ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ์š”์ฒญํ•˜๋‹ˆ ๋„คํŠธ์›Œํฌ ๋‚ญ๋น„๊ฐ€ ์—†๋‹ค.

โ€ข ํ•˜๋‚˜์˜ ์š”์ฒญ์œผ๋กœ ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค.

โ€ข API ๋ฒ„์ „ ๊ด€๋ฆฌ๊ฐ€ ํ•„์š” ์—†๋‹ค.

โ€ข ์Šคํ‚ค๋งˆ ๊ธฐ๋ฐ˜์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์„œํ™”๊ฐ€ ์ž๋™์œผ๋กœ ๊ฐ€๋Šฅํ•˜๋‹ค.

GraphQL์˜ ๋‹จ์ 

โ€ข ์Šคํ‚ค๋งˆ ์ž‘์„ฑ, ๋ฆฌ์กธ๋ฒ„ ์„ค์ • ๋“ฑ์œผ๋กœ ์ธํ– ์„œ๋ฒ„ ๊ฐœ๋ฐœ์ด ๋ณต์žกํ•  ์ˆ˜ ์žˆ๋‹ค.

โ€ข ์บ์‹ฑ์ด REST๋ณด๋‹ค ๊นŒ๋‹ค๋กญ๋‹ค.

โ€ข ๊ฐ„๋‹จํ•œ API๋ผ๋ฉด ์˜คํžˆ๋ ค ๊ณผํ•œ ๋А๋‚Œ์ด ๋“ค ์ˆ˜๋„ ์žˆ๋‹ค.

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

comment-user-thumbnail
2025๋…„ 5์›” 1์ผ

๋•๋ถ„์— GraphQL์— ๋Œ€ํ•ด ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ์—ˆ์–ด์š”!

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ
comment-user-thumbnail
2025๋…„ 5์›” 11์ผ

API ... ๊ณง ์žˆ์œผ๋ฉด ์ €ํฌ๊ฐ€ ํ•ด๋‚ด์•ผ ํ•˜๋Š” ๊ฑฐ๊ฒ ์ฃ  .. ํ”„์—” ์Šคํ„ฐ๋”” ํ•˜๋ฉด์„œ API๋ฅผ ์‚ผ๋ฐฑ๋ฒˆ ์ •๋„ ๋“ค์€ ๊ฑฐ ๊ฐ™์€๋ฐ ์•„์ง ์ €์—๊ฒ ์™€๋‹ฟ์ง€ ์•Š๋Š” ใ… .ใ…  ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ํ•˜๋ฉด์„œ API๋ฅผ ์™„๋ฒฝ ์ดํ•ดํ•˜๊ตฌ ์ด ๊ธ€์„ ๋‹ค์‹œ ์ฝ์–ด๋ดค์„ ๋•Œ ์–ด๋А์ •๋„ ์†Œํ™”ํ•ด๋‚ผ ์ˆ˜ ์žˆ์—ˆ์œผ๋ฉด , , ์ข‹์€ ๊ธ€ ์ž˜๋ดค์–ด์šฉ S2

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ
comment-user-thumbnail
2025๋…„ 5์›” 18์ผ

์˜ค์˜น ์ €๋„ API ๊ด€ํ•ด์„œ ์กฐ์‚ฌํ–ˆ๋Š”๋ฐ RestAPI๋งŒ ์ฐพ์•„๋ดค์–ด์š”. ๋•๋ถ„์— GraphQL์— ๋Œ€ํ•ด์„œ ์ƒˆ๋กœ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ