Thinking in Relay
Relay์ ๋ฐ์ดํฐ ํ์นญ ๊ธฐ๋ฒ์ React๋ก๋ถํฐ ์๊ฐ์ ๋ฐ์๋ค. React๋ ๋ณต์กํ ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ปดํฌ๋ํธ ๋จ์๋ก ๋๋๋๋ฐ, ์ด๋ ๊ฐ๋ฐ์๋ก ํ์ฌ๊ธ ์ดํ๋ฆฌ์ผ์ด์ ์ ๋๋ ์ ์๋ ์ต์ํ์ ๋ ๋ฆฝ๋ ๋จ์๋ฅผ ์๊ฐํด๋ณด๋๋ก ํ๊ณ , ์ดํ๋ฆฌ์ผ์ด์ ๋ด๋ถ ๊ฐ๊ธฐ ๋ค๋ฅธ ๋ถ๋ถ๋ค ๊ฐ์ ๊ฒฐํฉ๋๊ฐ ๋ฎ์์ง๋๋ก ํ๋ค. ๋ ์ค์ํ ์ ์ ์ด๋ฌํ ์ปดํฌ๋ํธ๊ฐ ์ ์ธ์ ์ด๋ผ๋ ์ ์ด๋ค: ๊ฐ๋ฐ์๋ UI์ ํน์ ์ํ๊ฐ ์ฃผ์ด์ก์ ๋ ์ด๋ค ๋ชจ์ต์ด์ด์ผํ๋์ง ๊ตฌ์ฒดํํ๊ณ , UI๋ฅผ ์ด๋ป๊ฒ ๋ณด์ด๊ฒ ํ ์ง๋ ์๊ฐํ์ง ์์๋ ๋๋ค. DOM๊ณผ ๊ฐ์ด ๋ช ๋ นํ ์ปค๋งจ๋๋ฅผ ์ด์ฉํด native ๋ทฐ๋ฅผ ์กฐ์ํ๋ ์ด์ ์ ์ ๊ทผ ๋ฐฉ๋ฒ๊ณผ๋ ๋ค๋ฅด๊ฒ, React๋ UI description์ ์ด์ฉํด ํ์ํ ์ปค๋งจ๋๋ฅผ ์๋์ ์ผ๋ก ๊ฒฐ์ ํ๋ค.
์ด๋ฌํ ์์ด๋์ด๊ฐ ์ด๋ป๊ฒ Relay์ ์ ์ฉ๋์๋์ง ๋ช ๊ฐ์ง use-case๋ฅผ ๋ณด๋ฉฐ ์์๋ณด์.
๋ทฐ๋ฅผ ์ํ ๋ฐ์ดํฐ ํ์นญ
๊ฒฝํ ์, ๋๋ถ๋ถ์ ํ๋ก๋ํธ๋ ํ๊ฐ์ง ํน์ ๊ธฐ๋ฅ์ ์ํ๋ค: ๋ก๋ฉ ์ธ๋์ผ์ดํฐ๊ฐ ํ์๋๋ ๋์ ๋ทฐ์์ ํ์ํ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํ๊บผ๋ฒ์ ํ์นญํ๊ณ , ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ๋ก๋๋ ์ดํ ์ ์ฒด ๋ทฐ๋ฅผ ํ๋ฒ์ ๋ ๋๋ง๋๋๋ก ํ๋ ๊ฒ์ด์๋ค.
์ด์ ๋ํ ํ ๊ฐ์ง ํด๊ฒฐ์ฑ ์ ์ต์์ ์ปดํฌ๋ํธ์์ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ํ์๋ก ํ๋์ง ์ ์ํ๊ณ ํ์นญํ๋ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋, ์ด๋ ๋ถ๋ชจ-์์ ์ปดํฌ๋ํธ ๊ฐ ๊ฒฐํฉ๋๋ฅผ ๋์ธ๋ค: ์์ ์ปดํฌ๋ํธ์์ ์๊ธฐ๋ ๋ณํ๋ ์ด๋ฅผ ํฌํจํ๋ ๋ฃจํธ ์ปดํฌ๋ํธ์ ๋ณ๊ฒฝ๋ ํจ๊ป ๊ฐ์ ธ์ฌ ๊ฒ์ด๋ค! ์ด๋ฌํ ์ปคํ๋ง์ ๋ฒ๊ทธ์ ์ํ์ฑ์ ๋์ด๊ณ ๊ฐ๋ฐ์ ์๋๋ฅผ ๋ฎ์ถ๋ค.
๋ค๋ฅธ ๋ ผ๋ฆฌ์ ์ธ ์ ๊ทผ๋ฒ์ ๊ฐ๊ฐ์ ์ปดํฌ๋ํธ๋ก ํ์ฌ๊ธ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ์ ์ํ๊ณ ํ์นญํ๊ฒ ํ๋ ๊ฒ์ด๋ค. ์ด๋ ์ข์ ๋ฏ ๋ณด์ด์ง๋ง, ์ปดํฌ๋ํธ๊ฐ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋๋์ ๋ฐ๋ผ ๋ค๋ฅธ children์ ๋ ๋๋ง ํ ์ ์๋ค๋ ๋ฌธ์ ์ ์ด ์๋ค. ๋ฐ๋ผ์, ์ค์ฒฉ๋ ์ปดํฌ๋ํธ์์ ์์ ์ปดํฌ๋ํธ๋ ๋ถ๋ชจ ์ปดํฌ๋ํธ์ ์ฟผ๋ฆฌ๊ฐ ์คํ์ด ์๋ฃ๋ ๋๊น์ง ๋ ๋๋ง ๋ฐ ๋ฐ์ดํฐ ํ์นญ์ด ๋ถ๊ฐํ๋ค. ์ฆ, ๋ฐ์ดํฐ ํ์นญ์ด ๋จ๊ณ์ ์ผ๋ก ๋ฐ์ํ๊ฒ ๋๋ค: ์ฒซ์งธ๋ ๋ฃจํธ์์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ํ์นญํ๊ณ , children์ ๋ ๋๋งํ๋ฉด์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ํ์นญํ๊ณ , ์ด๋ฅผ ๊ณ์ํด์ ์ตํ์ ์ปดํฌ๋ํธ์ ๋๋ฌํ ๋๊น์ง ๋ฐ๋ณตํ๋ค. ๋ ๋๋ง์๋ ์ฌ๋ฌ ๋ฒ์ ๋๋ฆฌ๊ณ ์ฐ์์ ์ธ ๋คํธ์ํฌ ์์ฒญ์ด ์๊ตฌ๋ ๊ฒ์ด๋ค.
Relay๋ ์ด ๋๊ฐ์ง์ ์ ๊ทผ ๋ฐฉ์์ ์ฐฉ์ํ์ฌ ์ปดํฌ๋ํธ๋ก ํ์ฌ๊ธ ์ด๋ค ๋ฐ์ดํฐ๋ฅผ ํ์๋ก ํ๋์ง ๋ช ์ํ๋๋ก ์๊ตฌํ๋ ๋์์, ์ด๋ฅผ ์ปดํฌ๋ํธ๋ค์ subtree์์ ์ฌ์ฉํ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ํ์นญํ ํ๋์ ์ฟผ๋ฆฌ๋ก ํฉ์น๋ค. ์ฆ, ์ดํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋๊ธฐ ์ , ์ฝ๋๋ฅผ ์์ฑํ ๋ ๋ชจ๋ ๋ทฐ์ ํ์ํ ๋ฐ์ดํฐ์ ๋ํ ์๊ตฌ์ฌํญ์ ์ ์ ์ผ๋ก ์ ์ํ ์ ์๋ค๋ ๊ฒ์ด๋ค!
์ด๋ฅผ ์ํด GraphQL์ด ์ฌ์ฉ๋๋๋ฐ, ํจ์ํ ์ปดํฌ๋ํธ๋ ํ๋ ์ด์์ GraphQL ํ๋๊ทธ๋จผํธ๋ฅผ ์ด์ฉํด ๊ทธ๋ค์ ๋ฐ์ดํฐ ์๊ตฌ ์ฌํญ์ ์ ์ํ๋ค. ์ด๋ฌํ ํ๋๊ทธ๋จผํธ๋ ๋ค๋ฅธ ํ๋๊ทธ๋จผํธ์ ์ค์ฒฉ๋์ด ์๊ณ , ๊ถ๊ทน์ ์ผ๋ก ์ฟผ๋ฆฌ ์์ ์กด์ฌํ๊ฒ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ์ฟผ๋ฆฌ๊ฐ ํ์น๋ ๋, Relay๋ ํ๋์ ๋คํธ์ํฌ ์์ฒญ์ ์คํํ๊ณ ๋ด๋ถ์ ์ค์ฒฉ๋ ํ๋๊ทธ๋จผํธ๋ฅผ ๊ฐ์ ธ์จ๋ค. ์ฆ, Relay runtime์ ๋ทฐ์ ํ์ํ ๋ชจ๋ ๋ฐ์ดํฐ๋ฅผ ์ด ํ ๋ฒ์ ๋คํธ์ํฌ ์์ฒญ ์ ํตํด ๊ฐ์ ธ์ฌ ์ ์๋ค๋ ๊ฒ์ด๋ค.
์๋ํ๋ ๋ฐฉ์์ ์์ธํ ์ดํด๋ณด์.
์ปดํฌ๋ํธ์ ํ์ํ ๋ฐ์ดํฐ ๊ตฌ์ฒดํํ๊ธฐ
Relay์์๋, ์ปดํฌ๋ํธ๋ฅผ ์ํ ๋ฐ์ดํฐ ์๊ตฌ์ฌํญ์ ํ๋๊ทธ๋จผํธ๋ฅผ ํตํด ๋ช ์ธ๋๋ค. ํ๋๊ทธ๋จผํธ๋ ํน์ ํ์ ์ ๊ฐ์ฒด์์ ์ด๋ค ํ๋๋ฅผ ํ์๋ก ํ๋์ง ๋ช ์ํ ์ ์๋๋ก ํ๋ GraphQL์ named snippet์ด๋ฉฐ, GraphQL ๋ฌธ๋ฒ์ผ๋ก ์์ฑํ๋ค. ์๋ฅผ ๋ค์ด, ๋ค์์ ์๊ฐ์ ์ด๋ฆ๊ณผ ์ฌ์ง url์ ์ ํํ๋ ํ๋๊ทธ๋จผํธ๋ฅผ ์์ฑํ ๊ฒ์ด๋ค.
์ด ๋ฐ์ดํฐ๋ React ํจ์ํ ์ปดํฌ๋ํธ ๋ด๋ถ์์ useFragment(...)
ํ
์ ํธ์ถ์ ํตํด ์คํ ์ด๋ก๋ถํฐ ์ฝ์ด์ง๋ค. ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์ค์ author ๊ฐ์ฒด๋ useFragment
์ 2๋ฒ์งธ ์ธ์๋ก ์ ๋ฌ๋๋ค. ์๋ฅผ ๋ค์ด:
๋๋ฒ์งธ ํ๋ผ๋ฏธํฐ์ธ props.author
๋ ํ๋๊ทธ๋จผํธ์ ๋ ํผ๋ฐ์ค์ด๋ค. ์ด๋ ํ๋์ ํ๋๊ทธ๋จผํธ๋ฅผ ๋ค๋ฅธ ํ๋๊ทธ๋จผํธ๋ ์ฟผ๋ฆฌ์ spreadingํ์ฌ ์ป์ด์ง๋ค. ํ๋๊ทธ๋จผํธ๋ ์ง์ ์ ์ผ๋ก ํ์นญํ ์ ์๊ณ , ๋์ ๋ชจ๋ ํ๋๊ทธ๋จผํธ๋ ๊ถ๊ทน์ ์ผ๋ก ํ์นํ๊ณ ์ ํ๋ ์ฟผ๋ฆฌ์ ๋ด๋ถ์ spread๋์ด ์ฌ์ฉ๋๋ค.
์ด ํ๋๊ทธ๋จผํธ๋ฅผ ์ฌ์ฉํ๋ ํ ์ฟผ๋ฆฌ๋ฅผ ์ดํด๋ณด์.
Queries
๋ฐ์ดํฐ๋ฅผ ํ์นํ๊ธฐ ์ํด, ํ๋๊ทธ๋จผํธ AuthorDetails_author
๋ฅผ spreadํ๋ ์ฟผ๋ฆฌ๋ฅผ ๋ง๋ค์ด๋ณด์.
์ด์ const data = useLazyLoadQuery(storyQuery, {storyID})
๋ฅผ ํตํด ์ฟผ๋ฆฌ๋ฅผ ํ์นํ ์ ์๋ค. ์ด ๋ถ๋ถ์์, data.author
(๋ชจ๋ ๋ฐ์ดํฐ๋ ๊ธฐ๋ณธ์ ์ผ๋ก nullable์ด์ง๋ง, ๋ฐ์ดํฐ๊ฐ ์๋ค๋ ๊ฐ์ ํ์) ๋ AuthorDetails
๋ก ์ ๋ฌํ ์ ์๋ ํ๋๊ทธ๋จผํธ ๋ ํผ๋ฐ์ค๋ก ์์ฉํ๋ค.
์๋ฅผ ๋ค์ด:
์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ ํ ๋ฒ์ ๋คํธ์ํฌ ์์ฒญ์ ์ด์ฉํด Story
์ปดํฌ๋ํธ์ AuthorDetails
์ปดํฌ๋ํธ์ ํ์ํ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ๊ฐ์ ธ์๋ค. ๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ๋ก๋๋ ํ, ์ ์ฒด ๋ทฐ๋ ํ ๋ฒ์ ๋ ๋๋ง ๋ ์ ์๋ค.
๋ฐ์ดํฐ ๋ง์คํน
์ ํ์ ์ธ ๋ฐ์ดํฐ ํ์นญ ๋ฐฉ๋ฒ์ผ๋ก ๋๊ฐ์ ์ปดํฌ๋ํธ๊ฐ ๊ฐ์ ์ ์ธ ์์กด์ฑ ์ ๊ฐ์ง๋ ๋ฐฉ๋ฒ์ด ์๋ค. ์์ ์์์์, <Story />
๋ ๋ฐ์ดํฐ๊ฐ ํ์นญ๋์๋ค๋ ๋ช
์์ ์ธ ๋ณด์ฅ ์์ด ๋ช ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ์ํฉ์ด ์์ ์ ์๋ค. ์ด ๋ฐ์ดํฐ๋ <AuthorDetails />
๊ณผ ๊ฐ์ด ์ข
์ข
์์คํ
์ ๋ค๋ฅธ ๋ถ๋ถ์์ ๋ก๋๋๊ณค ํ๋๋ฐ, ์ด๋ฐ ์ํฉ์์ <AuthorDetails />
๋ด๋ถ์ ๋ฐ์ดํฐ ํ์นญ ๋ก์ง์ ์ ๊ฑฐํ๋ฉด <Story />
๋ ๊ฐ์๊ธฐ ์ ์ ์๋ ์ด์ ๋ก ๋์ํ์ง ์๊ฒ ๋๋ค. ์ด๋ฐ ์ข
๋ฅ์ ๋ฒ๊ทธ๋ค์ ์ฆ์ ๋ฐ๊ฒฌํ๊ธฐ ์ด๋ ต๊ณ , ๊ท๋ชจ๊ฐ ํฐ ์ดํ๋ฆฌ์ผ์ด์
์ผ์๋ก ๋์ฑ ๊ทธ๋ ๋ค. ์๋/์๋ํ๋ ํ
์คํ
์ด ๋์์ด ๋ ์ ์์ง๋ง, ์ด๋ ๋ช
๋ฐฑํ ์์คํ
์ ์ธ ๋ฌธ์ ์ด๊ณ ํ๋ ์์ํฌ๊ฐ ๋ ์ ํ์ด๋ผ ์ ์๋ ๋ฌธ์ ์ด๋ค.
์์์ Relay๋ ๋ทฐ๋ฅผ ์ํ ๋ฐ์ดํฐ๋ฅผ ํ ๋ฒ์ ํ์นญํ๋ ๊ฒ์ด ๋ณด์ฅ๋จ์ ์ด๋ฏธ ๋ณด์๋ค. ์ฌ๊ธฐ์ ๋ํด Relay๋ ์ง์ ์ ์ผ๋ก ๋๋ฌ๋์ง ์๋ ๋ ๋ค๋ฅธ ์ด์ ์ ์ ๊ณตํ๋๋ฐ, ๋ฐ๋ก ๋ฐ์ดํฐ ๋ง์คํน์ด๋ค. Relay๋ ์ปดํฌ๋ํธ๋ค์ด ํ๋๊ทธ๋จผํธ๋ฅผ ํตํด ์์ฒญํ ๋ฐ์ดํฐ์๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํ๋๋ก ์ ํํ๋ค. ๋ฐ๋ผ์ ๋ง์ฝ ํ ์ปดํฌ๋ํธ๊ฐ Story์ title
ํ๋๋ฅผ ์ฐธ์กฐํ๊ณ , ๋ค๋ฅธ ํ ์ปดํฌ๋ํธ๋ text
ํ๋๋ฅผ ์ฐธ์กฐํ๊ณ ์๋ค๋ฉด, ๊ฐ๊ฐ์ ๊ทธ๋ค์ด ์๊ตฌํ ํ๋๋ง์ ์ฐธ์กฐํ ์ ์๋ค. ์ฌ์ง์ด ์ปดํฌ๋ํธ๋ค์ ๊ทธ๋ค์ ์์ ์ปดํฌ๋ํธ ๊ฐ ์์ฒญํ ๋ฐ์ดํฐ๋ ๋ณผ ์ ์๋ค. ์๋๋ฉด ์ด ์ญ์ ์บก์ํ๋ฅผ ๊นจ๊ธฐ ๋๋ฌธ์ด๋ค.
Relay๋ ์ฌ๊ธฐ์ ๋ ํ์ฅ๋๋๋ฐ, ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๊ธฐ ์ ์ ๋ช
์์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ํ์นํ์์ ๊ฒ์ฆํ๊ธฐ ์ํด props
์ opaque(๋ถํฌ๋ช
ํ) identifier๋ฅผ ์ฌ์ฉํ๋ค. ๋ง์ฝ <Story />
๊ฐ <AuthorDetails />
๋ฅผ ๋ ๋๋งํ์ง๋ง, ๊ทธ ํ๋๊ทธ๋จผํธ๊ฐ spread๋์ง ์์๋ค๋ฉด, Relay๋ <AuthorDetails />
์ ์ ๋ฌ๋ ๋ฐ์ดํฐ๊ฐ ๋๋ฝ๋์์์ ๊ฒฝ๊ณ ํด์ค๋ค. ์ฌ์ง์ด Relay๋ <AuthorDetails />
์์ ์ฐธ์กฐํ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ ์ปดํฌ๋ํธ์์ ํ์นญํ๋ ์ํฉ์์๋ ๊ฒฝ๊ณ ๋ฅผ ํ์ํด์ค๋ค. ์ด ๊ฒฝ๊ณ ๋ ์ง๊ธ์ ์ ์์ ์ผ๋ก ๋์ํ๋ ์ฝ๋๋ผ ํ ์ง๋ผ๋, ์ถํ์ ๋ฒ๊ทธ๋ก ์ด์ด์ง ๊ฐ๋ฅ์ฑ์ด ๋์ ๋ถ๋ถ์์ ์๋ ค์ค๋ค.
๊ฒฐ๋ก
GraphQL์ ํจ์จ์ ์ด๊ณ , ๋ ๋ฆฝ๋ ํด๋ผ์ด์ธํธ ์ดํ๋ฆฌ์ผ์ด์ ์ ์ํ ๊ฐ๋ ฅํ ํด์ ์ ๊ณตํ๋ค. Relay๋ ์ด ๊ธฐ๋ฐ ์์์ ๋ช ์์ ์ธ ๋ฐ์ดํฐ ํ์นญ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ํ๋ ์์ํฌ๋ก ์์ฉํ๋ค. ์ด๋ป๊ฒ ๋ฐ์ดํฐ๊ฐ ํ์น๋๋์ง๋ฅผ ์ด๋ค ๋ฐ์ดํฐ๊ฐ ํ์น๋๋์ง๋ก๋ถํฐ ๋ถ๋ฆฌํจ์ผ๋ก์จ, Relay๋ ๋น ๋ฅด๊ณ , ํฌ๋ช ํ๊ณ , ์ฑ๋ฅ์ด ์ฐ์ํ ์ดํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์๋๋ก ํ๋ค. Relay๋ ์ปดํฌ๋ํธ ์ค์ฌ์ ์ฌ๊ณ ์ ๊ธฐ๋ฐํ React์ ์ข์ ์กฐ๋ ฅ์์ด๋ฉฐ, React / Relay / GraphQL ์ ๊ฐ๊ฐ์ ๊ธฐ์ ๋ก๋ ๊ฐ๋ ฅํ์ง๋ง, ์ด ๋ชจ๋๊ฐ ๊ฒฐํฉ๋ UI ํ๋ซํผ์ ๋๊ท๋ชจ ์ดํ๋ฆฌ์ผ์ด์ ์ผ๋ก ํ์ฌ๊ธ ๋น ๋ฅธ ๋ณํ๋ฅผ ๋์ ํ๋ฆฌํฐ๋ก ๊ฐ๋ฅํ๊ฒ ๋ง๋ ๋ค.
Last updated