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์„ ์„ ํƒํ•˜๋Š” ํ”„๋ž˜๊ทธ๋จผํŠธ๋ฅผ ์ž‘์„ฑํ•œ ๊ฒƒ์ด๋‹ค.

// AuthorDetails.react.js
const authorDetailsFragment = graphql`
  fragment AuthorDetails_author on Author {
    name
    photo {
      url
    }
  }
`;

์ด ๋ฐ์ดํ„ฐ๋Š” React ํ•จ์ˆ˜ํ˜• ์ปดํฌ๋„ŒํŠธ ๋‚ด๋ถ€์—์„œ useFragment(...) ํ›…์˜ ํ˜ธ์ถœ์„ ํ†ตํ•ด ์Šคํ† ์–ด๋กœ๋ถ€ํ„ฐ ์ฝ์–ด์ง„๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ์‹ค์ œ author ๊ฐ์ฒด๋Š” useFragment ์˜ 2๋ฒˆ์งธ ์ธ์ž๋กœ ์ „๋‹ฌ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด:

// AuthorDetails.react.js
export default function AuthorDetails(props) {
  const data = useFragment(authorDetailsFragment, props.author);
  // ...
}

๋‘๋ฒˆ์งธ ํŒŒ๋ผ๋ฏธํ„ฐ์ธ props.author๋Š” ํ”„๋ž˜๊ทธ๋จผํŠธ์˜ ๋ ˆํผ๋Ÿฐ์Šค์ด๋‹ค. ์ด๋Š” ํ•˜๋‚˜์˜ ํ”„๋ž˜๊ทธ๋จผํŠธ๋ฅผ ๋‹ค๋ฅธ ํ”„๋ž˜๊ทธ๋จผํŠธ๋‚˜ ์ฟผ๋ฆฌ์— spreadingํ•˜์—ฌ ์–ป์–ด์ง„๋‹ค. ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” ์ง์ ‘์ ์œผ๋กœ ํŽ˜์นญํ•  ์ˆ˜ ์—†๊ณ , ๋Œ€์‹  ๋ชจ๋“  ํ”„๋ž˜๊ทธ๋จผํŠธ๋Š” ๊ถ๊ทน์ ์œผ๋กœ ํŽ˜์น˜ํ•˜๊ณ ์ž ํ•˜๋Š” ์ฟผ๋ฆฌ์˜ ๋‚ด๋ถ€์— spread๋˜์–ด ์‚ฌ์šฉ๋œ๋‹ค.

์ด ํ”„๋ž˜๊ทธ๋จผํŠธ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ•œ ์ฟผ๋ฆฌ๋ฅผ ์‚ดํŽด๋ณด์ž.

Queries

๋ฐ์ดํ„ฐ๋ฅผ ํŽ˜์น˜ํ•˜๊ธฐ ์œ„ํ•ด, ํ”„๋ž˜๊ทธ๋จผํŠธ AuthorDetails_author ๋ฅผ spreadํ•˜๋Š” ์ฟผ๋ฆฌ๋ฅผ ๋งŒ๋“ค์–ด๋ณด์ž.

// Story.react.js
const storyQuery = graphql`
  query StoryQuery($storyID: ID!) {
    story(id: $storyID) {
      title
      author {
        ...AuthorDetails_author
      }
    }
  }
`;

์ด์ œ const data = useLazyLoadQuery(storyQuery, {storyID}) ๋ฅผ ํ†ตํ•ด ์ฟผ๋ฆฌ๋ฅผ ํŽ˜์น˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๋ถ€๋ถ„์—์„œ, data.author(๋ชจ๋“  ๋ฐ์ดํ„ฐ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ nullable์ด์ง€๋งŒ, ๋ฐ์ดํ„ฐ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฐ€์ • ํ•˜์—) ๋Š” AuthorDetails๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋ž˜๊ทธ๋จผํŠธ ๋ ˆํผ๋Ÿฐ์Šค๋กœ ์ž‘์šฉํ•œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด:

// Story.react.js
function Story(props) {
  const data = useLazyLoadQuery(storyQuery, props.storyId);

  return (
    <>
      <Heading>{data?.story.title}</Heading>
      {data?.story?.author && <AuthorDetails author={data.story.author} />}
    </>
  );
}

์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” ํ•œ ๋ฒˆ์˜ ๋„คํŠธ์›Œํฌ ์š”์ฒญ์„ ์ด์šฉํ•ด 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