Skip to content

Latest commit

Β 

History

History
64 lines (37 loc) Β· 6.69 KB

File metadata and controls

64 lines (37 loc) Β· 6.69 KB
title GraphQL λͺ¨λ²” 사둀
sidebarTitle μ†Œκ°œ
layout ../_core/DocsLayout
category λͺ¨λ²” 사둀
permalink /learn/best-practices/
next /learn/thinking-in-graphs/

GraphQL λͺ…μ„ΈλŠ” λ„€νŠΈμ›Œν¬, 인증, νŽ˜μ΄μ§€λ„€μ΄μ…˜ μ²˜λ¦¬μ™€ 같은 APIκ°€ μ§λ©΄ν•˜λŠ” λͺ‡ κ°€μ§€ μ€‘μš”ν•œ λ¬Έμ œμ— λŒ€ν•΄ μ˜λ„μ μœΌλ‘œ 닀루지 μ•ŠμŠ΅λ‹ˆλ‹€. GraphQL을 μ‚¬μš©ν•  λ•Œ μ΄λŸ¬ν•œ λ¬Έμ œμ— λŒ€ν•œ 해결책이 μ—†λ‹€λŠ” 것은 μ•„λ‹™λ‹ˆλ‹€. 단지 이 λ¬Έμ œλ“€μ€ GraphQL 이 무엇 인지에 λŒ€ν•œ 것과 직접적인 관련이 μ—†μœΌλ©° 이것은 일반적이기 λ•Œλ¬Έμž…λ‹ˆλ‹€.

이 μ„Ήμ…˜μ— 글은 μ „μ μœΌλ‘œ λ°›μ•„ λ“€μ—¬μ„œλŠ” μ•ˆλ˜λ©°, νŠΉμ •ν•œ κ²½μš°μ—λŠ” 이 접근방법이 μ˜¬λ°”λ₯΄μ§€ μ•Šμ„ μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. 이 λ¬Έμ„œμ—μ„œλŠ” GraphQL μ„œλΉ„μŠ€μ˜ 섀계 및 배포와 κ΄€λ ¨λœ Facebookμ—μ„œ 개발된 철학을 μ†Œκ°œν•˜κ³ , HTTPλ₯Ό ν†΅ν•œ μ„œλΉ™ 및 인증과 같은 일반적인 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•œ 방법을 μ œμ•ˆν•©λ‹ˆλ‹€.

λ‹€μŒμ—μ„œλŠ” GraphQL μ„œλΉ„μŠ€μ˜ κ°€μž₯ 일반적인 λͺ¨λ²” 사둀와 쒋은 방법에 λŒ€ν•΄ κ°„λž΅νžˆ μ„€λͺ…ν•©λ‹ˆλ‹€. 그리고, 이 μ„Ήμ…˜μ˜ 각 λ¬Έμ„œμ—μ„œλŠ” 이 μ£Όμ œλ“€μ— λŒ€ν•΄ 더 μžμ„Ένžˆ μ„€λͺ…ν•©λ‹ˆλ‹€.

HTTP

GraphQL은 일반적으둜 μ„œλΉ„μŠ€μ˜ λͺ¨λ“  κΈ°λŠ₯을 ν•˜λ‚˜μ˜ μ—”λ“œν¬μΈνŠΈ HTTPλ₯Ό 톡해 μ œκ³΅λ©λ‹ˆλ‹€. μ΄λŠ” 각각 ν•˜λ‚˜μ˜ λ¦¬μ†ŒμŠ€λ₯Ό μ—¬λŸ¬ URL둜 λ…ΈμΆœν•˜λŠ” REST APIμ™€λŠ” λŒ€μ‘°μ μž…λ‹ˆλ‹€. GraphQL은 이 λ¦¬μ†ŒμŠ€ URLλ“€κ³Ό ν•¨κ»˜ μ‚¬μš©ν•  μˆ˜λ„ μžˆμ§€λ§Œ, GraphiQLκ³Ό 같은 도ꡬλ₯Ό μ‚¬μš©ν•˜κΈ°κ°€ μ–΄λ €μšΈ 수 μžˆμŠ΅λ‹ˆλ‹€.

Serving over HTTPμ—μ„œ 더 μžμ„Ένžˆ μ•Œμ•„λ³΄μ„Έμš”.

JSON (with GZIP)

GraphQL μ„œλΉ„μŠ€λŠ” 일반적으둜 JSON으둜 μ‘λ‹΅ν•˜μ§€λ§Œ GraphQL λͺ…μ„Έμ—μ„œλŠ” ν•„μˆ˜λŠ” μ•„λ‹™λ‹ˆλ‹€. JSON은 더 쒋은 λ„€νŠΈμ›Œν¬ μ„±λŠ₯을 보μž₯ν•˜λŠ” API λ ˆμ΄μ–΄λ₯Ό μœ„ν•΄μ„œλŠ” μ΄μƒν•œ μ„ νƒμ²˜λŸΌ 보일 수 μžˆμ§€λ§Œ λŒ€λΆ€λΆ„ ν…μŠ€νŠΈμ΄κΈ° λ•Œλ¬Έμ— GZIP으둜 맀우 잘 μ••μΆ•λ©λ‹ˆλ‹€.

λͺ¨λ“  ν”„λ‘œλ•μ…˜ GraphQL μ„œλΉ„μŠ€λŠ” GZIP을 ν™œμ„±ν™”ν•˜κ³  ν΄λΌμ΄μ–ΈνŠΈκ°€ λ‹€μŒ 헀더λ₯Ό λ³΄λ‚΄λŠ”κ²ƒμ„ ꢌμž₯ν•©λ‹ˆλ‹€.

Accept-Encoding: gzip

JSON은 ν΄λΌμ΄μ–ΈνŠΈ 및 API κ°œλ°œμžλ“€μ—κ²Œλ„ μΉœμˆ™ν•˜λ©°, 읽고 λ””λ²„κΉ…ν•˜κΈ° μ‰½μŠ΅λ‹ˆλ‹€. μ‹€μ œλ‘œ GraphQL 문법은 JSON 문법에 λΆ€λΆ„μ μœΌλ‘œ 영ν–₯을 λ°›μ•˜μŠ΅λ‹ˆλ‹€.

버저닝

GraphQL μ„œλΉ„μŠ€κ°€ λ‹€λ₯Έ REST API와 λ§ˆμ°¬κ°€μ§€λ‘œ 버전이 λ³€κ²½λ˜λŠ” 것을 막을 μˆ˜λŠ” μ—†μ§€λ§Œ, GraphQL μŠ€ν‚€λ§ˆμ˜ 지속적인 μ—…λ°μ΄νŠΈλ₯Ό μœ„ν•œ 도ꡬλ₯Ό μ œκ³΅ν•˜μ—¬ 버전 관리λ₯Ό ν”Όν•˜λŠ” 것에 λŒ€ν•΄μ„œ κ°•ν•œ μ˜κ²¬μ„ κ°€μ§€κ³  μžˆμŠ΅λ‹ˆλ‹€.

μ™œ λŒ€λΆ€λΆ„μ˜ APIλŠ” 버전관리λ₯Ό ν•΄μ•Όν• κΉŒμš”? API μ—”λ“œν¬μΈνŠΈμ—μ„œ λ¦¬ν„΄λœ 데이터에 λŒ€ν•œ 변경이 μžˆμ„ λ•Œ λͺ¨λ“  변경은 큰 λ³€ν™”λ₯Ό μΌμœΌν‚¬ 수 있으며, 큰 λ³€κ²½μ‚¬ν•­μ—λŠ” μƒˆ 버전이 ν•„μš”ν•©λ‹ˆλ‹€. API에 μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ν•˜λŠ”λ° μƒˆλ‘œμš΄ 버전이 ν•„μš”ν•œ 경우 APIλ₯Ό μ΄ν•΄ν•˜κΈ° 쉽고 μœ μ§€ λ³΄μˆ˜ν•  수 μžˆλŠ” 버전을 자주 μΆœμ‹œν•˜κ³  μ—…λ°μ΄νŠΈλœ 버전을 μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.

λ°˜λŒ€λ‘œ GraphQL은 λͺ…μ‹œμ μœΌλ‘œ μš”μ²­λœ λ°μ΄ν„°λ§Œ λ°˜ν™˜ν•˜λ―€λ‘œ μƒˆλ‘œμš΄ νƒ€μž…κ³Ό ν•„λ“œλ₯Ό 톡해 μƒˆλ‘œμš΄ κΈ°λŠ₯을 μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ΄λŠ” 항상 변경사항을 ν”Όν•˜κ³  λ²„μ „μ—†λŠ” APIλ₯Ό μ œκ³΅ν•˜λŠ” λ°©λ²•μœΌλ‘œ μ΄μ–΄μ§‘λ‹ˆλ‹€.

Nullability

null 을 νŒλ‹¨ν•˜λŠ” λŒ€λΆ€λΆ„μ˜ νƒ€μž… μ‹œμŠ€ν…œμ€, 일반 νƒ€μž…κ³Ό ν•΄λ‹Ή νƒ€μž…μ˜ nullable 버전을 μ œκ³΅ν•˜λ©°, λͺ…μ‹œμ μœΌλ‘œ μ„ μ–Έν•˜μ§€ μ•ŠλŠ”ν•œ, κΈ°λ³Έ νƒ€μž…μ€ null을 ν¬ν•¨ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ GraphQL νƒ€μž… μ‹œμŠ€ν…œμ—μ„œλŠ” λͺ¨λ“  ν•„λ“œκ°€ 기본적으둜 nullable μž…λ‹ˆλ‹€. μ΄λŠ” λ°μ΄ν„°λ² μ΄μŠ€ 및 기타 λ°±μ—”λ“œμ˜ λ„€νŠΈμ›Œν¬ μ„œλΉ„μŠ€μ—μ„œ λ§Žμ€ 일이 λ°œμƒν•  수 있기 λ•Œλ¬Έμž…λ‹ˆλ‹€. λ°μ΄ν„°λ² μ΄μŠ€κ°€ λ‹€μš΄λ˜κ±°λ‚˜ 비동기 μž‘μ—…μ΄ μ‹€νŒ¨ν•  수 있으며, μ˜ˆμ™Έκ°€ λ°œμƒν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. λ‹¨μˆœν•œ μ‹œμŠ€ν…œ μ‹€νŒ¨ 이외에도 μš”μ²­ λ‚΄μ˜ 각 ν•„λ“œκ°€ μ„œλ‘œ λ‹€λ₯Έ 인증 κ·œμΉ™μ„ κ°€μ Έμ„œ, κΆŒν•œμ΄ 세뢄화될 수 μžˆμŠ΅λ‹ˆλ‹€.

μ΄λŸ¬ν•œ 이유둜 인해 기본적으둜 λͺ¨λ“  ν•„λ“œλ₯Ό nullable 둜 μ„€μ •ν•˜λ©΄ μš”μ²­μ΄ μ™„μ „νžˆ μ‹€νŒ¨ν•˜μ§€ μ•Šκ³  ν•΄λ‹Ή ν•„λ“œκ°€ null 둜 λ°˜ν™˜λ  수 μžˆμŠ΅λ‹ˆλ‹€. λŒ€μ‹ , GraphQL은 non-null νƒ€μž…μ„ μ œκ³΅ν•˜μ—¬, μš”μ²­μ‹œ ν•„λ“œκ°€ μ ˆλŒ€ null 을 λ°˜ν™˜ν•˜μ§€ μ•Šλ„λ‘ 보μž₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λŒ€μ‹ μ—, λ§Œμ•½ 였λ₯˜κ°€ λ°œμƒν•˜λ©΄, 이전 μƒμœ„ ν•„λ“œκ°€ λŒ€μ‹  null 이 λ©λ‹ˆλ‹€.

GraphQL μŠ€ν‚€λ§ˆλ₯Ό 섀계할 λ•Œ, 잘λͺ»λ  수 μžˆλŠ” λͺ¨λ“  λ¬Έμ œμ™€ μ‹€νŒ¨ν•œ ν•„λ“œμ— λŒ€ν•΄ null 이 μ μ ˆν•œ κ°’μž„μ„ λͺ…μ‹¬ν•˜λŠ” 것이 μ€‘μš”ν•©λ‹ˆλ‹€. 일반적으둜 κ·Έλ ‡μ§€λ§Œ λ•Œλ‘œλŠ” κ·Έλ ‡μ§€ μ•ŠλŠ” κ²½μš°λ„ μžˆμŠ΅λ‹ˆλ‹€. μ΄λŸ¬ν•œ 경우, null 이 μ•„λ‹˜μ„ 보μž₯ν•˜λŠ” non-null νƒ€μž…μ„ μ‚¬μš©ν•˜μ‹­μ‹œμ˜€.

νŽ˜μ΄μ§€λ„€μ΄μ…˜

GraphQL νƒ€μž… μ‹œμŠ€ν…œμ€ 일뢀 ν•„λ“œκ°€ κ°’μ˜ 리슀트λ₯Ό λ°˜ν™˜ν•˜μ§€λ§Œ API μ„€κ³„μžλŠ” κΈ΄ λ¦¬μŠ€νŠΈμ— λŒ€ν•œ νŽ˜μ΄μ§€λ„€μ΄μ…˜μ„ μ œκ³΅ν•  수 μžˆμŠ΅λ‹ˆλ‹€. νŽ˜μ΄μ§€λ„€μ΄μ…˜μ„ μœ„ν•œ λ‹€μ–‘ν•œ API λ””μžμΈμ΄ 있으며, 각각 μž₯단점이 μžˆμŠ΅λ‹ˆλ‹€.

일반적으둜 κΈ΄ λ¦¬μŠ€νŠΈμ„ λ°˜ν™˜ν•  수 μžˆλŠ” ν•„λ“œλŠ” firstλ‚˜ after 인수λ₯Ό μ‚¬μš©ν•˜μ—¬, λͺ©λ‘μ˜ νŠΉμ • ꡬ간을 μ§€μ •ν•  수 μžˆμŠ΅λ‹ˆλ‹€. μ—¬κΈ°μ„œ after λŠ” 리슀트의 각 값에 λŒ€ν•œ 고유 μ‹λ³„μž(unique identifier)μž…λ‹ˆλ‹€.

κΈ°λŠ₯이 λ‹€μ–‘ν•œ νŽ˜μ΄μ§€λ„€μ΄μ…˜μ„ μ‚¬μš©ν•˜μ—¬ ꢁ극적으둜 APIλ₯Ό λ””μžμΈν•˜λ©΄ Connections λΌλŠ” λͺ¨λ²” 사둀 νŒ¨ν„΄μ΄ μƒκΉλ‹ˆλ‹€. Relay와 같은 GraphQL의 λͺ‡λͺ‡ ν΄λΌμ΄μ–ΈνŠΈ λ„κ΅¬λŠ” Connections νŒ¨ν„΄μ„ κ΅¬ν˜„ν•˜λ©°, GraphQL APIκ°€ 이 νŒ¨ν„΄μ„ μ‚¬μš©ν•  λ•Œ ν΄λΌμ΄μ–ΈνŠΈ μΈ‘ νŽ˜μ΄μ§€λ„€μ΄μ…˜μ„ μžλ™μœΌλ‘œ μ§€μ›ν•©λ‹ˆλ‹€.

νŽ˜μ΄μ§€λ„€μ΄μ…˜ λ¬Έμ„œμ—μ„œ μžμ„Ένžˆ μ½μ–΄λ³΄μ„Έμš”.

μ„œλ²„μ‚¬μ΄λ“œ 배치 & μΊμ‹œ

GraphQL은 μ„œλ²„μ— κΉ”λ”ν•œ μ½”λ“œλ₯Ό μž‘μ„±ν•  수 μžˆλŠ” λ°©μ‹μœΌλ‘œ μ„€κ³„λ˜μ—ˆμŠ΅λ‹ˆλ‹€. λͺ¨λ“  νƒ€μž…μ˜ 각 ν•„λ“œμ—λŠ” ν•΄λ‹Ή 값을 ν™•μΈν•˜λŠ”λ° μ΄ˆμ μ„ 맞좘 단일λͺ©μ (single-purpose) ν•¨μˆ˜κ°€ μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ μ΄λŸ¬ν•œ 좔가적인 고렀없이, κ°„λ‹¨ν•œ GraphQL μ„œλΉ„μŠ€λŠ” 맀우 반볡적으둜 데이터λ₯Ό λ°μ΄ν„°λ² μ΄μŠ€μ—μ„œ λ‘œλ“œν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€.

μ΄λŠ” 일반적으둜 λ°±μ—”λ“œμ˜ 데이터에 λŒ€ν•œ 닀쀑 μš”μ²­μ΄ 단기간에 λ°œμƒν•  λ•Œ, 단일 μš”μ²­μ—μ„œ λ°μ΄ν„°λ² μ΄μŠ€λ‚˜ λ§ˆμ΄ν¬λ‘œμ„œλΉ„μŠ€λ‘œ μ „μ†‘λ˜λŠ” 일괄 처리 기법인 Facebook의 DataLoader와 같은 도ꡬλ₯Ό μ‚¬μš©ν•˜μ—¬ ν•΄κ²°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.