Thinking in GraphQL
Created: January 13, 2022 11:49 AM
GraphQL์ ํ๋ก๋ํธ ๊ฐ๋ฐ์์ ํด๋ผ์ด์ธํธ ์ดํ๋ฆฌ์ผ์ด์ ์ ์๊ตฌ์ฌํญ์ ์ง์คํ์ฌ ๋ฐ์ดํฐ๋ฅผ ํจ์นํ๋ ์๋ก์ด ๋ฐฉ๋ฒ์ ์ ์ํ๋ค.
๊ฐ๋ฐ์๊ฐ ๋ทฐ์ ํ์๋ก ํ๋ ์ ํํ ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์ฒดํํ๊ณ ํ๋์ ๋คํธ์ํฌ ์์ฒญ์ ํตํด ๊ทธ ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋๋ก ํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํ๋ค.
์์ ๊ธฐ๋ฐ์ REST ์ ๊ทผ๋ฐฉ์๊ณผ ๊ฐ์ ๊ธฐ์กด์ ๋ฐฉ๋ฒ๊ณผ ๋น๊ตํด๋ณด๋ฉด, GraphQL์ ๋ฐ์ดํฐ๋ฅผ ๋์ฑ ํจ์จ์ ์ผ๋ก ํจ์นํ๊ฒ๋ ๋๊ณ custom endpoint๋ฅผ ์ด์ฉํจ์ ๋ฐ๋ผ ์ค๋ณต๋๋ ์๋ฒ ๋ก์ง์ ์ค์ผ ์ ์๋ค.
๊ฒ๋ค๊ฐ, GraphQL์ ํ๋ก๋ํธ ์์ฒด์ ์ฝ๋์ ์๋ฒ ๋ก์ง์ ๋ถ๋ฆฌํ ์ ์๊ฒ๋ ๋๋๋ค.
์๋ฅผ ๋ค์ด, ํ๋ก๋ํธ๋ ํ์๋ก ํ๋ ์ ๋ณด์ ๊ด๋ จ๋ ์๋ฒ endpoint์ ๋ณ๊ฒฝ ์์ด ํจ์นํ๋ ๋ฐ์ดํฐ๋ฅผ ์กฐ์ ํ ์ ์๋ค.
์ด ๊ธ์ ํตํด GraphQL ํด๋ผ์ด์ธํธ ํ๋ ์์ํฌ๋ฅผ ๋ง๋๋ ์๋ฏธ์ ์ ํต์ ์ธ REST ์์คํ ๊ณผ ๋น๊ต๋๋ ์ ์ ์ ์ ์๋ค. ๋ํ Relay ๊ธฐ์ ์ ๊น๋ฆฐ ๋์์ธ ๊ฒฐ์ ์ ์ธ ์์์ GraphQL ํด๋ผ์ด์ธํธ๋ก์จ ๋ฟ๋ง ์๋๋ผ ๋ช ์์ ์ธ ๋ฐ์ดํฐ ํจ์นญ ํ๋ ์์ํฌ๋ก์จ์ Relay๋ฅผ ์์๋ณด๊ณ ์ ํ๋ค.
๋ฐ์ดํฐ ํจ์นญ
๋ค์๊ณผ ๊ฐ์ด ์คํ ๋ฆฌ ๋ฆฌ์คํธ์ ๊ฐ ์คํ ๋ฆฌ์ ๋ํ ์ผ์ ํจ์นํ๋ ๊ฐ๋จํ ์ดํ๋ฆฌ์ผ์ด์ ์ด ์๋ค๊ณ ๊ฐ์ ํด๋ณด์.
๊ธฐ์กด์ REST๋ ๋ค์๊ณผ ๊ฐ๋ค.
์ด ๊ณผ์ ์ ์๋ฒ์ n+1
๋ฒ์ ์์ฒญ์ ๋ณด๋ธ๋ค.
1๋ฒ์ ๋ฆฌ์คํธ๋ฅผ ํจ์นํ๊ธฐ ์ํจ
n๋ฒ์ ๊ฐ๊ฐ์ ์์ดํ ์ ํจ์นํ๊ธฐ ์ํจ
GraphQL์ ์ด์ฉํ์ฌ, ์ปค์คํ endpoint๋ฅผ ์์ฑํ์ง ์๊ณ ๋(์ด๋ฅผ ์์ฑํ ์ ์ ์งํด์ผ ํ๋ค.) ์๋ฒ์ ๋จ ํ ๋ฒ์ ๋คํธ์ํฌ ์์ฒญ์ ํตํด ์์ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ํจ์นํ ์ ์๋ค.
์ฌ๊ธฐ๊น์ง๋ REST ์ ๊ทผ๋ณด๋ค ์ข ๋ ํจ์จ์ ์ธ ๋ฒ์ ์ผ๋ก GraphQL์ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๊ฐ๋ค.
์ด๋ ๊ฒ ํ๋ฉด 2๊ฐ์ง์ ์ค์ํ ์ด์ ์ด ์๋๋ฐ,
๋ชจ๋ ๋ฐ์ดํฐ๋ ํ๋ฒ์ round trip์ผ๋ก ๊ฐ์ ธ์ฌ ์ ์๋ค.
ํด๋ผ์ด์ธํธ์ ์๋ฒ๊ฐ ๋ถ๋ฆฌ๋ ์ ์๋ค: ํด๋ผ์ด์ธํธ๋ ์๋ฒ์ endpoint์ ์์กดํด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์ค์ง ์๊ณ ์ง์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๊ตฌ์ฒดํ ํ ์ ์๋ค.
ํด๋ผ์ด์ธํธ ์บ์ฑ
์๋ฒ์์ ๊ฐ์ ์ ๋ณด๋ฅผ ๋ค์ ํจ์นญํ๋ ๊ฒ์ ๊ฝค ๋๋ฆด ์ ์๋ค.
์๋ฅผ ๋ค์ด, ์คํ ๋ฆฌ ๋ฆฌ์คํธ๋ถํฐ ํ๋์ ์์ดํ ๊น์ง ์ฐพ์ ๋ด๋ ค๊ฐ๊ณ ๋ค์ ์คํ ๋ฆฌ ๋ฆฌ์คํธ๋ฅผ ์ฐพ๊ธฐ ์ํด ๋๋์์ค๋ ๊ฒฝ๋ก๋ ๊ฒฐ๊ตญ ๋ฆฌ์คํธ ์์ฒด๋ฅผ ๋ค์ ํจ์นํด์ผ ํจ์ ์๋ฏธํ๋ค.
GraphQL์ โ์บ์ฑโ์ด๋ผ๋ ํด๊ฒฐ์ฑ ์ ์ ์ํ๋ค.
์์ ๊ธฐ๋ฐ์ REST ์์คํ ์ ๊ฒฝ์ฐ, URI์ ๊ธฐ๋ฐํ์ฌ ์๋ต ์บ์๋ฅผ ์ ์งํ๋ค.
์ด๋ฌํ ์๋ต ์บ์ฑ์ GraphQL์๋ ์ ์ฉ ๊ฐ๋ฅํ๋ค.
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ REST ๋ฒ์ ๊ณผ ๋น์ทํ๋ค.
์ด ๋ ์ฟผ๋ฆฌ (ํ ์คํธ) ์์ฒด๊ฐ ์บ์ ํค๊ฐ ๋ ์ ์๋ค.
์ด์ ์ ์บ์๋ ๋ฐ์ดํฐ๋ฅผ ์์ฒญํ ๊ฒฝ์ฐ, ์ถ๊ฐ์ ์ธ ๋คํธ์ํฌ ์์ฒญ ์์ด GraphQL์ ์ฆ๊ฐ์ ์ผ๋ก ์บ์๋ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๋ค.
์ด ์ค์ฉ์ ์ธ ๋ฐฉ์์ ์ดํ๋ฆฌ์ผ์ด์ ์ ์ง๊ฐ๋๋ performance๋ฅผ ํฅ์์ํฌ ์ ์๋ค.
ํ์ง๋ง, ์ด๋ฌํ ์บ์ฑ ๋ฐฉ๋ฒ์ ๋ฐ์ดํฐ ์์ ์ฑ์ ์ธก๋ฉด์์ ๋ฌธ์ ๋ฅผ ๋ฐ์์ํฌ ์ ์๋ค.
์บ์ ์ผ๊ด์ฑ
GraphQL์ ์ฌ์ฉํ๋ค ๋ณด๋ฉด, ์ฌ๋ฌ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๊ฐ ์ค๋ณต๋๋ ๊ฒ์ ์ฝ๊ฒ ๋ณผ ์ ์๋ค.
ํ์ง๋ง, ์ด์ ์น์ ์ ์๋ต ์บ์๋ ์ด๋ฌํ ์ค๋ณต๊ณผ ๊ด๋ จ์ด ์๋ค - ์๋ต ์บ์๋ ๊ฐ๋ณ์ ์ธ ์ฟผ๋ฆฌ์ ๊ธฐ๋ฐํ์ฌ ์บ์ฑ๋๋ค.
์๋ฅผ ๋ค์ด, ์คํ ๋ฆฌ๋ฅผ ํจ์นํ๊ธฐ ์ํด ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ค๊ณ ํด๋ณด์.
์ดํ, likeCount
๊ฐ ์ฆ๊ฐํ ์คํ ๋ฆฌ ํ๋๋ฅผ ๋ค์ ํจ์นํ๋ค๊ณ ํด๋ณด์.
์ฌ๊ธฐ์ ์คํ ๋ฆฌ๊ฐ ์ ๊ทผ๋ ๋ฐฉ์์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์, ์ฐ๋ฆฌ๋ ๋ค๋ฅธ likeCount
๋ฅผ ํ์ธํ ์ ์๋ค.
์ฒซ๋ฒ์งธ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๋ทฐ๋ ๊ตฌ์์ count ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ง๊ณ ์์ ๊ฒ์ด๊ณ , ๋๋ฒ์งธ ์ฟผ๋ฆฌ๋ฅผ ์ด์ฉํ ๋ทฐ๋ ์ ๋ฐ์ดํธ ๋ count ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ์์ ๊ฒ์ด๋ค.
๊ทธ๋ํ ์บ์ฑ
GraphQL์ ์บ์ฑํ๋ ๋ฐฉ๋ฒ์ ๊ณ์ธต์ ์ธ ์๋ต์ ํ๋ซํ ๋ ์ฝ๋ ์งํฉ์ผ๋ก ์ ๊ทํ ํ๋ ๊ฒ์ด๋ค.
Relay๋ ์ด๋ ๊ฒ ์ ๊ทํํ ์บ์๋ฅผ ID์ Record๋ฅผ ๋งคํํ์ฌ ์ ์ฅํ๋ค
๊ฐ๊ฐ์ ๋ ์ฝ๋๋ ํ๋ ์ด๋ฆ์์ ํ๋ ๊ฐ์ผ๋ก ๋งคํ๋์ด ์๋ฐ.
๋ ์ฝ๋๋ ๋ค๋ฅธ ๋ ์ฝ๋๋ก ์ฐ๊ฒฐ๋์ด ์์ผ๋ฉฐ, ์ด๋ ์ํ์ ์ธ ๊ทธ๋ํ๋ฅผ ๋ฌ์ฌํ ์ ์๋ค. ์ด๋ฌํ ์ฐ๊ฒฐ ๋งํฌ๋ ์ต์์ ๋งต์ ๋ค์ ์ฐธ์กฐํ๋ ๊ตฌ์ฒด์ ์ธ ํค ๊ฐ์ผ๋ก ์ฌ์ฉ๋๋ค.
์ด๋ฌํ ์ ๊ทผ ๋ฐฉ์์ ์ด์ฉํด, ๊ฐ๊ฐ์ ์๋ฒ ๋ ์ฝ๋๋ ์ด๋ป๊ฒ ํจ์น๋์๋๋์ ๊ด๊ณ์์ด ๋จ ํ ๋ฒ ์ ์ฅ๋๋ค.
์คํ ๋ฆฌ ํ ์คํธ์ ์๊ฐ ์ด๋ฆ์ ํจ์นํ๋ ์ฟผ๋ฆฌ๊ฐ ์๋ค๊ณ ํด๋ณด์.
๋ค์์ ์๋ต ๊ฒฐ๊ณผ์ด๋ค.
์๋ต ๊ฒฐ๊ณผ๋ ๊ณ์ธต์ ์ผ ์ง๋ผ๋, GraphQL์ ๋ชจ๋ ๋ ์ฝ๋๋ฅผ ํ๋ฉดํํ์ฌ ์บ์ํ๋ค. Relay๊ฐ ์ด๋ฌํ ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์บ์ํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
์ด๊ฑด ๊ฐ๋จํ ์์์ด๊ณ , ์ค์ ๋ก ์บ์๋ 1:๋ค์ ๊ด๊ณ์ ํ์ด์ง๋ค์ด์ ๋ฐ ๋ค๋ฅธ ๊ฒ๋ค์ ๋์์ ํธ๋ค๋ง ํด์ผ ํ๋ค.
์บ์ ์ฌ์ฉํ๊ธฐ
๊ทธ๋์ ์ฐ๋ฆฌ๋ ์ด๋ฌํ ์บ์๋ฅผ ์ด๋ป๊ฒ ์ฌ์ฉํ ์ ์์๊น?
์๋ต์ ๋ฐ์ผ๋ฉด ์บ์๋ฅผ ์ฐ๊ณ , ์ฟผ๋ฆฌ๋ฅผ ์ง์ญ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋์ง ๊ฒฐ์ ํ๊ธฐ ์ํด ์บ์์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋๋ค. (์ด๋ _cache.has(key)
์ ๋์ผํ์ง๋ง, graph ์์์ ์๋ํ๋ค.)
์บ์ ๋ถํฌ์ํค๊ธฐ
์บ์๋ฅผ ๋ถ์ฐ์ํค๋ ๊ฒ์ GraphQL ์๋ต์ ๊ณ์ธต์ ๋ฐ๋ผ๊ฐ๋ฉฐ ์ ๊ทํ๋ ์บ์ ๋ ์ฝ๋๋ฅผ ์์ฑํ๊ณ ์ ๋ฐ์ดํธํ๋ ๊ณผ์ ์ ํฌํจํ๋ค.
์ฒ์์๋, ์๋ต ์์ฒด๋ก์จ ์ถฉ๋ถํด ๋ณด์ด์ง๋ง, ์ด๊ฒ์ ๋งค์ฐ ๊ฐ๋จํ ์ฟผ๋ฆฌ์๋ง ํด๋นํ๋ค.
์์ ๊ฒฝ์ฐ์์ photo
๋ฅผ ์ด๋ป๊ฒ ์ ์ฅํ ๊น?
photo
๋ฅผ ์บ์์ ํ๋ ์ด๋ฆ์ผ๋ก ์ฌ์ฉํ๋ฉด ์๋ํ์ง ์์ ๊ฒ์ด๋ค. ์๋ํ๋ฉด ๋ค๋ฅธ ์ฟผ๋ฆฌ๋ ๊ฐ์ ํ๋๋ฅผ ํจ์นํ์ง๋ง ๋ค๋ฅธ ์ธ์๊ฐ์ ์ฌ์ฉํ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
ํ์ด์ง๋ค์ด์ ์์๋ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค.
stories(first: 10, offset: 10)
๋ฅผ ํตํด 11~20๋ฒ์ ์คํ ๋ฆฌ๋ฅผ ํจ์นํ๋ฉด, ์ด ์๋ก์ด ๊ฐ์ ์ด๋ฏธ ์กด์ฌํ๋ ๋ฆฌ์คํธ์ ๋ถ์ฌ์ผ ํ๋ค.
๊ทธ๋์, ์ ๊ทํ๋ ์๋ต ์บ์๋ payload์ ์ฟผ๋ฆฌ๋ฅผ ๋ณ๋ ฌ์ ์ผ๋ก ์ฒ๋ฆฌํ๋ ๊ณผ์ ์ด ํ์ํ๋ค.
์๋ฅผ ๋ค์ด, ์์ photo
ํ๋๋ uniqueํ ํ๋์ ์ธ์๊ฐ์ ๊ตฌ๋ณํด๋ด๊ธฐ ์ํด photo_size(32)
์ ๊ฐ์ด ์์ฑ๋ ํ๋ ์ด๋ฆ๊ณผ ํจ๊ป ์บ์๋๋ค.
์บ์ ์ฝ๊ธฐ
์บ์๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ธฐ ์ํด์๋ ์ฟผ๋ฆฌ๋ฅผ ์คํํ ํ ๊ฐ ํ๋๋ฅผ resolve ํ๋ฉด ๋๋ค.
๊ทผ๋ฐ ์ด๊ฑด ์ ํํ GraphQL ์๋ฒ๊ฐ ์ฟผ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ณผ์ ๊ณผ ๋๊ฐ์ ๋ณด์ธ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ง๋ค!
์บ์๋ก๋ถํฐ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋ ๊ฒ์
๋ชจ๋ ๊ฒฐ๊ณผ๊ฐ ๊ณ ์ ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก๋ถํฐ ์ค๊ธฐ ๋๋ฌธ์ user-defined ํ๋ ํจ์๊ฐ ํ์ํ์ง ์๋ค.
๊ฒฐ๊ณผ๋ ํญ์ ๋๊ธฐํ๋๋ค. - ๋ฐ์ดํฐ๋ ์บ์๋์๊ฑฐ๋ ๊ฐ์ง๊ณ ์์ง ์๋ค.
๋ ์ ์์ ํน๋ณํ ์คํ ๊ณผ์ ์ ์๋ฏธํ๋ค.
Relay๋ Query traversal์ ์ํด ์ฌ๋ฌ ์ดํ์ ๊ฐ๊ณ ์๋ค. Query traversal์ด๋ ์ฟผ๋ฆฌ์ ํจ๊ป ์บ์๋ ์๋ต payload์ ๊ฐ์ ๋ฐ์ดํฐ๋ ๊ฒ์ฌํ๋ operation์ ์๋ฏธํ๋ค.
์๋ฅผ ๋ค์ด, ์ฟผ๋ฆฌ๊ฐ ํจ์น๋์์ ๋, Relay๋
diff
traversal์ ํตํด ์ด๋ค ํ๋๊ฐ ๋น ์ก๋์ง ๊ฒฐ์ ํ๋ค. (์ด๋ ๋ฆฌ์กํธ๊ฐ ๊ฐ์ ๋ ํธ๋ฆฌ๋ฅผ ๋น๊ตํ๋ ๊ฒ๊ณผ ๋น์ทํ๊ฒ ์๋ํ๋ค.)์ด๋ ํจ์น๋ ๋ฐ์ดํฐ์ ์์ ์ค์ด๊ณ Relay๋ก ํ์ฌ๊ธ ๋ชจ๋ ์ฟผ๋ฆฌ๊ฐ ์บ์๋ ์ํ์์ ๋ถํ์ํ ๋คํธ์ํฌ ์์ฒญ์ ํผํ๋ค.
์บ์ ์
๋ฐ์ดํธ
์ด๋ ๊ฒ ์ ๊ทํ๋ ์บ์ ๊ตฌ์กฐ๋ ๋ฐ๋ณต๋๋ ๊ฒฐ๊ณผ๋ฅผ ์ค๋ณต ์์ด ์ฒ๋ฆฌํ๋๋ก ํ๋ค.
๊ฐ๊ฐ์ ๋ ์ฝ๋๋ ์ด๋ป๊ฒ ํจ์น๋์๋์ง์ ๊ด๊ณ์์ด ๋จ ํ ๋ฒ ์ ์ฅ๋๋ค.
์ผ์ ํ์ง ์์ ๋ฐ์ดํฐ ์์๋ฅผ ํตํด ์ด๋ฌํ ์๋๋ฆฌ์ค์์ ์ด๋ป๊ฒ ์บ์๊ฐ ์๋ํ๋์ง ๋ณด์.
์ฒซ๋ฒ์งธ ์ฟผ๋ฆฌ๋ ์คํ ๋ฆฌ ๋ฆฌ์คํธ์๋ค:
์ ๊ทํ๋ ์บ์ ์๋ต์ ํตํด, ๋ ์ฝ๋๋ ๋ฆฌ์คํธ์ ๊ฐ ์คํ ๋ฆฌ๋ง๋ค ์์ฑ๋๋ค.
stories
ํ๋๋ ์ด๋ฌํ ๋ ์ฝ๋ ๊ฐ๊ฐ์ ๋งํฌ๋๋ค.
๋๋ฒ์งธ ์ฟผ๋ฆฌ๋ ๊ทธ ์ค ํ๋์ ์คํ ๋ฆฌ๋ฅผ refetch ํ๋ค.
์ด๋ฌํ ์๋ต์ด ์ ๊ทํ ๋๋ฉด, Relay๋ id
์ ๊ธฐ๋ฐํ์ฌ ์กด์ฌํ๋ ๋ฐ์ดํฐ์ ์ค๋ณต๋๋์ง ๊ฐ์งํ๋ค.
์๋ก์ด ๋ ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ๋ณด๋ค, Relay๋ ๊ธฐ์กด์ 123
๋ ์ฝ๋๋ฅผ ์
๋ฐ์ดํธํ๋ค.
์๋ก์ด likeCount
๋ ์ ์ชฝ์ ์ฟผ๋ฆฌ ๋ชจ๋์์ ์ด์ฉ ๊ฐ๋ฅํ๋ฉฐ, ํด๋น ์คํ ๋ฆฌ๋ฅผ ๋ชจ๋ ์ฐธ์กฐํ ์ ์๋ค.
๋ฐ์ดํฐ/ ๋ทฐ ์ผ๊ด์ฑ
์ ๊ทํ๋ ์บ์๋ ์บ์์ ์ผ์ ํจ์ ๋ณด์ฅํ๋ค.
ํ์ง๋ง ๋ทฐ๋ ์ด๋จ๊น?
์ด์์ ์ผ๋ก๋, React ๋ทฐ๋ ์บ์๋ก๋ถํฐ ์ต์ ์ ์ ๋ณด๋ฅผ ํญ์ ๋ฐ์ํด์ผ ํ๋ค.
์คํ ๋ฆฌ์ ํ ์คํธ์ ์ฝ๋ฉํธ๋ฅผ ์๊ธฐ ์ด๋ฆ, ์ฌ์ง๊ณผ ํจ๊ป ๋ ๋๋งํ๋ค๊ณ ๊ฐ์ ํด๋ณด์. ์ด์ ๋ํ GraphQL ์ฟผ๋ฆฌ๋ ๋ค์๊ณผ ๊ฐ๋ค.
์ด ์คํ ๋ฆฌ๋ฅผ ์ด๊ธฐ์ ํจ์นญํ ํ์ ์บ์๋ ๋ค์๊ณผ ๊ฐ์ ๊ฒ์ด๋ค. ์ด ๋ ์คํ ๋ฆฌ์ ์ฝ๋ฉํธ๋ author
๊ณผ ๊ฐ์ ๋ ์ฝ๋์ ์ฐ๊ฒฐ๋๋ค๋ ๊ฒ์ ๋ช
์ฌํ์.
์ด ์คํ ๋ฆฌ์ ์๊ฐ๋ ๋๊ธ๋ ๋ฌ์์ ๊ฒ์ด๋ค. ๊ทธ๋ ๋ค๋ฉด ๋ค๋ฅธ ๋ทฐ๊ฐ ์ด ์๊ฐ์ ๋ํ ์๋ก์ด ์ ๋ณด๋ฅผ ํจ์นํ๋ค๊ณ ๊ฐ์ ํ ๋, ๊ทธ๋ ์ ํ๋กํ ์ฌ์ง์ด ์๋ก์ด URI๋ก ๋ณ๊ฒฝ๋์๋ค๊ณ ํด๋ณด์.
๋ค์์ ์บ์๋ ๋ฐ์ดํฐ์์ ๋ณ๊ฒฝ๋ ์ ์ผํ ๋ถ๋ถ์ด๋ค.
photo
ํ๋ ๊ฐ์ ๋ณ๊ฒฝ๋์๊ณ , ๋ฐ๋ผ์ ๋ ์ฝ๋ 2
๋ํ ๋ณ๊ฒฝ๋์๋ค๊ณ ๋ณผ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ ์ ๋ถ๋ค!
๋ค๋ฅธ ์บ์ ์ ๋ณด๋ ์ํฅ์ ๋ฐ์ง ์๋๋ค.
ํ์ง๋ง ์ฐ๋ฆฌ ๋ทฐ๋ ์ด๋ฌํ ์ ๋ฐ์ดํธ๋ฅผ ๋ฐ์ํด์ผ ํ๋ค: UI์ ์คํ ๋ฆฌ์ ์ฝ๋ฉํธ ๋ชจ๋์์ ์๊ฐ์ ์๋ก์ด ์ฌ์ง์ ๋ณด์ฌ์ค์ผ ํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ผ๋ฐ์ ์ธ ๋ต์ โimmutable data structure๋ฅผ ์ด์ฉํ๋ผโ ์ผ ๊ฒ์ด๋ค. ํ์ง๋ง ๊ทธ๋ ๊ฒ ํ ์,
2
๋ฅผ ์๋ก์ด immutable ๋ ์ฝ๋๋ก ๋์ฒดํ๋ค๋ฉด, ์บ์ ๊ฐ์ฒด์ ๋ํ ์๋ก์ด immutable ์ธ์คํด์ค๋ฅผ ์ป๊ฒ ๋ ๊ฒ์ด๋ค. ํ์ง๋ง ๋ ์ฝ๋ 1
๊ณผ 3
์ ๋ณ๊ฒฝ๋์ง ์๋๋ค.
๋ฐ์ดํฐ๊ฐ ์ ๊ทํ๋์๊ธฐ(์ค๋ณต์ด ์ ๊ฑฐ๋์๊ธฐ) ๋๋ฌธ์, story
๋ง ๋ณด๊ณ ์๋ ์คํ ๋ฆฌ์ ์ปจํ
์ธ ๋ํ ๋ณ๊ฒฝ๋์ง ์์๋ค๊ณ ํ์ ํ ์ ์๋ค.
๋ทฐ ์ผ๊ด์ฑ ๋ฌ์ฑํ๊ธฐ
ํ๋ฉดํ๋ ์บ์๋ฅผ ์ด์ฉํด ๋ทฐ๋ฅผ ์ต์ ๋ฒ์ ์ผ๋ก ์ ๋ฐ์ดํธ ํ ์ ์๋ ๋ค์ํ ํด๊ฒฐ์ฑ ์ด ์กด์ฌํ๋ค.
Relay๋ ๊ฐ๊ฐ์ UI ๋ทฐ์ ๋ทฐ๊ฐ ์ฐธ์กฐํ๋ ID ์ธํธ๋ฅผ ๋งคํํ์ฌ ์ ์งํ๋ ๋ฐฉ๋ฒ์ ์ฑํํ๋ค.
์ด๋ฌํ ๊ฒฝ์ฐ, ์คํ ๋ฆฌ ๋ทฐ๋ ์คํ ๋ฆฌ์ ์๊ฐ, ๊ทธ๋ฆฌ๊ณ ์ฝ๋ฉํธ ๋ฑ์ด ์ ๋ฐ์ดํธ ๋์๋์ง ๊ตฌ๋ ํ ๊ฒ์ด๋ค.
๋ฐ์ดํฐ๋ฅผ ์บ์์ ์ธ ๋, Relay๋ ์ด๋ค ID๊ฐ ์ํฅ์ ๋ฐ๋์ง ํธ๋ํนํ๊ณ ์ํฅ์ ๋ฐ๋ ID์ ์ฐ๊ด๋ ๋ทฐ์๊ฒ๋ง notify ํ ๊ฒ์ด๋ค.
์ด๋ ๊ฒ ์ํฅ์ ๋ฐ๋ ๋ทฐ๋ ๋ฆฌ๋ ๋๋ง ๋๊ณ , ์ํฅ์ ๋ฐ์ง ์๋ ๋ทฐ๋ ์ฑ๋ฅ ํฅ์์ ์ํด ๋ฆฌ๋ ๋๋ง์ ํ์ง ์๋๋ค. (Relay๋ ์์ ํ์ง๋ง ํจ๊ณผ์ ์ธ shouldComponentUpdate
๋ฅผ ๊ธฐ๋ณธ์ผ๋ก ์ ๊ณตํ๋ค.)
์ด๋ฌํ ์ ๋ต ์์ด๋ ๋ชจ๋ ๋ทฐ๊ฐ ์์ ๋ณํ์๋ ๋ฆฌ๋ ๋๋ง ๋ ๊ฒ์ด๋ค.
์บ์๊ฐ ์ ๋ฐ์ดํธ ๋ ๋ ์ํฅ์ ๋ฐ๋ ๋ทฐ์ notify ํ๊ณ , write๋ ๊ทธ๋ ๊ฒ ์บ์๋ฅผ ์ ๋ฐ์ดํธ ํ๋ ํ๋์ ๋ฐฉ๋ฒ์ด๊ธฐ ๋๋ฌธ์, ์ด๋ฌํ ํด๊ฒฐ์ฑ ์ ์บ์๋ฅผ ์์ฑํจ์ ์์ด์๋ ์ ์ฉ๋๋ค.
Mutations
์ง๊ธ๊น์ง๋ ๋ฐ์ดํฐ๋ฅผ ์ฟผ๋ฆฌํ๊ณ ๋ทฐ๋ฅผ ์ต์ ๋ฒ์ ์ผ๋ก ์ ๋ฐ์ดํธํ๋ ๊ณผ์ ์ ๋ณด์์ง๋ง, write์ ๋ํด์๋ ์์๋ณด์ง ์์๋ค.
GraphQL์์๋, write๋ฅผ mutation
์ด๋ผ ์นญํ๋ค.
์ด๋ side effect๊ฐ ์๋ ์ฟผ๋ฆฌ๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
๋ค์์ ํน์ ์คํ ๋ฆฌ๊ฐ ํ์ฌ ์ ์ ์ ์ํด liked๋ ์ํ๋ฅผ ํ์ํ๋ mutation์ ๋ฐ์์ํค๋ ์์ ์ด๋ค.
์ด๋ mutation์ ๊ฒฐ๊ณผ๋ก ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ฅผ ์ฟผ๋ฆฌํ๋ ๊ฒ์์ ๋ช ์ฌํ์.
๊ทธ๋ ๋ค๋ฉด ๋ช ๋ฐฑํ ์ง๋ฌธ์ ๋ค์๊ณผ ๊ฐ๋ค:
์ ์๋ฒ๋ ์ด๋ค ๊ฒ์ด ๋ณ๊ฒฝ๋๋์ง ๊ทธ๋ฅ ์๋ ค์ฃผ์ง ์๋๊ฐ?
๋ต์:
๋ณต์กํ๊ธฐ ๋๋ฌธ์ด๋ค.
GraphQL๋ ์ฌ๋ฌ ์์ค์ ์งํฉ์ด๋ ๋ฐ์ดํฐ storage layer๋ฅผ ์ถ์ํ ํ๊ธฐ ๋๋ฌธ์, ๋ชจ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ์์ฉํ ์ ์๋ค.
๊ฒ๋ค๊ฐ, GraphQL์ ๋ชฉ์ ์ ํ๋ก๋ํธ ๊ฐ๋ฐ์๊ฐ ๋ทฐ๋ฅผ ์์ฑํ๋๋ฐ ์ ์ฉํ ํํ๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํจ์ ์๋ค.
GraphQL ์คํค๋ง๋ ๋ฐ์ดํฐ๊ฐ ์ด๋ค ๋์คํฌ์ ์ ์ฅ๋์ด ์๋์ง์ ๋ฐ๋ผ ๋ค๋ฅผ ์ ์๋ค.
๊ฐ๋จํ ๋งํด์: ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋์ด ์๋ ์ ์ฅ์ (๋์คํฌ) ์ product-visible ์คํค๋ง (GraphQL) ๋ 1:1๋ก ๋งค์นญ๋์ง ์๋๋ค.
์ด๋ฅผ ์ค๋ช
ํ ์ ์๋ ์๋ฒฝํ ์์๋ ํ๋ผ์ด๋ฒ์์ด๋ค: age
์ ๊ฐ์ด ์ ์ ์ ๋ํ ํ๋๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ, ํ์ฌ ํ์ฑํ๋ ์ ์ ๊ฐ ๊ทธ age
ํ๋๋ฅผ ๋ณผ ์ ์๋์ง ๊ฒฐ์ ํ๊ธฐ ์ํด data-storage ๋ ์ด์ด์ ์ ์ฅ๋ ์๋ง์ ๋ ์ฝ๋์ ์ ๊ทผํด์ผ ํ๋ค. (์น๊ตฌ์ธ๊ฐ? ๋์ด๊ฐ ๊ณต์ ๋๋๊ฐ? ์ฐจ๋จํ๋๊ฐ? ๋ฑ์ ๊ณ ๋ คํด์ผ ํจ.)
์ด๋ฌํ ํ์ค์ ์ธ ์ ์ฝ์ ๊ณ ๋ คํ์ ๋, GraphQL ์ ๊ทผ๋ฒ์ mutation ์ดํ์ ๋ณ๊ฒฝ๋ ๋ฐ์ดํฐ๋ฅผ ํด๋ผ์ด์ธํธ๊ฐ ์ฟผ๋ฆฌํ๊ธฐ์ ์ ํฉํ๋ค.
ํ์ง๋ง ์ ํํ ์ฟผ๋ฆฌ์ ๋ฌด์์ ๋ฃ์ด์ผ ํ ๊น?
Relay๋ฅผ ๊ฐ๋ฐํ๋ ๋์ ์ฌ๋ฌ ์์ด๋์ด๊ฐ ์์๋ค - ์ Relay๊ฐ ์ด๋ฌํ ์ ๊ทผ๋ฒ์ ์ฌ์ฉํ๋์ง ๊ณ ๋ คํ๋ ์ฌ๋ฌ ์ต์ ๋ค์ ํตํด ๊ฐ๋จํ ์์๋ณด์:
์ฑ์ด ์ฟผ๋ฆฌํ๋ ๋ชจ๋ ์ ๋ณด๋ฅผ re-ํจ์นํ๋ค. ๋ฐ์ดํฐ์ ์์ subset์ด ๋ณ๊ฒฝ๋์๋ค ํ๋๋ผ๋, ์๋ฒ๊ฐ ์ ์ฒด ์ฟผ๋ฆฌ๋ฅผ ์ํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ด๋ฐ๊ณ , ์ด ๊ณผ์ ์ ๋ฐ๋ณตํ๊ธฐ๊น์ง ๊ธฐ๋ค๋ ค์ผ ํ๋ค. ๋งค์ฐ ๋นํจ์จ์ ์ธ ๋ฐฉ์์ด๋ค.
ํ์ฌ ํ์ฑํ๋ ๋ ๋๋ง ๋ทฐ์์ ํ์๋ก ํ๋ ์ฟผ๋ฆฌ๋ง ๋ค์ ํจ์นํ๋ค. ์ต์ 1๋ณด๋ค ์ฝ๊ฐ์ ํฅ์์ ๊ธฐ๋ํ ์ ์์ง๋ง, ์์ง๊น์ง ํ์ธํ์ง ์์๋ ๋ฐ์ดํฐ ์ค ์บ์๋ ๋ฐ์ดํฐ๋ ์ ๋ฐ์ดํธ ๋์ง ์๋๋ค. ์ด ๋ฐ์ดํฐ๊ฐ ์ด๋ป๊ฒ๋ ๋ณ๊ฒฝ๋์๋ค๊ณ ํ์๋์ง ์๋ ํ, ์ดํ์ ์ฟผ๋ฆฌ๋ ๊ตฌ์์ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ๊ฒ์ด๋ค.
mutation ์ดํ์ ๋ณ๊ฒฝ๋ ์ ์๋ ๊ณ ์ ๋ ๋ฆฌ์คํธ์ ํ๋ ๊ฐ๋ค๋ง์ ๋ค์ ํจ์นํ๋ค. ์ด๋ฅผ fat query ๋ผ๊ณ ํ๋ค. ์ ํ์ ์ธ ์ดํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ ์ด ์ค ์ผ๋ถ๋ง์ ๋ ๋๋งํ์ง๋ง, ์ด ์ ๊ทผ๋ฒ์ ๋ชจ๋ ํ๋๋ฅผ ํจ์นญํด์ผ ํ๊ธฐ ๋๋ฌธ์ ๋นํจ์จ์ ์ด๋ค. (๋ค์ ํจ์นญํ ๊ฐ ์ค ์ฌ์ฉํ์ง ์์ ๊ฐ๋ค์ด ๋ง์ ๊ฐ๋ฅ์ฑ์ด ๋์.)
์ด๋ค ๊ฒ์ด ๋ณํ ์ง์ ๋ํ ์ ๋ณด๋ฅผ ๋ด์ ๊ต์ฐจ๋ถ๋ถ๊ณผ ์บ์์ ๋ฐ์ดํฐ๋ง์ ๋ค์ ํจ์นญํ๋ค. (fat query) ์ฌ๊ธฐ์ ๋ํด์, Relay๋ ๊ฐ ์์ดํ ์ ํจ์นํ๊ธฐ ์ํด ์ฌ์ฉ๋ ์ฟผ๋ฆฌ ๋ํ ๊ธฐ์ตํ๋ค. ์ด๋ฅผ tracked queries ๋ผ๊ณ ์ผ์ปซ๋๋ค. ์ด๋ฌํ tracked & fat queries ์ ๊ต์งํฉ์ ์ด์ฉํด, Relay๋ ์ดํ๋ฆฌ์ผ์ด์ ์์ ์ ๋ฐ์ดํธ ํ ์ ๋ณด๋ง์ ์ฟผ๋ฆฌํ ์ ์๋ค.
๋ฐ์ดํฐ ํจ์นญ APIs
์ง๊ธ๊น์ง ๋ฐ์ดํฐ ํจ์นญ์ ์ํ ์ ๋ ๋ฒจ ์ธก๋ฉด๊ณผ ์ต์ํ ์ฌ๋ฌ ์ปจ์ ์ด ์ด๋ป๊ฒ GraphQL๋ก ๋ณํ๋์๋์ง ์์๋ณด์๋ค.
๋ค์๋ฒ์, ๊ณ ์ฐจ์์ ์ธ ๊ฐ๋ ์ ํตํด ํ๋ก๋ํธ ๊ฐ๋ฐ์๊ฐ ๋ฐ์ดํฐ ํจ์นญ์ ํ๋ ๊ณผ์ ์์ ์ง๋ฉดํ๋ ์ฌ๋ฌ ๋ฌธ์ ๋ฅผ ์์๋ณด์:
๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ๋ทฐ ๊ณ์ธต์ ์ธก๋ฉด์์ ํจ์นญํ๋ค.
๋น๋๊ธฐ์ ์ธ ์ํ ์ด์ ๊ณผ ๋์๋ค๋ฐ์ ์ธ ์์ฒญ์ ๊ด๋ฆฌํ๋ค.
์๋ฌ๋ฅผ ์ปจํธ๋กคํ๋ค.
์คํจํ ์์ฒญ์ ๋ค์ ์์ฒญํ๋ค.
query/ mutation ์๋ต์ ๋ฐ์ ํ์ ์ง์ญ ์บ์๋ฅผ ์ ๋ฐ์ดํธํ๋ค.
race condition์ ํผํ๊ธฐ ์ํด mutation์ ํ์ํ๋ค.
์๋ฒ๋ก๋ถํฐ mutation์ ๋ํ ์๋ต์ ๊ธฐ๋ค๋ฆฌ๋ ๋์ UI ์ ๋ฐ์ดํธ๋ฅผ ์ต์ ํํ๋ค.
imperative API๋ฅผ ์ด์ฉํด ๋ฐ์ดํฐ๋ฅผ ํจ์นญํ๋ ์ ํ์ ์ธ ๋ฐฉ๋ฒ์ ๊ฐ๋ฐ์๋ก ํ์ฌ๊ธ ๋ถํ์ํ๊ฒ ๋์ ๋ณต์ก์ฑ์ ๊ฐ๋นํ๋๋ก ํ๋ค.
์๋ฅผ ๋ค์ด, UI ์ ๋ฐ์ดํธ๋ฅผ ์ต์ ํํ๋ ๊ฒ์ ์๊ฐํด๋ณด์.
์ด๋ ์๋ฒ ์๋ต์ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ์ ์ ์๊ฒ ํผ๋๋ฐฑ์ ์ฃผ๋ ๊ฒ์ด ๋ ์ ์๋ค.
์ด๋ค ๊ฒ์ ํด์ผํ๋์ง๋ ๊ฝค ๋ถ๋ช ํ๋ค: ์ ์ ๊ฐ โlikeโ ๋ฒํผ์ ๋๋ฅด๋ฉด, ์คํ ๋ฆฌ๋ฅผ liked ์ฒ๋ฆฌํ๊ณ ์๋ฒ์ ์์ฒญ์ ๋ณด๋ธ๋ค.
ํ์ง๋ง ๊ตฌํ์ ๋ณดํต ๋ ๋ณต์กํ๋ค.
UI์ ๋๋ฌํ ํ ๋ฒํผ์ ํ ๊ธํ๊ณ , ๋คํธ์ํฌ ์์ฒญ์ ๊ฐ์ํ๊ณ ํ์ํ ๊ฒฝ์ฐ ์ด๋ฅผ ๋ค์ ์๋ํ๋ฉฐ, ๋ง์ฝ ์คํจํ ์ ์๋ฌ๋ฅผ ๋ณด์ฌ์ค์ผ ํ๋ค. ๋ ๋ฒํผ์ ์ธํ ๊ธํด์ผ ํ๋ค. ๋ฑ๋ฑ์ด ์๋ค.
๋ฐ์ดํฐ ํจ์น๋ ์์ ๋์ผํ๋ค: ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ํ์๋ก ํ๋์ง ๊ตฌ์ฒดํํ๋ ๊ฒ์ ๋ณดํต ์ด๋ป๊ฒ, ์ธ์ ๋ฐ์ดํฐ๊ฐ ํจ์น๋๋์ง ๋ํ๋ด์ผ ํ๋ค.
์ด๋ฌํ ๊ณ ๋ฏผ์ Relay๋ก ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ค์ ์ฅ์์ ์์๋ณผ ๊ฒ์ด๋ค.
To be continued...
Last updated