์ ์ฐํ๊ณ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ์ก์ธ์ค๋ฅผ ์ํ GraphQL API ๊ฐ๋ฐ. ์ ์ ํ ์คํค๋ง ์ค๊ณ, ๋ฆฌ์กธ๋ฒ ๋ฐ ์ฑ๋ฅ ์ต์ ํ๋ฅผ ํตํด ํ์ ์ธ์ดํํ GraphQL API๋ฅผ ๊ตฌ์ถํฉ๋๋ค.
์์ํ๊ธฐ
GraphQL์ ํด๋ผ์ด์ธํธ๊ฐ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ํํ๊ฒ ์์ฒญํ ์ ์๋๋ก ํ์ฌ ์ค๋ฒํ์นญ(over-fetching)๊ณผ ์ธ๋ํ์นญ(under-fetching)์ ์ ๊ฑฐํฉ๋๋ค. ํ์ง๋ง GraphQL API๋ N+1 ์ฟผ๋ฆฌ, ๋ณด์ ๋ฌธ์ ๋ฐ ๋ณต์ก์ฑ์ ํผํ๊ธฐ ์ํด ์ ์คํ ์ค๊ณ๊ฐ ํ์ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์ ์ฐํ๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋๋ฉฐ ํ์ ์ธ์ดํํ ์ฝ์์ ์งํค๋ GraphQL API๋ฅผ ๊ตฌ์ถํฉ๋๋ค.
์ ํฌ๋ ์คํค๋ง ํผ์คํธ(schema-first) ๋๋ ์ฝ๋ ํผ์คํธ(code-first) ์ ๊ทผ ๋ฐฉ์์ ์ํด Apollo Server, GraphQL Yoga ๋๋ Pothos๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ฟผ๋ฆฌ ๋ฐฐ์นญ(query batching)์๋ DataLoader๋ฅผ, ๊ถํ ๋ถ์ฌ์๋ GraphQL Shield๋ฅผ, ํ์ ์ธ์ดํํ ํด๋ผ์ด์ธํธ์๋ GraphQL Codegen์ ์ฌ์ฉํฉ๋๋ค. ๋ชจ๋ํฐ๋ง์ Apollo Studio ๋๋ ์ปค์คํ ํธ๋ ์ด์ฑ(custom tracing)์ ํตํด ์ด๋ฃจ์ด์ง๋๋ค.
ํด๋ผ์ด์ธํธ๊ฐ ์ ์ฐํ ์ฟผ๋ฆฌ ๊ธฐ๋ฅ์ ํ์๋ก ํ๋ ๋ณต์กํ ๋ฐ์ดํฐ ์๊ตฌ ์ฌํญ์ ๊ฐ์ง ์ ํ(์: ๋์๋ณด๋, ์ต์ํ์ ํ์ด๋ก๋๊ฐ ํ์ํ ๋ชจ๋ฐ์ผ ์ฑ, ๋ค์ํ ํด๋ผ์ด์ธํธ ์ ํ์ ์๋น์คํ๋ ํ๋ซํผ)์ ์ํ ์๋น์ค์ ๋๋ค. ๋ํ ํ๋๋ ์ด์ ์ ํตํด ํตํฉ API ๋ ์ด์ด๊ฐ ํ์ํ ๋ง์ดํฌ๋ก ์๋น์ค ์ํคํ ์ฒ์๋ ์ด์์ ์ ๋๋ค.
๋๋ฉ์ธ ํ์ ์ ๋ชจ๋ธ๋งํ๊ณ , ์ฟผ๋ฆฌ/๋ฎคํ ์ด์ ์ ์ ์ํ๋ฉฐ, ๊ตฌ๋ ์๊ตฌ ์ฌํญ์ ๊ณํํฉ๋๋ค.
DataLoader ๋ฐฐ์นญ(batching)์ผ๋ก ๋ฆฌ์กธ๋ฒ๋ฅผ ๊ตฌ์ถํ๊ณ , ๊ถํ ๋ถ์ฌ๋ฅผ ๊ตฌํํ๋ฉฐ, ์๋ฌ ํธ๋ค๋ง์ ์ค์ ํฉ๋๋ค.
GraphQL Codegen์ ์ค์ ํ๊ณ , ํด๋ผ์ด์ธํธ ์ฟผ๋ฆฌ๋ฅผ ๊ตฌ์ถํ๋ฉฐ, ์บ์ฑ ์ ๋ต์ ๊ตฌํํฉ๋๋ค.
์ฟผ๋ฆฌ ๊น์ด ์ ํ, ๋น์ฉ ๋ถ์, ์๊ตฌ ์ฟผ๋ฆฌ(persisted queries) ๋ฐ ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง์ ์ถ๊ฐํฉ๋๋ค.
์คํค๋ง ๋ฌธ์๋ฅผ ์์ฑํ๊ณ , ๊ฐ๋ฐ์ ๊ฐ์ด๋๋ฅผ ๋ง๋ค๋ฉฐ, ๋ชจ๋ํฐ๋ง๊ณผ ํจ๊ป ๋ฐฐํฌํฉ๋๋ค.
ํด๋ผ์ด์ธํธ์๊ฒ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋น ๋ฅด๊ณ ํ์ ์ธ์ดํํ๊ฒ ์ ๊ณตํ๋ GraphQL API๋ฅผ ํจ๊ป ๊ตฌ์ถํด๋ด ์๋ค.
GraphQL์ ํ๋ก ํธ์๋์์ ์ ์ฐํ ๋ฐ์ดํฐ ํ์นญ์ด ํ์ํ ๋, ๋ฐ์ดํฐ ์๊ตฌ ์ฌํญ์ด ๋ค๋ฅธ ์ฌ๋ฌ ํด๋ผ์ด์ธํธ ์ ํ(web, mobile, IoT)์ด ์์ ๋, ๋๋ ๊ณผ๋ํ ๋ฐ์ดํฐ ํ์นญ์ ์ ๊ฑฐํ๊ณ ์ถ์ ๋ ์ด์์ ์ ๋๋ค. MicrocosmWorks๋ GraphQL์ด ๊ทํ์ ์ฌ์ฉ ์ฌ๋ก์ ์ ํฉํ์ง ํ๊ฐํ๋ ๋ฐ ๋์์ ๋๋ฆฝ๋๋ค.
MicrocosmWorks์ GraphQL API ๊ฐ๋ฐ์ schema ๋ณต์ก์ฑ, resolver ๋ก์ง, ์ค์๊ฐ subscription ์๊ตฌ ์ฌํญ, ๊ทธ๋ฆฌ๊ณ federation ํ์์ฑ์ ๋ฐ๋ผ ์๊ฐ๋น $20~$50์ ๋๋ค.
๋ค, ์ ํฌ๋ Apollo Federation ๋๋ Schema Stitching์ ์ฌ์ฉํ์ฌ ํ๋๋ ์ดํฐ๋ GraphQL ์ํคํ ์ฒ๋ฅผ ๊ตฌ์ถํ๋ฉฐ, ์ด๋ฅผ ํตํด ๊ฐ ๋ง์ดํฌ๋ก์๋น์ค๊ฐ ๊ทธ๋ํ์ ๊ณ ์ ํ ๋ถ๋ถ์ ์์ ํ๋ฉด์๋ ํด๋ผ์ด์ธํธ์๊ฒ๋ ํตํฉ๋ API๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ ํฌ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ฟผ๋ฆฌ์ ์ผ๊ด ์ฒ๋ฆฌ ๋ฐ ์บ์ฑ์ ์ํด DataLoader๋ฅผ ๊ตฌํํ๊ณ , ๋น์ฉ์ด ๋ง์ด ๋๋ ์ฟผ๋ฆฌ๋ฅผ ๊ฑฐ๋ถํ๊ธฐ ์ํด query complexity analysis๋ฅผ ์ฌ์ฉํ๋ฉฐ, depth limits๋ฅผ ์ค์ ํ๊ณ , ์ ์ฐํ data fetching์ ์ ์งํ๋ฉด์ ๋จ์ฉ์ ๋ฐฉ์งํ๊ธฐ ์ํด persisted queries๋ฅผ ๊ตฌ์ฑํฉ๋๋ค.
๋ค, ์ ํฌ๋ graphql-ws์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ WebSockets๋ก GraphQL ๊ตฌ๋ ์ ๊ตฌํํ๋ฉฐ, ์ ์ ํ ์ธ์ฆ ๋ฐ ์ฐ๊ฒฐ ๊ด๋ฆฌ์ ํจ๊ป ์ค์๊ฐ ์๋ฆผ, ์ฑํ , ํ์ ํธ์ง ๋ฐ ๋์๋ณด๋ ์ ๋ฐ์ดํธ์ ๊ฐ์ ์ค์๊ฐ ๊ธฐ๋ฅ์ ์ง์ํฉ๋๋ค.