Fragments

Relayμ—μ„œ React ꡬ성 μš”μ†Œμ— λŒ€ν•œ 데이터 쒅속성을 μ„ μ–Έν•˜κΈ° μœ„ν•œ μ£Όμš” λΉŒλ”© 블둝은 GraphQL ν”„λž˜κ·Έλ¨ΌνŠΈμž…λ‹ˆλ‹€. Fragment λŠ” GraphQL μŠ€ν‚€λ§ˆμ— 제곡된 μž¬μ‚¬μš© κ°€λŠ₯ν•œ units μž…λ‹ˆλ‹€.

μ‹€μ œλ‘œλŠ” GraphQL의 ν•„λ“œμ— ν•΄λ‹Ήλ©λ‹ˆλ‹€.

fragment UserFragment on User {
  name
  age
  profile_picture(scale: 2) {
    uri
  }
}

JavaScript μ½”λ“œ λ‚΄μ—μ„œ ν”„λž˜κ·Έλ¨ΌνŠΈλ₯Ό μ„ μ–Έν•˜λ €λ©΄ λ‹€μŒ graphql νƒœκ·Έ λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€ .

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

const userFragment = graphql`
  fragment UserFragment_user on User {
    name
    age
    profile_picture(scale: 2) {
      uri
    }
  }
`;

Rendering ν”„λž˜κ·Έλ¨ΌνŠΈ

ν”„λž˜κ·Έλ¨ΌνŠΈμ— λŒ€ν•œ 데이터λ₯Ό λ Œλ”λ§ν•˜κΈ° μœ„ν•΄ useFragmentHook 을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€ .

  • useFragmentν”„λž˜κ·Έλ¨ΌνŠΈ μ •μ˜μ™€ ν”„λž˜κ·Έλ¨ΌνŠΈ μ°Έμ‘° λ₯Ό μ·¨ν•˜κ³  ν•΄λ‹Ή ν”„λž˜κ·Έλ¨ΌνŠΈ 및 참쑰에 ν•΄λ‹Ήν•˜λŠ” 데이터λ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.

  • Fragment μ°Έμ‘° λŠ” Relayκ°€ Fragment μ •μ˜μ— μ„ μ–Έλœ 데이터 λ₯Ό μ½λŠ” 데 μ‚¬μš©ν•˜λŠ” κ°μ²΄μž…λ‹ˆλ‹€.

    • λ³΄μ‹œ λ‹€μ‹œν”Ό UserComponent_user ν”„λž˜κ·Έλ¨ΌνŠΈ μžμ²΄λŠ” μœ ν˜•μ˜ ν•„λ“œλ₯Ό μ„ μ–Έ ν•˜μ§€λ§Œ ν•΄λ‹Ή ν•„λ“œλ₯Ό 읽을 νŠΉμ • μ‚¬μš©μžλ₯Ό μ•Œμ•„μ•Ό ν•©λ‹ˆλ‹€. 이것은 ν”„λž˜κ·Έλ¨ΌνŠΈ 참쑰에 ν•΄λ‹Ήν•©λ‹ˆλ‹€. 즉, Fragment μ°Έμ‘°λŠ” 데이터λ₯Ό μ½μœΌλ €λŠ” μœ ν˜•μ˜ νŠΉμ • μΈμŠ€ν„΄μŠ€μ— λŒ€ν•œ 포인터 와 κ°™μŠ΅λ‹ˆλ‹€.

    • μ»΄ν¬λ„ŒνŠΈλŠ” μžλ™μœΌλ‘œ 쑰각 데이터에 λŒ€ν•œ μ—…λ°μ΄νŠΈλ₯Ό κ΅¬λ…ν•©λ‹ˆλ‹€.

    • 이 νŠΉμ • 데이터에 λŒ€ν•œ 데이터 Userκ°€ μ•±μ˜ μ–΄λ””μ—μ„œλ‚˜ 데이터 μ—…λ°μ΄νŠΈλ˜λ©΄(예: μƒˆ 데이터 κ°€μ Έμ˜€κΈ° λ˜λŠ” κΈ°μ‘΄ 데이터 변경을 톡해) ꡬ성 μš”μ†ŒλŠ” μžλ™μœΌλ‘œ μ΅œμ‹  μ—…λ°μ΄νŠΈλ‘œ λ‹€μ‹œ λ Œλ”λ§λ©λ‹ˆλ‹€.

  • RelayλŠ” μ»΄νŒŒμΌλŸ¬κ°€ 싀행될 λ•Œ μ„ μ–Έλœ λͺ¨λ“  ν”„λž˜κ·Έλ¨ΌνŠΈμ— λŒ€ν•œ type을 μžλ™μœΌλ‘œ μƒμ„±ν•˜λ―€λ‘œ μ΄λŸ¬ν•œ μœ ν˜•μ„ μ‚¬μš©ν•˜μ—¬ μ»΄ν¬λ„ŒνŠΈ props 의 νƒ€μž…μœΌλ‘œ μ§€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

    • μƒμ„±λœ Flow μœ ν˜•μ—λŠ” 접미사가 μžˆλŠ” μœ ν˜•μΈ 쑰각 μ°Έμ‘° μœ ν˜•κ³Ό $key접미사 <fragment_name>$keyκ°€ μžˆλŠ” μœ ν˜•μΈ 데이터 λͺ¨μ–‘ μœ ν˜•μ΄ 포함 $dataλ©λ‹ˆλ‹€ <fragment_name>$data. μ΄λŸ¬ν•œ μœ ν˜•μ€ λ‹€μŒ μ΄λ¦„μœΌλ‘œ μƒμ„±λœ νŒŒμΌμ—μ„œ κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€ <fragment_name>.graphql.js. .

    • μš°λ¦¬λŠ” μœ„μ˜ μ˜ˆμ—μ„œ user Props κ°€ ν•„μš”ν•œ ν”„λž˜κ·Έλ¨ΌνŠΈ 참쑰둜 μž…λ ₯되고 있으며, μ΄λŠ” UserComponent_user.graphql μ—μ„œ κ°€μ Έμ˜¨ UserComponent_user$key 에 ν•΄λ‹Ήλ©λ‹ˆλ‹€.

  • ν”„λž˜κ·Έλ¨ΌνŠΈ 이름은 μ „μ—­μ μœΌλ‘œ κ³ μœ ν•΄μ•Ό ν•©λ‹ˆλ‹€. 이λ₯Ό μ‰½κ²Œ λ‹¬μ„±ν•˜κΈ° μœ„ν•΄ λͺ¨λ“ˆ 이름과 μ‹λ³„μžλ₯Ό 기반으둜 λ‹€μŒ κ·œμΉ™μ„ μ‚¬μš©ν•˜μ—¬ Fragment의 이름을 μ§€μ •ν•©λ‹ˆλ‹€ <module_name>_<property_name>. μ΄λ ‡κ²Œ ν•˜λ©΄ μ–΄λ–€ ν”„λž˜κ·Έλ¨ΌνŠΈκ°€ μ–΄λ–€ λͺ¨λ“ˆμ— μ •μ˜λ˜μ–΄ μžˆλŠ”μ§€ μ‰½κ²Œ 식별할 수 있으며 λ™μΌν•œ λͺ¨λ“ˆμ— μ—¬λŸ¬ ν”„λž˜κ·Έλ¨ΌνŠΈκ°€ μ •μ˜λ  λ•Œ 이름 μΆ©λŒμ„ ν”Όν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ™μΌν•œ μ»΄ν¬λ„ŒνŠΈ λ‚΄μ˜ μ—¬λŸ¬ Fragmentμ—μ„œ 데이터λ₯Ό λ Œλ”λ§ν•΄μ•Ό ν•˜λŠ” 경우 useFragmentμ—¬λŸ¬ 번 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

Composing ν”„λž˜κ·Έλ¨ΌνŠΈ

GraphQLμ—μ„œ ν”„λž˜κ·Έλ¨ΌνŠΈλŠ” μž¬μ‚¬μš© κ°€λŠ₯ν•œ λ‹¨μœ„μž…λ‹ˆλ‹€. 즉, λ‹€λ₯Έ ν”„λž˜κ·Έλ¨ΌνŠΈλ₯Ό 포함할 수 μžˆμœΌλ―€λ‘œ 결과적으둜 ν”„λž˜κ·Έλ¨ΌνŠΈκ°€ λ‹€λ₯Έ ν”„λž˜κ·Έλ¨ΌνŠΈ λ˜λŠ” 쿼리내에 포함될 수 μžˆμŠ΅λ‹ˆλ‹€ .

각 React μ»΄ν¬λ„ŒνŠΈλŠ” μžμ‹μ˜ 데이터 쒅속성을 κ°€μ Έμ˜¬ μ±…μž„μ΄ μžˆμŠ΅λ‹ˆλ‹€. μ˜¬λ°”λ₯΄κ²Œ λ Œλ”λ§ν•˜λ €λ©΄ μžμ‹μ˜ props에 λŒ€ν•΄ μ•Œμ•„μ•Ό ν•˜λŠ” 것과 λ§ˆμ°¬κ°€μ§€μž…λ‹ˆλ‹€. 이 νŒ¨ν„΄μ€ κ°œλ°œμžκ°€ μ»΄ν¬λ„ŒνŠΈ(ν•„μš”ν•œ 데이터, λ Œλ”λ§ν•˜λŠ” ꡬ성 μš”μ†Œ)에 λŒ€ν•΄ 둜컬둜 μΆ”λ‘ ν•  수 μžˆμ§€λ§Œ RelayλŠ” 전체 UI 트리의 데이터 쒅속성에 λŒ€ν•œ μ „μ—­ 보기λ₯Ό λ„μΆœν•  수 μžˆμŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€.

  • Co-location κ³Ό κ΄€λ ¨μžˆμŠ΅λ‹ˆλ‹€.

μ—¬κΈ°μ„œ μ£Όμ˜ν•  사항이 λͺ‡ κ°€μ§€ μžˆμŠ΅λ‹ˆλ‹€.

  • UsernameSectionλŠ” user prop으둜 ν”„λž˜κ·Έλ¨ΌνŠΈ μ°Έμ‘°κ°€ ν•„μš”ν•©λ‹ˆλ‹€. 이전에 μ–ΈκΈ‰ν–ˆλ“―μ΄ ν”„λž˜κ·Έλ¨ΌνŠΈ μ°Έμ‘°λŠ” Relayκ°€ ν”„λž˜κ·Έλ¨ΌνŠΈ μ •μ˜μ— μ„ μ–Έλœ 데이터λ₯Ό μ½λŠ” 데 μ‚¬μš©ν•˜λŠ” κ°μ²΄μž…λ‹ˆλ‹€. λ³΄μ‹œλ‹€μ‹œν”Ό μžμ‹ UsernameSection_user ν”„λž˜κ·Έλ¨ΌνŠΈ μžμ²΄λŠ” μœ ν˜•μ˜ ν•„λ“œλ₯Ό μ„ μ–Έ ν•˜μ§€λ§Œ ν•΄λ‹Ή ν•„λ“œλ₯Ό 읽을 νŠΉμ • Userλ₯Ό μ•Œμ•„μ•Ό ν•©λ‹ˆλ‹€. 이것이 ν”„λž˜κ·Έλ¨ΌνŠΈ 참쑰에 ν•΄λ‹Ήν•©λ‹ˆλ‹€.

    • 즉, ν”„λž˜κ·Έλ¨ΌνŠΈ μ°Έμ‘°λŠ” 데이터λ₯Ό μ½μœΌλ €λŠ” μœ ν˜•μ˜ νŠΉμ • μΈμŠ€ν„΄μŠ€μ— λŒ€ν•œ 포인터 와 κ°™μŠ΅λ‹ˆλ‹€.

  • 이 경우 UsernameSection에 μ „λ‹¬λœ User, 즉 ν”„λž˜κ·Έλ¨ΌνŠΈ μ°Έμ‘°μ—λŠ” μ‹€μ œλ‘œ μžμ‹ UsernameSection ꡬ성 μš”μ†Œμ—μ„œ μ„ μ–Έν•œ 데이터가 ν¬ν•¨λ˜μ–΄ μžˆμ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

  • λŒ€μ‹  UsernameSection은 ν”„λž˜κ·Έλ¨ΌνŠΈ μ°Έμ‘°λ₯Ό μ‚¬μš©ν•˜μ—¬ useFragmentλ₯Ό μ‚¬μš©ν•˜μ—¬ λ‚΄λΆ€μ μœΌλ‘œ μ„ μ–Έλœ 데이터λ₯Ό μ½μŠ΅λ‹ˆλ‹€.

  • 이것은 λΆ€λͺ¨κ°€ μžμ‹μ΄ μ„ μ–Έν•œ 데이터에 λŒ€ν•œ 쒅속성을 μ•”μ‹œμ μœΌλ‘œ μƒμ„±ν•˜λŠ” 것을 λ°©μ§€ν•˜κ³  κ·Έ λ°˜λŒ€μ˜ κ²½μš°λ„ λ§ˆμ°¬κ°€μ§€μ΄λ―€λ‘œ λ‹€λ₯Έ μ»΄ν¬λ„ŒνŠΈμ— 영ν–₯을 λ―ΈμΉ  μ—Όλ € 없이 μ»΄ν¬λ„ŒνŠΈμ— λŒ€ν•΄ 둜컬둜 μΆ”λ‘ ν•˜κ³  μˆ˜μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

  • κ·Έλ ‡μ§€ μ•Šκ³  λΆ€λͺ¨κ°€ μžμ‹μ˜ 데이터에 μ•‘μ„ΈμŠ€ν•  수 μžˆλŠ” 경우 μžμ‹μ΄ μ„ μ–Έν•œ 데이터λ₯Ό μˆ˜μ •ν•˜λ©΄ λΆ€λͺ¨κ°€ 손상될 수 μžˆμŠ΅λ‹ˆλ‹€. 이λ₯Ό 데이터 λ§ˆμŠ€ν‚Ήμ΄λΌκ³  ν•©λ‹ˆλ‹€.

  • μžμ‹μ΄ μ˜ˆμƒν•˜λŠ” ν”„λž˜κ·Έλ¨ΌνŠΈ μ°Έμ‘°λŠ” μžμ‹ ν”„λž˜κ·Έλ¨ΌνŠΈλ₯Ό ν¬ν•¨ν•˜λŠ” λΆ€λͺ¨ ν”„λž˜κ·Έλ¨ΌνŠΈλ₯Ό 읽은 κ²°κ³Όμž…λ‹ˆλ‹€. 우리의 μœ„μ˜ μ˜ˆμ—μ„œ μ΄λŠ” ...UsernameSection_userλ₯Ό ν¬ν•¨ν•˜λŠ” λ‹¨νŽΈμ„ 읽은 κ²°κ³Όκ°€ UsernameSection이 μ˜ˆμƒν•˜λŠ” λ‹¨νŽΈ μ°Έμ‘°κ°€ 됨을 μ˜λ―Έν•©λ‹ˆλ‹€. 즉, useFragmentλ₯Ό 톡해 ν”„λž˜κ·Έλ¨ΌνŠΈλ₯Ό 읽은 κ²°κ³Ό 얻은 λ°μ΄ν„°λŠ” ν•΄λ‹Ή ν”„λž˜κ·Έλ¨ΌνŠΈμ— ν¬ν•¨λœ λͺ¨λ“  μžμ‹ ν”„λž˜κ·Έλ¨ΌνŠΈμ— λŒ€ν•œ ν”„λž˜κ·Έλ¨ΌνŠΈ μ°Έμ‘° 역할도 ν•©λ‹ˆλ‹€.

Composing ν”„λž˜κ·Έλ¨ΌνŠΈ into Queries

Relay의 ν”„λž˜κ·Έλ¨ΌνŠΈλ₯Ό μ‚¬μš©ν•˜λ©΄ μ»΄ν¬λ„ŒνŠΈμ— λŒ€ν•œ 데이터 쒅속성을 μ„ μ–Έν•  수 μžˆμ§€λ§Œ 자체적으둜 κ°€μ Έμ˜¬ μˆ˜λŠ” μ—†μŠ΅λ‹ˆλ‹€. λŒ€μ‹  쿼리에 직접 λ˜λŠ” κ°„μ ‘μ μœΌλ‘œ ν¬ν•¨λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. 이것은 λͺ¨λ“  ν”„λž˜κ·Έλ¨ΌνŠΈκ°€ λ Œλ”λ§λ  λ•Œ 쿼리에 속해야 함을 μ˜λ―Έν•©λ‹ˆλ‹€ . 단일 ν”„λž˜κ·Έλ¨ΌνŠΈλŠ” μ—¬μ „νžˆ μ—¬λŸ¬ 쿼리에 포함될 수 μžˆμ§€λ§Œ ν”„λž˜κ·Έλ¨ΌνŠΈ ꡬ성 μš”μ†Œμ˜ νŠΉμ • μΈμŠ€ν„΄μŠ€λ₯Ό λ Œλ”λ§ν•  λ•Œ νŠΉμ • 쿼리 μš”μ²­μ˜ μΌλΆ€λ‘œ ν¬ν•¨λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€.

ν”„λž˜κ·Έλ¨ΌνŠΈκ°€ ν¬ν•¨λœ 쿼리λ₯Ό κ°€μ Έμ˜€κ³  λ Œλ”λ§ν•˜λ €λ©΄ ν”„λž˜κ·Έλ¨ΌνŠΈ ꡬ성 μ„Ήμ…˜ 에 ν‘œμ‹œλœ κ²ƒμ²˜λŸΌ ν”„λž˜κ·Έλ¨ΌνŠΈλ₯Ό κ΅¬μ„±ν•˜λŠ” 것과 λ™μΌν•œ λ°©μ‹μœΌλ‘œ κ΅¬μ„±ν•˜λ©΄ λ©λ‹ˆλ‹€

μ°Έκ³ :

  • μ˜ˆμƒ λ˜λŠ” ν”„λž˜κ·Έλ¨ΌνŠΈ μ°Έμ‘° λŠ” UserComponentν”„λž˜κ·Έλ¨ΌνŠΈλ₯Ό ν¬ν•¨ν•˜λŠ” μƒμœ„ 쿼리λ₯Ό 읽은 결과이며, 이 κ²½μš°μ—λŠ” ...UsernameSection_user. 즉, 의 data결과둜 얻은 것은 usePreloadedQueryν•΄λ‹Ή 쿼리에 ν¬ν•¨λœ λͺ¨λ“  ν•˜μœ„ ν”„λž˜κ·Έλ¨ΌνŠΈμ— λŒ€ν•œ ν”„λž˜κ·Έλ¨ΌνŠΈ μ°Έμ‘° 역할도 ν•©λ‹ˆλ‹€.

  • 이전에 μ–ΈκΈ‰ν–ˆλ“―μ΄ λͺ¨λ“  ν”„λž˜κ·Έλ¨ΌνŠΈλŠ” λ Œλ”λ§λ  λ•Œ 쿼리에 속해야 ν•©λ‹ˆλ‹€.

    • 즉, λͺ¨λ“  ν”„λž˜κ·Έλ¨ΌνŠΈ μ»΄ν¬λ„ŒνŠΈλŠ” 쿼리의 ν•˜μœ„ ν•­λͺ©μ΄μ–΄μ•Ό ν•©λ‹ˆλ‹€ .

Last updated