Introduction

GraphQL์„ ์“ฐ๋Š” ์ด์œ 

  1. ๋ฐ์ดํ„ฐ ์ •๊ทœํ™”๋Š” ํž˜๋“ค๋‹ค.

    ๋ฐ์ดํ„ฐ ์ •๊ทœํ™”: ์ค‘๋ณต๋˜๋Š” ๋ฐ์ดํ„ฐ ์ œ๊ฑฐ

    • JSON ์‘๋‹ต์ด ๋„์ฐฉํ•˜๋ฉด, ์‘๋‹ต ๋‚ด ํŠน์ • ๋ชจ๋ธ ์„ ์ฐพ์•„๋‚ด ์ •๊ทœํ™”ํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค.

    • ์ ์€ ๋ฆฌ์†Œ์Šค๋ฅผ ํšจ์œจ์ ์œผ๋กœ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.


    [ ๊ทœ์น™์„ฑ ์ด์šฉ โ‡’ ์ž๋™ํ™”๋ฅผ ํ†ตํ•ด ]

    • ์•ฝ์†์„ ์ •ํ•œ๋‹ค (์•ฝ์† = ์–ธ์–ด) โ‡’ GraphQL

    • ์•ฝ์†์„ ํ†ตํ•œ ์‰ฌ์šด ์ •๊ทœํ™”

    • ๋” ์‰ฌ์šด ์ƒํƒœ ๊ด€๋ฆฌ

    โ‡’ 1. ํƒ€์ž… ์‹œ์Šคํ…œ์„ ํ†ตํ•œ ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ฐ์ดํ„ฐ ์ •๊ทœํ™”: ์Šคํ‚ค๋งˆ ์ด์šฉ

    • ๋ชจ๋ธ ํƒ€์ž…์„ ์ •์˜ํ•จ์œผ๋กœ์จ

    โ‡’ 2. ID ๊ฐ’์„ ํ†ตํ•ด ์ž๋™์ ์œผ๋กœ ๋ฐ์ดํ„ฐ/ ๋ทฐ ์ผ๊ด€์„ฑ ๋‹ฌ์„ฑํ•˜๊ธฐ

    • id ํ•„๋“œ๋ฅผ ํ†ตํ•ด GraphQL ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ž๋™์œผ๋กœ ์ƒํƒœ ๊ด€๋ฆฌ

    • ๋ฐ์ดํ„ฐ/ ๋ทฐ ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด ๋”ฐ๋กœ ๋ฆฌ์†Œ์Šค ํ•„์š” x

  2. ์ปดํฌ๋„ŒํŠธ์— ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ์ •์˜

    • ์ปดํฌ๋„ŒํŠธ๋Š” ์„ ์–ธํ•œ props์— ์ง์ ‘์ ์œผ๋กœ ์˜์กด ํ•˜์ง€๋งŒ, ๋Œ€๋ถ€๋ถ„ ๊ทธ๋ฆฌ๊ณ ์ž ํ•˜๋Š” ๋ชจ๋ธ์—๋„ ๊ฐ„์ ‘์ ์œผ๋กœ ์˜์กดํ•œ๋‹ค.

    • ๊ฒฐ๊ตญ ์ƒ์œ„ ๋ชจ๋ธ์ด ๋ฐ”๋€๋‹ค๋ฉด, ์ด๋ฅผ ๊ฐ„์ ‘์ ์œผ๋กœ ์˜์กดํ•˜๊ณ  ์žˆ๋Š” ํ•˜์œ„ ์ปดํฌ๋„ŒํŠธ๋“ค๋„ ํ™•์ธ์ด ํ•„์š”ํ•œ side effect๊ฐ€ ์กด์žฌํ•œ๋‹ค.

    • fetch on render โ‡’ fetch then render

Fragment: ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ ์กฐ๊ฐ

  • ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ์„ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋ธ, ํ‘œํ˜„ํ•˜๋Š” ๋ฌธ๋ฒ•

  • ์ปดํฌ๋„ŒํŠธ๋Š” ๋ชจ๋ธ์— ํฌํ•จ๋œ ๊ฐ’์„ ํ•„์š”๋กœ ํ•œ๋‹ค.

    • ํ”„๋ž˜๊ทธ๋จผํŠธ๋ฅผ ํ†ตํ•ด ๋ชจ๋ธ์˜ ์˜์กด ๊ด€๊ณ„๋ฅผ ์ž˜ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์Œ.

    # Article ๋ชจ๋ธ์˜ title ํ•„๋“œ๊ฐ€ ํ•„์š”
    fragment FragmentName on Article {
    	title
    }
    • UI๋ฅผ ๊ทธ๋ฆฌ๋Š”๋ฐ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋“ค์˜ ์ง‘ํ•ฉ์„ ํ”„๋ž˜๊ทธ๋จผํŠธ๋“ค์˜ ์ง‘ํ•ฉ์œผ๋กœ ํ‘œํ˜„ ๊ฐ€๋Šฅ

Co-location

  • ์ปดํฌ๋„ŒํŠธ์™€ ํ”„๋ž˜๊ทธ๋จผํŠธ๋ฅผ ๊ฐ™์€ ํŒŒ์ผ์— ์ž‘์„ฑํ•˜๊ธฐ

  • ๊ฐ™์€ ๋ชฉ์ ์˜ ์ฝ”๋“œ๋ฅผ ๊ฐ™์€ ๊ณณ์— ์œ„์น˜์‹œํ‚ค๊ธฐ

์ž˜ ๋ถ„๋ฆฌ๋œ ์ปดํฌ๋„ŒํŠธ

  • ๋ช…ํ™•ํ•ด์ง„ ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ

  • ๊ฐ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์–ด๋–ค ๋ชจ๋ธ์˜ ์–ด๋–ค ํ•„๋“œ๋ฅผ ์ฐธ์กฐํ•˜๋Š”์ง€, ํ‘œํ˜„ํ•˜๊ณ ์ž ํ•˜๋Š”์ง€, ์˜์กดํ•˜๋Š”์ง€ ์‰ฝ๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Œ

Relay์˜ ์—ญํ• : ๋ฐ์ดํ„ฐ ํ”„๋ ˆ์ž„์›Œํฌ

ํ•ด๊ฒฐํ•ด์•ผ ํ•  ๋ฌธ์ œ: ์ฟผ๋ฆฌ ์„ ์–ธ(์ •์˜)์™€ ์„œ๋ธŒ์ปดํฌ๋„ŒํŠธ ๊ฐ„์˜ ๋ถˆ๋ช…ํ™•ํ•œ ์˜์กด์„ฑ

  • ํ•˜๋‚˜์˜ ์ฟผ๋ฆฌ: ์„ฑ๋Šฅ ํ–ฅ์ƒ, ํ•˜๋‚˜์˜ ๋กœ๋”ฉ state๋ฅผ ์‚ฌ์šฉ โ‡’ UX ๊ฐœ์„ 

  • ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๊ฐ์ž ๋ฐ์ดํ„ฐ๋ฅผ ํŒจ์นญํ•˜๋ฉด, ๋…๋ฆฝ๋œ ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„์˜ ๋ฐ์ดํ„ฐ ์š”์ฒญ ์šฉ์ด

locally ์š”์ฒญ + globally ์ตœ์ ํ™”

  1. ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ ํ•˜๋‚˜์˜ ํฐ ์ฟผ๋ฆฌ๋กœ ํŒจ์นญ

  2. ๊ฐ๊ฐ์˜ ์ปดํฌ๋„ŒํŠธ๋Š” ์˜์กด ๊ด€๊ณ„๋ฅผ ๊ฐ€์ง„ ๋ฐ์ดํ„ฐ๋ฅผ ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ ์ •์˜ (colocating)

๐Ÿ‘‡

  • relay์˜ compilation(ํŽธ์ง‘) ๋‹จ๊ณ„ : ๋ชจ๋“  ๋ณ€ํ™”๋Š” ์ปดํฌ๋„ŒํŠธ ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ์„ ์ˆ˜์ •ํ•œ๋‹ค.

    • ํ•˜๋‚˜์˜ ํฐ ์ฟผ๋ฆฌ๋ฅผ ๋งค๋ฒˆ ๋ชจ๋“  ์ปดํฌ๋„ŒํŠธ์—์„œ ์ž‘์„ฑํ•  ํ•„์š” ์—†์ด, ๊ฐ๊ฐ์˜ ์ปดํฌ๋„ŒํŠธ ์•ˆ์—์„œ ๋…๋ฆฝ์ ์œผ๋กœ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋งŒ ํŒจ์นญํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ”„๋ž˜๊ทธ๋จผํŠธ๋ฅผ ์‚ฌ์šฉ

    • fragment reference: reference ๊ฐ’์—์„œ ๋ฐ์ดํ„ฐ ์ฝ๊ธฐ

    • ๋…๋ฆฝ๋œ ๋ฐ์ดํ„ฐ ์˜์กด์„ฑ์€ ์˜๋„์น˜ ์•Š์€ ๋ฐ์ดํ„ฐ ์—…๋ฐ์ดํŠธ๋ฅผ ๋ฐฉ์ง€ํ•œ๋‹ค.

  • ์„ ์–ธ์ ์ธ GraphQL ๋ฌธ๋ฒ• ์‚ฌ์šฉ: not HOW, but WHAT

relay-compiler

  • ๋ฆด๋ ˆ์ด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํ”„๋ž˜๊ทธ๋จผํŠธ์˜ ๋ชจ์Œ์„ ๋‹จ์ผ GraphQL ์ฟผ๋ฆฌ๋กœ ์ƒ์„ฑ

  • ๋ฆด๋ ˆ์ด ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํƒ€์ž… ์ฒดํฌ ๋“ฑ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•  ์—ฌ์ง€๋ฅผ ์ค„์—ฌ์คŒ

  • ์ปจ๋ฒค์…˜ ๊ฐ•์ œํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์ ์ธ ๋ฉด๋ชจ๋„ ๊ฐ–๊ณ  ์žˆ์Œ

relay-runtime

  • ๋ฆด๋ ˆ์ด ๋Ÿฐํƒ€์ž„์€ ์ตœ์ ํ™”๋œ ์ฟผ๋ฆฌ๋ฅผ ๋Ÿฐํƒ€์ž„์— ์ˆ˜ํ–‰ํ•˜๊ณ  ์ž๋™์œผ๋กœ ์ƒํƒœ ๊ด€๋ฆฌ

  • ๋ชจ๋ธ ์—…๋ฐ์ดํŠธ ์‹œ ์˜์กดํ•˜๋Š” ๋ชจ๋“  ํ”„๋ž˜๊ทธ๋จผํŠธ์— ๋Œ€ํ•ด ์ž๋™ ์—…๋ฐ์ดํŠธ

Data Aggregation

  • GraphQL์„ ์‚ฌ์šฉํ•ด ์—ฌ๋Ÿฌ ์„œ๋น„์Šค์˜ ๋ชจ๋ธ๋“ค์„ ๋‹จ์ผ ์Šคํ‚ค๋งˆ๋กœ ํ‘œํ˜„: ์—ฌ๋Ÿฌ REST API ์„œ๋น„์Šค๋ฅผ ํ•˜๋‚˜์˜ GraphQL ์Šคํ‚ค๋งˆ๋กœ ๋ณ‘ํ•ฉํ•˜๊ธฐ

    • e.g. ๋™๋„ค ์—…์ฒด/ ๊ตฌ์ธ๊ตฌ์ง/ ๋ถ€๋™์‚ฐ/ ์ง€์—ญ๊ด‘๊ณ 

    โ‡’ ์˜ค๋กœ์ง€ ํด๋ผ์ด์–ธํŠธ์˜ ์š”๊ตฌ์— ๋”ฐ๋ผ ์ถ”๊ฐ€์ ์ธ ์„œ๋ฒ„ ์Šคํƒ์„ ์ด์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ถ€๋‹ด... โ‡’

  • ํด๋ผ์ด์–ธํŠธ ์Šคํ‚ค๋งˆ: GraphQL ์„œ๋ฒ„๋ฅผ ํด๋ผ์ด์–ธํŠธ์—์„œ ์ž‘์„ฑํ•˜๊ธฐ

    [isomorphic schema] REST API: DB DB: ํด๋ผ์ด์–ธํŠธ์—์„œ ๊ตฌํ˜„

    • ์„œ๋ฒ„ ๋ ˆ์ด์–ด๋ฅผ ์ฆ๊ฐ€์‹œํ‚ค๋ฉด, ๋„คํŠธ์›Œํฌ ์ง€์—ฐ์‹œ๊ฐ„/ ๋””๋ฒ„๊น… ๋“ฑ์˜ ์–ด๋ ค์›€ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฌธ์ œ ๋ฐœ์ƒ

    • ํด๋ผ์ด์–ธํŠธ ์Šคํ‚ค๋งˆ: GraphQL ์„œ๋ฒ„ ์ฝ”๋“œ๋ฅผ ํด๋ผ์ด์–ธํŠธ ๋‚ด์— ํฌํ•จํ•˜๊ธฐ

ํด๋ผ์ด์–ธํŠธ ์Šคํ‚ค๋งˆ์˜ ์žฅ๋‹จ์ 

[๋‹จ์ ]

  • ์›Œํฌํ”Œ๋กœ์šฐ๊ฐ€ ๋ณต์žกํ•ด์ง

    • graphQL ์Šคํ‚ค๋งˆ ์ˆ˜์ • โ†’ TS ํƒ€์ž… ์ƒ์„ฑ (graphQL code generator) โ†’ graphQL ๋ฆฌ์กธ๋ฒ„ ์ˆ˜์ • โ†’ ์ปดํฌ๋„ŒํŠธ ์ˆ˜์ • โ†’ ๋ฆด๋ ˆ์ด ์ปดํŒŒ์ผ โ†’ ๊ฒฐ๊ณผ

  • ํƒ€์ž… ์„ ์–ธ์„ ์ด์ค‘์œผ๋กœ ํ•ด์ฃผ์–ด์•ผ ํ•จ

  • ๋ฒˆ๋“ค ์‚ฌ์ด์ฆˆ ์ฆ๊ฐ€

[์žฅ์ ]

  • ํ”„๋ž˜๊ทธ๋จผํŠธ ์ฝ”๋กœ์ผ€์ด์…˜์„ ํ†ตํ•ด ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋†’์•„์ง

  • ๋ฐ์ดํ„ฐ๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๋Š๋ƒ โ†’ ์–ด๋–ป๊ฒŒ ์„ ์–ธํ•˜๋Š๋ƒ

  • ์ปดํŒŒ์ผ ํƒ€์ž„์— ์˜ค๋ฅ˜๋ฅผ ๋ฏธ๋ฆฌ ์•Œ ์ˆ˜ ์žˆ์Œ

  • ๋ฐ์ดํ„ฐ ๊ด€๋ จํ•œ ๋ฒ„๊ทธ๊ฐ€ ํ˜„์ €ํžˆ ์ค„์–ด๋“ฆ

    • ์ด์ƒํ•œ ๋™์ž‘์„ ๋ฆด๋ ˆ์ด๊ฐ€ ์ „๋ถ€ ์žก์•„์คŒ

    • e.g. ํŽ˜์ด์ง€๋„ค์ด์…˜ ๊ฒฐ๊ณผ์—์„œ ๊ฐ™์€ ์•„์ดํ…œ์ด ์ค‘๋ณตํ•ด์„œ ๋‚ด๋ ค์˜จ๋‹ค๋ฉด, ์ค‘๋ณต๋œ ์•„์ดํ…œ์„ ๋ฆด๋ ˆ์ด๊ฐ€ ์ž๋™์œผ๋กœ ์‚ญ์ œํ•ด ์คŒ

์„ ์–ธ์ ์œผ๋กœ ์ž‘์„ฑํ•œ๋‹ค๋Š” ๊ฒƒ

Relay๋Š” ์ปดํฌ๋„ŒํŠธ๋งˆ๋‹ค ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ทผ์ฒ˜์— ์„ ์–ธํ•˜๊ธฐ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์–ด๋–ป๊ฒŒ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ฌ์ง€์— ๋Œ€ํ•œ ๊ฑฑ์ •์„ ํ•˜์ง€ ์•Š๊ณ  ๊ฐ ์ปดํฌ๋„ŒํŠธ๋งˆ๋‹ค ์–ด๋–ค ๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•œ์ง€๋งŒ ์„ ์–ธํ•˜๋Š” ๋ฐฉ์‹์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

how๋Š” Relay๊ฐ€ ์•Œ์•„์„œ ๋งก์„ํ…Œ๋‹ˆ, ์šฐ๋ฆฌ๋Š” what์„ ์„ ์–ธ์ ์œผ๋กœ ๋ชจ์•„์„œ ๊ด€๋ฆฌํ•ด์•ผ ํ•œ๋‹ค.

how์™€ what์œผ๋กœ ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•ด์„œ ๋ถ„๋ฆฌํ•˜๊ธฐ

how๋Š” npm ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ฒ˜๋Ÿผ

  • ๋ฒ”์šฉ์ ์œผ๋กœ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ๋„๋ก ์„ค๊ณ„ํ•˜๊ธฐ

  • ์œ ๋‹› ํ…Œ์ŠคํŠธ๋ฅผ ์ด˜์ด˜ํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•ด์„œ ์•ˆ์ „์„ฑ ๋†’์ด๊ธฐ

what์€ ์—ฐ๊ด€๋œ ๊ฒƒ๋ผ๋ฆฌ ๊ฐ€๊นŒ์šด ๊ณณ์— ๋ชจ์œผ๊ธฐ

  • ์–ด๋–ค ์ปดํฌ๋„ŒํŠธ์ธ์ง€, ์–ด๋–ค ์˜์กด์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๋Š”์ง€ ํ•œ ๋ˆˆ์— ์•Œ ์ˆ˜ ์žˆ๋„๋ก

Last updated