Queries

GraphQL Query ๋Š” GreaphQL ์„œ๋ฒ„์—์„œ query ํ•˜๋ ค๋Š” ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค. query ๋Š” ์„œ๋ฒ„์— ์š”์ฒญํ•˜๋ ค๋Š” ํ•„๋“œ ์„ธํŠธ ( ์ž ์žฌ์ ์œผ๋กœ Fragment)๋กœ ๊ตฌ์„ฑ ๋ฉ๋‹ˆ๋‹ค. ์ฟผ๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ํ•ญ๋ชฉ์€ ์ฟผ๋ฆฌ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์„ค๋ช…ํ•˜๋Š” ์„œ๋ฒ„์— ๋…ธ์ถœ๋œ GraphQL ์Šคํ‚ค๋งˆ ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค .

๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด์„œ ์ฟผ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์„ ํƒ์  ๋ณ€์ˆ˜(variables) ์ปฌ๋ ‰์…˜๊ณผ ํ•จ๊ป˜ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์š”์ฒญ์œผ๋กœ ๋ณด๋‚ผ์ˆ˜์žˆ์Šต๋‹ˆ๋‹ค.

query UserQuery($id: ID!) {
  user(id: $id) {
    id
    name
    ...UserFragment
  }
  viewer {
    actor {
      name
    }
  }
}

fragment UserFragment on User {
  username
}

์ด ์ฟผ๋ฆฌ๋Š” ์•„๋ž˜์™€ ๊ฐ™์€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

{
  "data": {
    "user": {
      "id": "4",
      "name": "Mark Zuckerberg",
      "username": "zuck"
    },
    "viewer": {
      "actor": {
        "name": "Your Name"
      }
    }
  }
}

Rendering Queries

Relay์—์„œ ์ฟผ๋ฆฌ๋ฅผ ๋ Œ๋”๋ง ํ•˜๊ธฐ ์œ„ํ•ด์„œ usePreloadedQuery ๋ผ๋Š” hook ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. usePreloadedQuery ๋Š” ์ฟผ๋ฆฌ์˜ ์ •์˜์™€ ์ฐธ์กฐ๋ฅผ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

import type {HomeTabQuery} from 'HomeTabQuery.graphql';

const React = require('React');
const {graphql, usePreloadedQuery} = require('react-relay');

type Props = {
  queryRef: PreloadedQuery<HomeTabQuery>,
};

function HomeTab(props: Props) {
  const data = usePreloadedQuery<HomeTabQuery>(
    graphql`
      query HomeTabQuery($id: ID!) {
        user(id: $id) {
          name
        }
      }
    `,
    props.queryRef,
  );

  return (
    <h1>{data.user?.name}</h1>
  );
}

usePreloadedQuery ๋Š” graphql์ฟผ๋ฆฌ์™€ ์ฐธ์กฐ๋ฅผ ๊ฐ€์ง€๊ณ  ํ•ด๋‹น ์ฟผ๋ฆฌ์— ๋Œ€ํ•ด ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  • HomeTab ์ด๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ์˜ ๊ฒฝ์šฐ์—๋Š” Props ๋กœ ๋‚ด๋ ค๋ฐ›๋Š” queryRef๋ฅผ ์„ค๋ช…ํ•˜๊ณ  ์ฐธ์กฐํ•˜์—ฌ ์ฟผ๋ฆฌ์— ํ•ด๋‹น๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

  • PreloadedQuery๋Š” relay Complier ๊ฐ€ ์ƒ์„ฑํ•ด์ฃผ๋Š” type parameter ๋ฅผ ํƒ€์ž…์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ๊ฒฝ์šฐ์—๋Š” HomeTabQuery ์˜ ํƒ€์ž…์ด ์—ฌ๊ธฐ์— ํ•ด๋‹น๋ฉ๋‹ˆ๋‹ค.

  • ํ”„๋ž˜๊ทธ๋จผํŠธ ์™€ ์œ ์‚ฌํ•˜๊ฒŒ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์ฟผ๋ฆฌ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ์ž๋™์œผ๋กœ ๊ตฌ๋…ํ•ฉ๋‹ˆ๋‹ค . ์ด ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์•ฑ์˜ ์–ด๋””์—์„œ๋‚˜ ์—…๋ฐ์ดํŠธ๋˜๋ฉด ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์ตœ์‹  ์—…๋ฐ์ดํŠธ๋œ ๋ฐ์ดํ„ฐ๋กœ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.

  • usePreloadedQuery ๋˜ํ•œ type parameter ๋ฅผ HomeTabQuery ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

    • Relay๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด๋ฆ„ ํ˜•์‹์œผ๋กœ ์ƒ์„ฑ๋œ ํŒŒ์ผ์—์„œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋Š” ์„ ์–ธ๋œ ์ฟผ๋ฆฌ์— ๋Œ€ํ•ด type์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๊ธฐ์–ตํ•˜์„ธ์š”.<query_name>.graphql.js

  • ์ฟผ๋ฆฌ๋ฅผ ๋ Œ๋”๋งํ•˜๊ธฐ ์ด์ „์— Relay Environment Provider ๋กœ root ๋ฅผ ๊ฐ์‹ธ Relay ํ™˜๊ฒฝ์ด ์ œ๊ณต๋˜๋Š”์ง€ ํ™•์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

Fetching Queries for Render

์ฟผ๋ฆฌ๋ฅผ ๋ Œ๋”๋ง ํ•˜๋Š” ๊ฒƒ ์™ธ์—๋„ ์ฟผ๋ฆฌ๋ฐ์ดํ„ฐ๋ฅผ ์„œ๋ฒ„์—์„œ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์šฐ๋ฆฌ๋Š” ์•ฑ์˜ ๋ฃจํŠธ ์–ด๋”˜๊ฐ€์—์„œ ํ•˜๋‚˜ ๋˜๋Š” ๋ช‡๊ฐœ์˜ ์ฟผ๋ฆฌ๋กœ ํ™”๋ฉด์„ ๋ Œ๋”๋งํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋“ค์„ ์ถ•์ ํ•  ์ˆ˜์žˆ๋„๋ก ๋งŒ๋“ค๊ธธ ์›ํ•ฉ๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ๋Š” ์•ฑ ๋ Œ๋”๋ง์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๊ฐ€๋Šฅํ•œ ํ•œ ๋นจ๋ฆฌ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋‚˜์ค‘์— ์ฟผ๋ฆฌ๋ฅผ ์„œ๋ฒ„์—์„œ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด์„œuseQueryLoader Hook ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .

import type {HomeTabQuery as HomeTabQueryType} from 'HomeTabQuery.graphql';
import type {PreloadedQuery} from 'react-relay';

const HomeTabQuery = require('HomeTabQuery.graphql')
const {useQueryLoader} = require('react-relay');


type Props = {
  initialQueryRef: PreloadedQuery<HomeTabQueryType>,
};

function AppTabs(props) {
  const [
    homeTabQueryRef,
    loadHomeTabQuery,
  ] = useQueryLoader<HomeTabQueryType>(
    HomeTabQuery,
    props.initialQueryRef, /* e.g. provided by router */
  );

  const onSelectHomeTab = () => {
    // Start loading query for HomeTab immediately in the event handler
    // that triggers navigation to that tab, *before* we even start
    // rendering the target tab.
    // Calling this function will update the value of homeTabQueryRef.
    loadHomeTabQuery({id: '4'});

    // ...
  }

  // ...

  return (
    screen === 'HomeTab' && homeTabQueryRef != null ?
      // Pass to component that uses usePreloadedQuery
      <HomeTab queryRef={homeTabQueryRef} /> :
      // ...
  );
}
  • ์šฐ๋ฆฌ๋Š” useQueryLoader ๋ฅผ AppTabs ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

    • ์ด ๊ฒฝ์šฐ HomeTabQuery์ฟผ๋ฆฌ(์ด์ „์˜ ์˜ˆ์—์„œ ์„ ์–ธํ•œ ์ฟผ๋ฆฌ)๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ HomeTabQuery.graphql ์—์„œ ์ž๋™ ์ƒ์„ฑ๋œ ํŒŒ์ผ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ์ƒํƒœ์— ์ €์žฅ๋˜๊ณ  useQueryLoader ์— ์˜ํ•ด ๋ฐ˜ํ™˜๋˜๋Š” PreloadedQuery์˜ ์ดˆ๊ธฐ ๊ฐ’์œผ๋กœ homeTabQueryRef๋ฅผ ์‚ฌ์šฉ ์ค‘์ž…๋‹ˆ๋‹ค.

  • useQueryLoader ํ˜ธ์ถœ์„ ํ†ตํ•ด ์šฐ๋ฆฌ๋Š” ๋‘๊ฐ€์ง€๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    • homeTabQueryRef: ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ๊ฐ€์ ธ์˜จ ์ฟผ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์ด ๊ฐ’์€ useQueryLoader ๊ฐ€ ํ˜ธ์ถœ ๋˜์ง€ ์•Š์•˜์„ ๊ฒฝ์šฐ null ์ด ๋ฉ๋‹ˆ๋‹ค. \

    • loadHomeTabQuery : ์•„์ง ์บ์‹œ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋Š” ์„œ๋ฒ„์—์„œ ์ด ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ

      ๊ฐ€์ ธ์˜ค๊ณ , ์ฟผ๋ฆฌ๊ฐ€ ์˜ˆ์ƒ ํ•˜๋Š” ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ•จ์ˆ˜ ์ž…๋‹ˆ๋‹ค. (์—ฌ๊ธฐ์„œ๋Š” {id : 4})

      • ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด PreloadedQuery ์ฟผ๋ฆฌ ๋Œ€์‹ ์— homeTabQueryRef ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ฉ๋‹ˆ๋‹ค.

      • ๋˜ํ•œ ๋ Œ๋”๋ง ์„ ์œ ๋ฐœํ•˜๋Š” ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ์—์„œ ์ด ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ ํ•ฉ๋‹ˆ๋‹ค . ์ด๋ฅผ ํ†ตํ•ด ์ƒˆ ํƒญ์ด ๋ Œ๋”๋ง์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—๋„ ๊ฐ€๋Šฅํ•œ ํ•œ ๋นจ๋ฆฌ ํ™”๋ฉด์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

      • ์ด ํ•จ์ˆ˜๋Š” ๋ Œ๋”๋ง ์ค‘์— ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธฐ ๋•Œ๋ฌธ์— ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋” ํ•จ์ˆ˜ ์™ธ๋ถ€์—์„œ ํ˜ธ์ถœ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค . ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

        • HomeTab ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ AppTabs ์ปดํฌ๋„ŒํŠธ์—์„œ ํ˜ธ์ถœํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

  • useQueryLoader ๋Š” ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ ๋  ๋•Œ ์ €์žฅ ๋œ ๋ชจ๋“  ์ฟผ๋ฆฌ๊ฐ€ ์ž๋™์œผ๋กœ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ๋ฅผ ์‚ญ์ œํ•˜๋ฉด Relay๊ฐ€ ๋” ์ด์ƒ ํ•ด๋‹น ์ฟผ๋ฆฌ์˜ ํŠน์ • ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ์บ์‹œ์— ๋ณด๊ด€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ธ๋งˆ์šดํŠธ ๋  ๋•Œ, ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ์š”์ฒญ์ด ์•„์ง ์ง„ํ–‰ ์ค‘์ธ ๊ฒฝ์šฐ์—๋Š” ์ทจ์†Œ๋ฉ๋‹ˆ๋‹ค.

  • ์—ญ์‹œ ๋งˆ์ง€๋ง‰์œผ๋กœ , ์ฟผ๋ฆฌ๋ฅผ ๋ Œ๋”๋งํ•˜๊ธฐ ์ด์ „์— Relay Environment Provider ๋กœ root ๋ฅผ ๊ฐ์‹ธ Relay ํ™˜๊ฒฝ์ด ์ œ๊ณต๋˜๋Š”์ง€ ํ™•์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์ดˆ๊ธฐ ๋กœ๋“œ์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ๋ถ€๋ชจ ๊ตฌ์„ฑ ์š”์†Œ์˜ ์ปจํ…์ŠคํŠธ ์™ธ๋ถ€์—์„œ ๊ฐ€์ ธ์™€์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ useQueryLoader๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  loadQuery๋ฅผ ์‚ฌ์šฉํ•ด์„œ API๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

import type {HomeTabQuery as HomeTabQueryType} from 'HomeTabQuery.graphql';

const HomeTabQuery = require('HomeTabQuery.graphql')
const {loadQuery} = require('react-relay');


const environment = createEnvironment(...);

// At some point during app initialization
const initialQueryRef = loadQuery<HomeTabQueryType>(
  environment,
  HomeTabQuery,
  {id: '4'},
);

// ...

// E.g. passing the initialQueryRef to the root component
render(<AppTabs initialQueryRef={initialQueryRef} initialTab={...} />)
  • ์ปดํฌ๋„ŒํŠธ์— ์ดˆ๊ธฐ๊ฐ’์œผ๋กœ ์ฟผ๋ฆฌ๋ฅผ ์ „๋‹ฌํ•ด์ฃผ๊ธฐ ์œ„ํ•œ ์ฟผ๋ฆฌ๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด loadQuery ํ•จ์ˆ˜๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค

  • ์ด ๊ฒฝ์šฐ ๋ฃจํŠธ AppTabs ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ฟผ๋ฆฌ ์ฐธ์กฐ์˜ ์ˆ˜๋ช…์„ ๊ด€๋ฆฌํ•˜๊ณ  ์ ์ ˆํ•œ ์‹œ๊ฐ„์— ์‚ญ์ œํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.

  • ์ด ์˜ˆ์ œ์—์„œ๋Š” "์•ฑ ์ดˆ๊ธฐํ™”"์— ๋Œ€ํ•œ ์„ธ๋ถ€ ์ •๋ณด๋ฅผ ๋ชจํ˜ธํ•˜๊ฒŒ ๋‚จ๊ฒจ๋‘์—ˆ์Šต๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋งˆ๋‹ค ๋‹ค๋ฅผ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ฃผ๋ชฉํ•ด์•ผ ํ•  ์ค‘์š”ํ•œ ์ ์€ ๋ฃจํŠธ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์ฟผ๋ฆฌ ์ฐธ์กฐ๋ฅผ ์–ป์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ loadQuery ๋Š” ๋ Œ๋”๋ง ์ค‘์—๋Š” ํ˜ธ์ถœํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ปดํฌ๋„ŒํŠธ์˜ ๋ Œ๋” ํ•จ์ˆ˜ ์™ธ๋ถ€์—์„œ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

Render as you Fetch

์œ„์˜ ์˜ˆ๋Š” ๊ฐ€๋Šฅํ•œ ํ•œ ๋นจ๋ฆฌ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์‹œ์ž‘ํ•˜๊ณ (fetch ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์œ„ํ•ด ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ๊ณผ ๋ฐ˜๋Œ€), ์‚ฌ์šฉ์ž์—๊ฒŒ ์ฝ˜ํ…์ธ ๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฐ์ดํ„ฐ fetch ๊ณผ ๋ Œ๋”๋ง์„ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

๋˜ํ•œ waterfalling round trips ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋ฉฐ fetch๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์‹œ๊ธฐ์— ๋Œ€ํ•ด ๋” ๋งŽ์€ ์ œ์–ด์™€ ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ์„ ์ œ๊ณตํ•˜๋Š” ๋ฐ˜๋ฉด, ๋ Œ๋”๋ง ์ค‘์— ๊ฐ€์ ธ์˜ค๋ฉด fetch๊ฐ€ ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ๋ฐœ์ƒํ•ด์•ผ ํ•˜๋Š” ์‹œ์ ์„ ๊ฒฐ์ •ํ•˜๊ธฐ๊ฐ€ ๋” ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ React Suspense ์˜ "render-as-you-fetch"ํŒจํ„ด๊ณผ ์ž˜ ๋งž์Šต๋‹ˆ๋‹ค .

์ด๊ฒƒ์€ Relay๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋ฐ ์„ ํ˜ธ๋˜๋Š” ํŒจํ„ด์ด๋ฉฐ ๋ช‡๋ช‡์˜ ์ƒํ™ฉ์—์„œ ์ ์šฉ์ด ๋˜๋Š”๋ฐ

์ผ๋ฐ˜์ ์œผ๋กœ๋Š” ์ฒ˜์Œ์— UI ๋ณด์—ฌ์ง€์ง€ ์•Š๋‹ค๊ฐ€ ๋‚˜์ค‘์— ์ƒํ˜ธ ์ž‘์šฉ(์˜ˆ: ๋ฉ”๋‰ด, ํŒ์˜ค๋ฒ„, ๋Œ€ํ™” ์ƒ์ž ๋“ฑ) ๋ฐ ์ถ”๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Lazily Fetching Queries during Render

์ฟผ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ๊ตฌ์„ฑ ์š”์†Œ๊ฐ€ ๋ Œ๋”๋ง๋  ๋•Œ ์ฟผ๋ฆฌ๋ฅผ ๋А๋ฆฌ๊ฒŒ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด์ „์— ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์„ ํ˜ธ๋˜๋Š” ํŒจํ„ด์€ ๋ Œ๋”๋ง ์ „์— ์ฟผ๋ฆฌ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฃผ์˜ ์—†์ด ์ง€์—ฐ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ค‘์ฒฉ ๋˜๋Š” waterfalling round trips ํŠธ๋ฆฌ๊ฑฐ๋˜๊ณ  ์„ฑ๋Šฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฟผ๋ฆฌ๋ฅผ ๋А๋ฆฌ๊ฒŒ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด useLazyLoadQueryHook์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค .

import type {AppQuery} from 'AppQuery.graphql';

const React = require('React');
const {graphql, useLazyLoadQuery} = require('react-relay');

function App() {
  const data = useLazyLoadQuery<AppQuery>(
    graphql`
      query AppQuery($id: ID!) {
        user(id: $id) {
          name
        }
      }
    `,
    {id: '4'},
  );

  return (
    <h1>{data.user?.name}</h1>
  );
}
  • useLazyLoadQuery graphql ์ฟผ๋ฆฌ์™€ ํ•ด๋‹น ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ์ผ๋ถ€ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ํ•ด๋‹น ์ฟผ๋ฆฌ์— ๋Œ€ํ•ด ๊ฐ€์ ธ์˜จ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๋ณ€์ˆ˜๋Š” GraphQL ์ฟผ๋ฆฌ ๋‚ด์—์„œ ์ฐธ์กฐ ๋˜๋Š” ๋ณ€์ˆ˜์˜ ๊ฐ’์„ ํฌํ•จํ•˜๋Š” ๊ฐ์ฒด ์ž…๋‹ˆ๋‹ค.

  • ํ”„๋ž˜๊ทธ๋จผํŠธ์™€ ์œ ์‚ฌํ•˜๊ฒŒ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์ฟผ๋ฆฌ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ์—…๋ฐ์ดํŠธ๋ฅผ ์ž๋™์œผ๋กœ ๊ตฌ๋…ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ์•ฑ์˜ ์–ด๋А ๊ณณ์—์„œ๋‚˜ ์—…๋ฐ์ดํŠธ๋˜๋ฉด ๊ตฌ์„ฑ ์š”์†Œ๋Š” ์ตœ์‹  ์—…๋ฐ์ดํŠธ๋œ ๋ฐ์ดํ„ฐ๋กœ ์ž๋™์œผ๋กœ ๋‹ค์‹œ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.

    • Relay๋Š” ์„ ์–ธ๋œ ์ฟผ๋ฆฌ์— ๋Œ€ํ•ด type์„ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋ฏ€๋กœ ๊ฐ€์ ธ์˜ค๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค useLazyLoadQuery. ์ด๋Ÿฌํ•œ ์œ ํ˜•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ด๋ฆ„ ํ˜•์‹์œผ๋กœ ์ƒ์„ฑ๋œ ํŒŒ์ผ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค <query_name>.graphql.js.

  • ๊ธฐ๋ณธ์ ์œผ๋กœ ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง๋  ๋•Œ Relay๋Š” ์ด ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  useLazyLoadQuery (์•„์ง ์บ์‹œ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ) ์ด๋ฅผ ํ˜ธ์ถœ ๊ฒฐ๊ณผ๋กœ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค .

  • ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋‹ค์‹œ ๋ Œ๋”๋ง ํ•˜๊ณ  ์›๋ž˜ ์‚ฌ์šฉ๋œ ๊ฒƒ๊ณผ ๋‹ค๋ฅธ ์ฟผ๋ฆฌ ๋ณ€์ˆ˜ ๋ฅผ ์ „๋‹ฌ ํ•˜๋ฉด ์ฟผ๋ฆฌ๊ฐ€ ์ƒˆ ๋ณ€์ˆ˜๋กœ ๋‹ค์‹œ ๊ฐ€์ ธ์™€์ง€๊ณ  ์ž ์žฌ์ ์œผ๋กœ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ๋กœ ๋‹ค์‹œ ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.

Last updated