๐[WEB] GraphQL์ด๋?
GraphQL?
GraphQL
์ API๋ฅผ ์ํ ์ฟผ๋ฆฌ ์ธ์ด์.
ํ์ ์์คํ ์ ์ฌ์ฉํ์ฌ ์คํํ๋ ์๋ฒ์ฌ์ด๋ ๋ฐํ์์ด๋ค.
GraphQL
์ ํน์ ํ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ํน์ ํ ์คํ ๋ฆฌ์ง ์์ง๊ณผ ๊ด๊ณ๋์ด ์์ง ์๊ณ , ๊ธฐ์กด ์ฝ๋์ ๋ฐ์ดํฐ์ ์ํด ๋์ฒด๋๋ค.
SQL์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์คํ
์ผ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ชฉ์ ์ ๊ฐ์ง๋ค๋ฉด, GraphQL์ ํด๋ผ์ด์ธํธ๊ฐ ๋ฐ์ดํฐ๋ฅผ ์๋ฒ๋ก๋ถํฐ ๊ฐ์ ธ์ค๋ ๊ฒ์ ๋ชฉ์
์ผ๋ก ํ๋ค.
GraphQL vs REST API
ํด๋ผ์ด์ธํธ๊ฐ ์๋ฒ๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๊ฒ์ ๋ชฉ์ ์ผ๋ก ํ๋ ๊ฒ์ GraphQL๊ณผ REST API ๋ชจ๋ ๊ฐ๋ค.
๊ทธ๋ผ ์ด๋ค ์ฐจ์ด๊ฐ ์์๊น?
GraphQL
๋ณดํต ํ๋์ ์๋ํฌ์ธํธ
๋ฅผ ๊ฐ์ง๋ค.
REST API ์๋ํฌ์ธํธ ์์
- example.com/class
- example.com/class/{๋ฐ index}
- example.com/class/{๋ฐ index}/students
GraphQL ์๋ํฌ์ธํธ ์์
- example.com/grpahql
์์ ์์์ฒ๋ผ REST API์ ๊ฐ์ด ์ฌ๋ฌ ์๋ํฌ์ธํธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ์ง๊ด์ ์ด๊ธด ํ์ง๋ง ๊ด๋ฆฌํ๊ธฐ ํ๋ค๊ณ , ๋ง์ ์๋ํฌ์ธํธ์ ๋ ธ์ถ์ ๋ง๊ธฐ ์ํด ์ถ๊ฐ์ ์ธ ์ฒ๋ฆฌ๊ฐ ํ์ํ๋ค.
์ด์ ๋ฐํด GraphQL์ ํ๋์ ์๋ํฌ์ธํธ์ ๋ค๋ฅธ ์ฟผ๋ฆฌ๋ฅผ ์์ฒญํ์ฌ ์๋ต์ ๋ฐ๊ธฐ ๋๋ฌธ์ REST API์ฒ๋ผ ์ง๊ด์ ์ด์ง๋ ์์ง๋ง ๊ด๋ฆฌ์ ๋ ธ์ถ ๋ฐฉ์ง ๋ฐฉ๋ฉด์์๋ ์ ๋ฆฌํ๋ค.
์ํ๋ ๋ฐ์ดํฐ๋ง ๋ฐ์ ์ ์๋ค.
REST API๋ ๋ณดํต ์ฌ๋ฌ ์๋ํฌ์ธํธ๋ฅผ ๊ฐ์ง๋ฉฐ, ๊ฐ๊ฐ์ ์๋ํฌ์ธํธ๊ฐ ๋์ผํ ์๋ต์ ๋ฐํํ๋ค.
ํ์ง๋ง GraphQL์ ๋ณดํต ํ๋์ ์๋ํฌ์ธํธ๋ง์ ์ฌ์ฉํ๊ณ , ์ด๋ฅผ ์์ฒญํ๋ ์ฟผ๋ฆฌ๋ฅผ ๋ค๋ฅด๊ฒ ํ์ฌ ๋ค๋ฅธ ์๋ต์ ๋ฐ๋ ๋ฐฉ์์ด๋ค.
๋ํ, REST API๋ ์๋ํฌ์ธํธ๋ง๋ค ์ ํด์ง ์๋ต๋ง์ ๋ฐ์ ์ ์๋ค.
REST API ์๋ต ์์
// REST API request
GET, https://swapi.dev/api/people/1
// REST API response
{
"name": "Luke Skywalker",
"height": "172",
"mass": "77",
"hair_color": "blond",
"skin_color": "fair",
"eye_color": "blue",
"birth_year": "19BBY",
"gender": "male",
"homeworld": "http://swapi.dev/api/planets/1/",
"films": ["http://swapi.dev/api/films/1/", "http://swapi.dev/api/films/2/", "http://swapi.dev/api/films/3/", "http://swapi.dev/api/films/6/"],
"species": [],
"vehicles": ["http://swapi.dev/api/vehicles/14/", "http://swapi.dev/api/vehicles/30/"],
"starships": ["http://swapi.dev/api/starships/12/", "http://swapi.dev/api/starships/22/"],
"created": "2014-12-09T13:50:51.644000Z",
"edited": "2014-12-20T21:17:56.891000Z",
"url": "http://swapi.dev/api/people/1/"
}
GraphQL ์๋ต ์์
// GraphQL request
query {
person(personID: 1) {
name
height
mass
}
}
// GraphQL response
{
"data": {
"person": {
"name": "Luke Skywalker",
"height": 172,
"mass": 77
}
}
}
์ ์์๋ ์คํ์์ฆ์ ์ธ๋ฌผ ์ ๋ณด๋ฅผ ๋ฐ์์ค๋ ์์์ด๋ค.
REST API๋ ์ธ๋ฌผ์ ์ ๋ณด๋ฅผ ๋ฐ์์ค๋ฉด ํ์ํ ์ ๋ณด ์ด์ธ์๋ ๋ง์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๊ฒ ๋๋ค.
ํ์ง๋ง GrpahQL์ ์ฟผ๋ฆฌ๋ฅผ ์ ์ ํ๊ฒ ์ฌ์ฉํจ์ผ๋ก์จ, ํ์ํ ์ ๋ณด๋ง ๊ฐ์ ธ์ค๋๋ก ํ ์ ์๋ค.
GraphQL์ ์ฅ์
- HTTP ์์ฒญ ํ์๋ฅผ ์ค์ผ ์ ์๋ค.
- HTTP ์๋ต ์ฌ์ด์ฆ๋ฅผ ์ค์ผ ์ ์๋ค.
- ํ๋ก ํธ์๋์ ๋ฐฑ์๋ ๊ฐ๋ฐ์์ ๋ถ๋ด์ ๋ ์ ์๋ค.
GraphQL์ ๋จ์
- ๊ณ ์ ๋ ์์ฒญ๊ณผ ์๋ต๋ง ํ์ํ ๋๋ ์ฟผ๋ฆฌ๋ก ์ธํด ์์ฒญ์ ํฌ๊ธฐ๊ฐ REST API๋ณด๋ค ์ปค์ง ์ ์๋ค.
- HTTP ์บ์ฑ ์ฌ์ฉ ๋ถ๊ฐ๋ฅ
- ํ์ผ ์ ๋ก๋ ๊ตฌํ ๋ฐฉ๋ฒ์ด ์ ํด์ ธ์์ง ์์ ์ง์ ๊ตฌํํด์ผ ํ๋ค.
๋๊ธ๋จ๊ธฐ๊ธฐ