REST API ์ GraphQL
Updated:
Tags: GraphQL, Http, Network, REST API
Categories: ComputerScience
์์งํ ์์ง ์ ๋๋ก ์ดํดํ๊ณ ์์ง ์์ ๋ถ๋ถ๋ ์๊ณ ๋ด์ฉ๋ ๋ถ์กฑํ๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์
๋์ค์ ๋ค์ ๊ณต๋ถํ๊ฒ๋๋ฉด ์์ ํด์ผํ ๊ฒ ๊ฐ๋ค.
API ๋?
API๋ Application Programing Interface์ ์ฝ์๋ก,
โ์ปดํจํฐ๋ ์ปดํจํฐ ํ๋ก๊ทธ๋จ ์ฌ์ด์ ์ฐ๊ฒฐ์ด๋ค. ์ผ์ข
์ ์ํํธ์จ์ด ์ธํฐํ์ด์ค์ด๋ฉฐ ๋ค๋ฅธ ์ข
๋ฅ์ ์ํํธ์จ์ด์ ์๋น์ค๋ฅผ ์ ๊ณตํ๋ค.โ ๋ผ๊ณ ์ํค๋ฐฑ๊ณผ ๋์ค์ง๋งโฆ ์ด๋ ๊ฒ ๋ด์๋ ์ดํดํ๊ธฐ๊ฐ ์ด๋ ค์ธ ๊ฒ ๊ฐ๋ค. (๋๋..)
์ ํํ์ง๋ ์์ง๋ง ์์ฃผ ์ฝ๊ฒ ์ดํดํ๋๋ก ์ค๋ช
์ ํด๋ณด์๋ฉด, ์ด๋ค ํ๋ก๊ทธ๋จ์ด ๋ค๋ฅธ ํ๋ก๊ทธ๋จ๊ณผ ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์๊ฒ ๋์์ฃผ๋ ๋งค๊ฐ์ฒด๋ฅผ ๋งํ๋ค.
์๋ฅผ๋ค์ด ๋ด๊ฐ ์ด๋ค ๊ฒ์ ์ฌ์ดํธ์์ ๋ญํน ํ์ด์ง๋ฅผ ๋ณธ๋ค๊ณ ํด๋ณด์. ๊ทธ ์ฌ์ดํธ ๋ฉ๋ด๋ค ์ค์ โ๋ญํนโ ์ด๋ผ๋ ํ์ด์ง์ ๋ฒํผ์ด ์์ ๊ฒ์ด๋ค.
์ด ๋ฒํผ์ ๋๋ฅด๋ฉด ๋ด๋ถ์์๋ โ๊ฒ์ ์ฌ์ดํธ์ ์๋ฒ์๊ฒ [๋ญํน ๋ชฉ๋ก ๋ณด์ฌ์ฃผ๊ธฐ API]๋ฅผ ์์ฒญํฉ๋๋คโ ๋ผ๋ ์ฝ๋๊ฐ ๋์ํ๊ณ ,
๊ฒ์ ์ฌ์ดํธ์ ์๋ฒ๋ ํด๋น API ์์ฒญ์ด ๋ค์ด์ค๋ฉด ๋ญํน ๋ฐ์ดํฐ๋ค์ ์๋ต ํ๋ค(๋ณด๋ด์ค๋ค). ์๋ฒ์๊ฒ ๋ญํน ๋ฐ์ดํฐ๋ค์ ๋ฐ๊ฒ๋๋ฉด ๋ด ํ๋ฉด์์๋ ๊ทธ ๋ฐ์ดํฐ๋ค๋ก ๋ญํน ํ๋ฉด์ด ํ์๋๊ฒ ๋๋ค. ์ด์ฒ๋ผ ํญ์ ์์ฒญ๊ณผ ์๋ต์ด ์กด์ฌํ๊ณ ์ํธ์์ฉ์ ํ๊ฒ๋๋ค.
์ด๋ค ๋ฐฉ์์ผ๋ก ์์ฒญ์ ํด์ผ ์ํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์ ์ ์๋์ง ๊ฐ API ๋ง๋ค ๊ท๊ฒฉ๊ณผ ๊ท์น์ด ์๊ธฐ ๋๋ฌธ์, ๊ธฐ์์ฒญ API ๊ฐ์ ๊ณต๊ณต API์ ๋ค์ด๋ฒ์ง๋, Kakao๋งต ๋ฑ ๊ณต๊ฐ๋ API๋ค์ ์ด๋ฅผ API Docs(Documents) ๋ก ๋ฌธ์/๋ฉ๋ด์ผ๋ก ๊ณต๊ฐํด์ ์ฌ์ฉ์๋ค์ด ์ ์ฌ์ฉํ ์ ์๊ฒ ํ๋ค.
REST API๋? (Representational State Transfer)
2000๋ ๋ ๋ก์ด ํ๋ฉ (Roy Fielding) ์ ๋ฐ์ฌํ์ ๋ ผ๋ฌธ์์ ์ต์ด๋ก ์๊ฐ๋ โ์น์์ ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๊ณ ์ฒ๋ฆฌํ๋ ์ค๊ณ๋ฐฉ์โ ์ ๋งํ๋ค. ๋ํ์ ์ธ 2๊ฐ์ง ์ฑ๊ฒฉ์ ๋ณด๋ฉด
-
URI๋ง ๋ณด๊ณ ๋ ์๋ฏธํ๋ ๋ฐ๋ฅผ ์ ์ ์๊ฒ ์ฃผ์๋ฅผ ์์ฑํ๊ธฐ โhttps://school.com/class/02/student/24โ ๋ง ๋ณด๊ณ ๋ ๋๋ต์ ์ผ๋ก โ์ด๋ค ํ๊ต ํํ์ด์ง์ 2๋ฐ 24๋ฒ ํ์์ ๋ํ ํ์ด์ง๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฒ ๊ฐ๊ตฐ!โ์ด๋ผ๋ ์๊ฐ์ด ๋ค๊ฒ๋ ํ๋์ ์ดํดํ ์ ์๊ฒ ์์ฑํด์ผ ํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋จ์ด์ ์ ํ๋ add, find, delete ์ฒ๋ผ ๋์ฌ๊ฐ ์๋๋ผ ๋ช ์ฌ๋ง ์ฌ์ฉํด์ผ ํ๋ค.
-
๋ฐ์ดํฐ์ ๋ํ ์ฒ๋ฆฌ๋ 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