ν¨μ¨μ μ΄κ³ λ°μμ μΈ κΈλ‘λ² μ ν리μΌμ΄μ ꡬμΆμ μν Reactμ μ€νμ μΈ experimental_useSubscription ν μ μ₯μ , μ¬μ© μ¬λ‘, ꡬν μ λ΅μ νꡬνλ μ’ ν© κ°μ΄λμ λλ€.
React experimental_useSubscriptionμΌλ‘ λ°μν λ°μ΄ν° μ κΈ ν΄μ : κΈλ‘λ² κ°μ΄λ
Reactμ μ§ννλ νκ²½μ κ°λ°μ κ²½νμ ν₯μμν€κ³ μ ν리μΌμ΄μ
μ±λ₯μ κ°μ νκΈ° μν΄ μ€κ³λ μλ‘μ΄ λꡬμ κΈ°μ μ μ§μμ μΌλ‘ λμ
ν©λλ€. κ·Έμ€ νλκ° νμ¬ μ€ν λ¨κ³μ μλ experimental_useSubscription
ν
μ
λλ€. μ΄ ν
μ λΉλκΈ° λ°μ΄ν°λ₯Ό κ΄λ¦¬νκ³ λ°μν μ¬μ©μ μΈν°νμ΄μ€λ₯Ό ꡬμΆνκΈ° μν κ°λ ₯ν λ©μ»€λμ¦μ μ 곡ν©λλ€. μ΄ κ°μ΄λλ κΈλ‘λ² μ¬μ©μλ₯Ό λμμΌλ‘ μ ν리μΌμ΄μ
μ ꡬμΆνλ κ°λ°μλ₯Ό μν΄ experimental_useSubscription
μ μ₯μ , μ¬μ© μ¬λ‘ λ° κ΅¬ν μ λ΅μ νꡬνλ©° μ’
ν©μ μΈ κ°μλ₯Ό μ 곡νλ κ²μ λͺ©νλ‘ ν©λλ€.
experimental_useSubscriptionμ΄λ 무μμΈκ°?
experimental_useSubscription
μ μ»΄ν¬λνΈκ° μΈλΆ λ°μ΄ν° μμ€λ₯Ό ꡬλ
νκ³ ν΄λΉ λ°μ΄ν°κ° λ³κ²½λ λ μλμΌλ‘ λ€μ λ λλ§λλλ‘ νλ React ν
μ
λλ€. μ
λ°μ΄νΈλ₯Ό μλμΌλ‘ νΈλ¦¬κ±°νλ κΈ°μ‘΄μ λ°μ΄ν° κ°μ Έμ€κΈ° λ°©μκ³Ό λ¬λ¦¬, experimental_useSubscription
μ UIλ₯Ό μ΅μ λ°μ΄ν°μ λκΈ°ν μνλ‘ μ μ§νλ μ μΈμ μ΄κ³ ν¨μ¨μ μΈ λ°©λ²μ μ 곡ν©λλ€.
μ£Όμ νΉμ§:
- μ μΈμ λ°μ΄ν° λ°μΈλ©: ν μ μ¬μ©νμ¬ μ»΄ν¬λνΈ λ΄μμ μ§μ λ°μ΄ν° μ’ μμ±μ μ μν©λλ€.
- μλ μ λ°μ΄νΈ: ꡬλ ν λ°μ΄ν° μμ€μμ λ³κ²½ μ¬νμ΄ λ°μνλ©΄ Reactκ° μ»΄ν¬λνΈλ₯Ό μλμΌλ‘ λ€μ λ λλ§ν©λλ€.
- μ΅μ νλ μ±λ₯: μ΄ ν μ Reactμ μ¬μ‘°μ νλ‘μΈμ€λ₯Ό νμ©νμ¬ λΆνμν 리λ λλ§μ μ΅μνν©λλ€.
- λ¨μνλ λ°μ΄ν° κ΄λ¦¬: React μ»΄ν¬λνΈ λ΄μμ λ°μ΄ν°λ₯Ό κ°μ Έμ€κ³ , μΊμ±νκ³ , μ λ°μ΄νΈνλ νλ‘μΈμ€λ₯Ό κ°μνν©λλ€.
μ€μ μ°Έκ³ μ¬ν: μ΄λ¦μμ μ μ μλ―μ΄ experimental_useSubscription
μ νμ¬ μ€ν λ¨κ³μ μμ΅λλ€. μ΄λ ν₯ν React 릴리μ€μμ APIκ° λ³κ²½λ μ μμμ μλ―Έν©λλ€. μ£Όμν΄μ μ¬μ©νκ³ ν
μ΄ λ°μ ν¨μ λ°λΌ μ½λλ₯Ό μμ ν μ€λΉλ₯Ό ν΄μΌ ν©λλ€.
μ experimental_useSubscriptionμ μ¬μ©ν΄μΌ νλκ°?
experimental_useSubscription
ν
μ μ΅μ React μ ν리μΌμ΄μ
, νΉν μ€μκ° λ°μ΄ν°λ μμ£Ό λ³κ²½λλ λ°μ΄ν°μ
μ λ€λ£¨λ μ ν리μΌμ΄μ
μ ꡬμΆνλ λ° λͺ κ°μ§ κ°λ ₯ν μ΄μ μ μ 곡ν©λλ€. μ£Όμ μ΄μ μ λ€μκ³Ό κ°μ΅λλ€.
ν₯μλ λ°μμ±
κΈ°μ‘΄μ λ°μ΄ν° κ°μ Έμ€κΈ° λ°©μμ μ’
μ’
useState
μ useEffect
λ₯Ό μ¬μ©νμ¬ μλμΌλ‘ μ
λ°μ΄νΈλ₯Ό νΈλ¦¬κ±°ν΄μΌ νμ΅λλ€. μ΄λ νΉν μ¬λ¬ λ°μ΄ν° μμ€λ₯Ό λ€λ£° λ 볡μ‘νκ³ μ€λ₯κ° λ°μνκΈ° μ¬μ΄ μ½λλ‘ μ΄μ΄μ§ μ μμ΅λλ€. experimental_useSubscription
μ λ°μ΄ν°λ₯Ό ꡬλ
νκ³ λ³κ²½ μ¬νμ΄ λ°μν λ UIλ₯Ό μλμΌλ‘ μ
λ°μ΄νΈνλ μ μΈμ μΈ λ°©λ²μ μ 곡νμ¬ μ΄ νλ‘μΈμ€λ₯Ό λ¨μνν©λλ€.
μμ: μ€μκ° μ£Όμ μμΈ νμκΈ° μ ν리μΌμ΄μ
μ ꡬμΆνλ€κ³ μμν΄ λ³΄μΈμ. μλ²μμ μ
λ°μ΄νΈλ₯Ό μλμΌλ‘ ν΄λ§νκ³ λ¦¬λ λλ§μ νΈλ¦¬κ±°νλ λμ , experimental_useSubscription
μ μ¬μ©νμ¬ μ£Όκ° μ€νΈλ¦Όμ ꡬλ
ν μ μμ΅λλ€. μλ‘μ΄ κ°κ²©μ΄ μμ λ λλ§λ€ μ»΄ν¬λνΈκ° μλμΌλ‘ μ
λ°μ΄νΈλμ΄ λΆλλ½κ³ λ°μμ μΈ μ¬μ©μ κ²½νμ 보μ₯ν©λλ€.
κ°μ λ μ±λ₯
λ°μ΄ν° μ
λ°μ΄νΈλ₯Ό μλμΌλ‘ μ²λ¦¬ν¨μΌλ‘μ¨ experimental_useSubscription
μ μ ν리μΌμ΄μ
μ±λ₯μ μ΅μ ννλ λ° λμμ΄ λ μ μμ΅λλ€. μ΄ ν
μ Reactμ μ¬μ‘°μ νλ‘μΈμ€λ₯Ό νμ©νμ¬ λΆνμν 리λ λλ§μ μ΅μννκ³ UIμ μν₯μ λ°λ λΆλΆλ§ μ
λ°μ΄νΈλλλ‘ λ³΄μ₯ν©λλ€. μ΄λ νΉν 볡μ‘νκ³ λ°μ΄ν°κ° μμ£Ό λ³κ²½λλ μ ν리μΌμ΄μ
μμ μλΉν μ±λ₯ ν₯μμΌλ‘ μ΄μ΄μ§ μ μμ΅λλ€.
μμ: 곡λ λ¬Έμ νΈμ§ μ ν리μΌμ΄μ
μ μκ°ν΄ 보μΈμ. experimental_useSubscription
μ μ¬μ©νλ©΄ κ° μ¬μ©μμ λ³κ²½ μ¬νμ΄ μ 체 λ¬Έμλ₯Ό λΆνμνκ² λ¦¬λ λλ§νμ§ μκ³ λ λ€λ₯Έ μ¬μ©μμ νλ©΄μ ν¨μ¨μ μΌλ‘ μ νλ μ μμ΅λλ€. μ΄λ λͺ¨λ μ¬μ©μμκ² λ λΆλλ½κ³ λ°μμ μΈ νΈμ§ κ²½νμ μ 곡ν©λλ€.
λ¨μνλ λ°μ΄ν° κ΄λ¦¬
experimental_useSubscription
μ React μ»΄ν¬λνΈ λ΄μμ λ°μ΄ν°λ₯Ό κ°μ Έμ€κ³ , μΊμ±νκ³ , μ
λ°μ΄νΈνλ νλ‘μΈμ€λ₯Ό κ°μνν©λλ€. λ°μ΄ν° ꡬλ
λ‘μ§μ ν
λ΄μ μΊ‘μνν¨μΌλ‘μ¨ μμ©κ΅¬ μ½λμ μμ μ€μ΄κ³ μ»΄ν¬λνΈλ₯Ό λ μ½κΈ° μ½κ³ μ μ§λ³΄μνκΈ° μ½κ² λ§λ€ μ μμ΅λλ€.
μμ: κΈλ‘λ² μ ν μΉ΄νλ‘κ·Έκ° μλ μ μμκ±°λ μ ν리μΌμ΄μ
μ ꡬμΆν λ experimental_useSubscription
μ μ¬μ©νμ¬ λ€μν μ§μ λ°μ΄ν°λ² μ΄μ€μ μ ν λ°μ΄ν°λ₯Ό ꡬλ
ν μ μμ΅λλ€. μ΄ ν
μ λ°μ΄ν° μ§κ³ λ° μΊμ±μ 볡μ‘μ±μ μ²λ¦¬νμ¬ μ¬μ©μκ° μμΉμ κ΄κ³μμ΄ νμ μ΅μ μ ν μ 보λ₯Ό λ³Ό μ μλλ‘ λ³΄μ₯ν©λλ€.
μμ©κ΅¬ μ½λ κ°μ
μ΄ ν μ λΉλκΈ° λ°μ΄ν° κ΄λ¦¬μ κ΄λ ¨λ λ§μ 볡μ‘ν λ‘μ§μ μΆμννμ¬ μμ±ν΄μΌ νλ μ½λμ μμ μ€μ¬μ€λλ€. μ΄λ κ°λ° μκ°μ λ¨μΆνκ³ λ μ μ§λ³΄μνκΈ° μ¬μ΄ μ½λλ² μ΄μ€λ‘ μ΄μ΄μ§ μ μμ΅λλ€.
experimental_useSubscriptionμ μ¬μ© μ¬λ‘
experimental_useSubscription
μ λ°μ΄ν°κ° μμ£Ό λ³κ²½λκ±°λ μ¬λ¬ μ»΄ν¬λνΈ κ°μ λκΈ°ν μνλ₯Ό μ μ§ν΄μΌ νλ λ€μν μ¬μ© μ¬λ‘μ μ ν©ν©λλ€. μΌλ°μ μΈ μλ리μ€λ λ€μκ³Ό κ°μ΅λλ€.
μ€μκ° μ ν리μΌμ΄μ
μ£Όμ μμΈ νμκΈ°, μμ
λ―Έλμ΄ νΌλ, λΌμ΄λΈ λμ보λμ κ°μ΄ μ€μκ° λ°μ΄ν°λ₯Ό νμνλ μ ν리μΌμ΄μ
μ experimental_useSubscription
μ μ΄μ μ ν¬κ² λ릴 μ μμ΅λλ€. μ΄ ν
μ λ°μ΄ν° μ€νΈλ¦Όμ ꡬλ
νκ³ μλ‘μ΄ λ°μ΄ν°κ° μμ λ λ UIλ₯Ό μλμΌλ‘ μ
λ°μ΄νΈνλ κ°λ¨νκ³ ν¨μ¨μ μΈ λ°©λ²μ μ 곡ν©λλ€.
κΈλ‘λ² μμ: κΈλ‘λ² μνΈνν κ±°λ νλ«νΌμ experimental_useSubscription
μ μ¬μ©νμ¬ λ€μν μνΈννμ μ€μκ° κ°κ²© λ³λμ νμν¨μΌλ‘μ¨ μ μΈκ³ μ¬μ©μκ° μ΅μ μμ₯ μ 보μ μ κ·Όν μ μλλ‘ λ³΄μ₯ν μ μμ΅λλ€.
곡λ μμ μ ν리μΌμ΄μ
λ¬Έμ νΈμ§κΈ° λ° νλ‘μ νΈ κ΄λ¦¬ λꡬμ κ°μ 곡λ μμ
μ ν리μΌμ΄μ
μ μ¬λ¬ μ¬μ©μμ νλ©΄μμ λ°μ΄ν°λ₯Ό λκΈ°ν μνλ‘ μ μ§ν΄μΌ ν©λλ€. experimental_useSubscription
μ λ€λ₯Έ μ¬μ©μκ° λ§λ λ³κ²½ μ¬νμ ꡬλ
νκ³ UIλ₯Ό μλμΌλ‘ μ
λ°μ΄νΈνμ¬ μνν 곡λ μμ
κ²½νμ 보μ₯νλ λ° μ¬μ©λ μ μμ΅λλ€.
κΈλ‘λ² μμ: 곡μ νλ μ ν
μ΄μ
μμ
μ νλ λ€κ΅μ νμ experimental_useSubscription
μ μ¬μ©νμ¬ μ§λ¦¬μ μμΉμ κ΄κ³μμ΄ λͺ¨λ μ¬λμ΄ μ€μκ°μΌλ‘ νλ μ ν
μ΄μ
μ μ΅μ λ²μ μ λ³Ό μ μλλ‘ ν μ μμ΅λλ€.
λ°μ΄ν° λμ보λ
λ°μ΄ν° λμ보λλ μ’
μ’
λ€μν μμ€μμ μμ£Ό λ³κ²½λλ λ°μ΄ν°λ₯Ό νμν©λλ€. experimental_useSubscription
μ μ΄λ¬ν λ°μ΄ν° μμ€λ₯Ό ꡬλ
νκ³ μλ‘μ΄ λ°μ΄ν°κ° μ¬μ© κ°λ₯ν΄μ§λ©΄ λμ보λλ₯Ό μλμΌλ‘ μ
λ°μ΄νΈνλ λ° μ¬μ©λ μ μμ΅λλ€.
κΈλ‘λ² μμ: κΈλ‘λ² μμ
λμ보λλ experimental_useSubscription
μ μ¬μ©νμ¬ μ¬λ¬ μ§μμ μ€μκ° μμ
μμΉλ₯Ό νμν¨μΌλ‘μ¨ κ΄λ¦¬μκ° μΆμΈλ₯Ό μ μνκ² νμ
νκ³ μ 보μ μ
κ°ν κ²°μ μ λ΄λ¦΄ μ μλλ‘ ν μ μμ΅λλ€.
μν κ΄λ¦¬
볡μ‘ν μνμλ Reduxλ Zustandμ κ°μ μ μ© μν κ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬κ° μμ£Ό μ¬μ©λμ§λ§, experimental_useSubscription
μ νΉν λΉλκΈ° λ°μ΄ν° μμ€μ κ΄λ ¨λ λ κ°λ¨ν ννμ 곡μ μνλ₯Ό κ΄λ¦¬νλ λ° μ¬μ©λ μ μμ΅λλ€.
experimental_useSubscription μ¬μ© λ°©λ²: μ€μ© κ°μ΄λ
experimental_useSubscription
μ ν¨κ³Όμ μΌλ‘ μ¬μ©νλ €λ©΄ APIλ₯Ό μ΄ν΄νκ³ λ°μ΄ν° μμ€μ ν΅ν©νλ λ°©λ²μ μμμΌ ν©λλ€. λ€μμ μ€μ μμλ₯Ό ν¬ν¨ν λ¨κ³λ³ κ°μ΄λμ
λλ€.
1. μ€μΉ λ° μ€μ
experimental_useSubscription
μ μ€νμ κΈ°λ₯μ΄λ―λ‘ React ꡬμ±μμ μ€νμ κΈ°λ₯μ νμ±νν΄μΌ ν μ μμ΅λλ€. μ€νμ APIλ₯Ό νμ±ννλ μ΅μ μ§μΉ¨μ 곡μ React λ¬Έμλ₯Ό νμΈνμΈμ.
μΌλ°μ μΌλ‘ μ΄λ νΉμ λ²μ μ React λ° React DOMμ μ¬μ©νκ³ , λ²λ€λ¬(μ: webpack, Parcel λλ esbuild)μμ μ€νμ κΈ°λ₯ νλκ·Έλ₯Ό νμ±ννλ κ²μ ν¬ν¨ν©λλ€.
2. κΈ°λ³Έ API
experimental_useSubscription
μ ν΅μ¬μ ν¨μ μκ·Έλμ²μ
λλ€. μΌλ°μ μΌλ‘ μ΅μν create
λ©μλκ° ν¬ν¨λ κ΅¬μ± κ°μ²΄λ₯Ό λ°μ΅λλ€.
const value = experimental_useSubscription(config);
μ¬κΈ°μ config
λ λ°μ΄ν° μμ€λ₯Ό ꡬλ
νκ³ μ½λ λ°©λ²μ μ§μ νλ κ°μ²΄μ
λλ€.
3. ꡬλ μμ±
config
κ°μ²΄μ create
λ©μλλ λ°μ΄ν° μμ€μ λν ꡬλ
μ μ€μ νλ λ°©λ²μ μ μνλ κ³³μ
λλ€. μ΄λ WebSocket μ°κ²° μ€μ , λ©μμ§ ν ꡬλ
λλ ν΄λ§ λ©μ»€λμ¦ μ¬μ©μ ν¬ν¨ν μ μμ΅λλ€.
μμ: WebSocket ꡬλ νκΈ°
const websocketSubscription = {
create: (options) => {
const ws = new WebSocket('wss://example.com/data');
ws.onopen = () => {
console.log('Connected to WebSocket');
};
ws.onmessage = (event) => {
options.onNext(event.data);
};
ws.onerror = (error) => {
options.onError(error);
};
return ws;
},
// Optional: Implement unsubscribe if needed.
// close: (ws) => ws.close(),
};
μ΄ μμμμ:
wss://example.com/data
μ λν μλ‘μ΄ WebSocket μ°κ²°μ΄ μ€μ λ©λλ€.onmessage
νΈλ€λ¬λ WebSocket μλ²μμ λ°μ΄ν°λ₯Ό μμ νκ³onNext
ν¨μ(Reactμμ μ 곡)λ₯Ό νΈμΆνμ¬ λ°μ΄ν°κ° λ³κ²½λμμμ μ리λ λ° μ¬μ©λ©λλ€.onerror
νΈλ€λ¬λ μ€λ₯λ₯Ό μ²λ¦¬νκ³onError
ν¨μ(Reactμμ μ 곡)λ₯Ό νΈμΆνλ λ° μ¬μ©λ©λλ€.
4. ꡬλ κ° μ½κΈ°
experimental_useSubscription
ν
μ ꡬλ
μ νμ¬ κ°μ λ°νν©λλ€. μ΄ κ°μ create
λ©μλ λ΄μμ onNext
ν¨μκ° νΈμΆλ λλ§λ€ μλμΌλ‘ μ
λ°μ΄νΈλ©λλ€.
μμ: μ»΄ν¬λνΈμμ WebSocket ꡬλ μ¬μ©νκΈ°
import React from 'react';
import { experimental_useSubscription } from 'react';
function DataDisplay() {
const data = experimental_useSubscription(websocketSubscription);
if (!data) {
return Loading...
;
}
return Received data: {data}
;
}
export default DataDisplay;
μ΄ μμμμ:
DataDisplay
μ»΄ν¬λνΈλexperimental_useSubscription
μ μ¬μ©νμ¬websocketSubscription
ꡬμ±μ ν΅ν΄ WebSocket λ°μ΄ν° μμ€λ₯Ό ꡬλ ν©λλ€.data
λ³μλ WebSocket μλ²μμ μ λ©μμ§λ₯Ό λ°μ λλ§λ€ μλμΌλ‘ μ λ°μ΄νΈλ©λλ€.- μ»΄ν¬λνΈλ μμ λ λ°μ΄ν°λ₯Ό λ λλ§νλ©°, λ°μ΄ν°κ° μ΄κΈ°μ λ‘λλλ λμ λ‘λ© λ©μμ§λ₯Ό νμν©λλ€.
5. μ€λ₯ μ²λ¦¬
ꡬλ
κ³Όμ μμ λ°μν μ μλ μ€λ₯λ₯Ό μ²λ¦¬νλ κ²μ λ§€μ° μ€μν©λλ€. onError
ν¨μ(Reactμμ μ 곡)λ μ€λ₯κ° λ°μνμμ μ리λ λ° μ¬μ©ν μ μμ΅λλ€. μ΄ μ 보λ₯Ό μ¬μ©νμ¬ μ¬μ©μμκ² μ€λ₯ λ©μμ§λ₯Ό νμνκ±°λ λ€λ₯Έ μ μ ν μ‘°μΉλ₯Ό μ·¨ν μ μμ΅λλ€.
μμ: μ€λ₯ μ²λ¦¬
const websocketSubscription = {
create: (options) => {
const ws = new WebSocket('wss://example.com/data');
ws.onopen = () => {
console.log('Connected to WebSocket');
};
ws.onmessage = (event) => {
try {
const parsedData = JSON.parse(event.data);
options.onNext(parsedData);
} catch (error) {
options.onError(error);
}
};
ws.onerror = (error) => {
options.onError(error);
};
return ws;
},
// Optional: Implement unsubscribe if needed.
// close: (ws) => ws.close(),
};
function DataDisplay() {
const data = experimental_useSubscription(websocketSubscription);
if (data && data.error) {
return Error: {data.error.message}
;
}
if (!data || !data.value) {
return Loading...
;
}
return Received data: {data.value}
;
}
μ΄ μμμμλ WebSocket μλ²μμ λ°μ JSON λ°μ΄ν°λ₯Ό νμ±νλ λμ λ°μν μ μλ μ€λ₯λ₯Ό μ‘κΈ° μν΄ onmessage
νΈλ€λ¬μ μ€λ₯ μ²λ¦¬λ₯Ό μΆκ°νμ΅λλ€. λν μ€λ₯κ° κ°μ§λλ©΄ μ€λ₯ λ©μμ§λ₯Ό νμνλλ‘ DataDisplay
μ»΄ν¬λνΈλ₯Ό μ
λ°μ΄νΈνμ΅λλ€.
6. ꡬλ μ·¨μ
λ©λͺ¨λ¦¬ λμλ₯Ό λ°©μ§νλ €λ©΄ μ»΄ν¬λνΈκ° λ§μ΄νΈ ν΄μ λ λ λ°μ΄ν° μμ€ κ΅¬λ
μ μ·¨μνλ κ²μ΄ νμμ μ
λλ€. config
κ°μ²΄μ close
λ©μλλ₯Ό ꡬννμ¬ μ΄λ₯Ό μνν μ μμ΅λλ€. μ΄ λ©μλλ μ»΄ν¬λνΈκ° λ§μ΄νΈ ν΄μ λ λ νΈμΆλμ΄ κ΅¬λ
κ³Ό κ΄λ ¨λ λͺ¨λ 리μμ€λ₯Ό μ 리ν μ μκ² ν΄μ€λλ€.
μμ: WebSocket ꡬλ μ·¨μνκΈ°
const websocketSubscription = {
create: (options) => {
const ws = new WebSocket('wss://example.com/data');
ws.onopen = () => {
console.log('Connected to WebSocket');
};
ws.onmessage = (event) => {
options.onNext(event.data);
};
ws.onerror = (error) => {
options.onError(error);
};
return ws;
},
close: (ws) => {
console.log('Closing WebSocket connection');
ws.close();
},
};
μ΄ μμμμλ μ»΄ν¬λνΈκ° λ§μ΄νΈ ν΄μ λ λ WebSocket μ°κ²°μ λ«λλ‘ close
λ©μλκ° κ΅¬νλμμ΅λλ€.
7. GraphQL ꡬλ κ³Ό ν¨κ» μ¬μ©νκΈ°
experimental_useSubscription
μ GraphQL ꡬλ
κ³Ό ν¨κ» μμ
ν λ νΉν μ μ©ν μ μμ΅λλ€. λ§μ GraphQL ν΄λΌμ΄μΈνΈλ μ€μκ° λ°μ΄ν° μ
λ°μ΄νΈλ₯Ό ꡬλ
νλ λ©μ»€λμ¦μ μ 곡νλ©°, experimental_useSubscription
μ μ¬μ©νμ¬ μ΄λ¬ν ꡬλ
μ React μ»΄ν¬λνΈμ μννκ² ν΅ν©ν μ μμ΅λλ€.
μμ: Apollo Clientμ ν¨κ» μ¬μ©νκΈ°
GraphQL APIμ Apollo Clientλ₯Ό μ¬μ©νκ³ μλ€κ³ κ°μ νλ©΄, @apollo/client
μμ μ 곡νλ useSubscription
ν
μ μ¬μ©νμ¬ κ΅¬λ
μ μμ±ν μ μμ΅λλ€. κ·Έλ° λ€μ experimental_useSubscription
μ μ¬μ©νμ¬ ν΄λΉ ꡬλ
μ κ²°κ³Όμ ꡬλ
ν μ μμ΅λλ€.
import React from 'react';
import { gql, useSubscription } from '@apollo/client';
import { experimental_useSubscription } from 'react';
const NEW_MESSAGE = gql`
subscription NewMessage {
newMessage {
id
content
author
}
}
`;
function Chat() {
const { data, error } = useSubscription(NEW_MESSAGE);
const subscriptionConfig = {
create: () => {
return {
getCurrentValue: () => data,
subscribe: (callback) => {
if (data) {
callback(data);
}
return () => {}; // No explicit unsubscribe needed with Apollo
},
};
},
};
const latestMessage = experimental_useSubscription(subscriptionConfig);
if (error) return Error subscribing: {error.message}
;
if (!latestMessage) return Loading...
;
return (
New Message: {latestMessage.newMessage.content} - {latestMessage.newMessage.author}
);
}
export default Chat;
μ€λͺ
- μ΄ μ½λλ
@apollo/client
λ₯Ό μ¬μ©νμ¬NEW_MESSAGE
λΌλ GraphQL ꡬλ μ μμ±ν©λλ€. - Apollo Clientμ
useSubscription
ν μ ꡬλ λ‘μ§μ μ²λ¦¬νκ³ μ΅μ λ°μ΄ν°μ μ€λ₯λ₯Ό μ 곡ν©λλ€. experimental_useSubscription
ν μsubscriptionConfig
κ°μ²΄λ₯Ό λ°μ΅λλ€.subscriptionConfig
μcreate
λ©μλλgetCurrentValue
μsubscribe
ν¨μλ₯Ό κ°μ§ κ°μ²΄λ₯Ό λ°νν©λλ€.getCurrentValue
λ Apollo Clientλ‘λΆν° ꡬλ μ μ΅μ κ°μ λ°νν©λλ€.subscribe
λ μΌλ°μ μΌλ‘ ꡬλ μ μμνκ³ μ€μ§νλ λ‘μ§μ ꡬννλ ν¨μμ λλ€. Apollo Clientκ° κ΅¬λ μ μλμΌλ‘ μ²λ¦¬νλ―λ‘, μ΄ κ°μνλ μμμμλsubscribe
κ° λ°μ΄ν°κ° μμ κ²½μ° μ½λ°±μ νμ¬ λ°μ΄ν°λ‘ νΈμΆνκ³ λΉ ν¨μλ₯Ό λ°νν©λλ€.
κΈλ‘λ² μ ν리μΌμ΄μ μ μν λͺ¨λ² μ¬λ‘ λ° κ³ λ € μ¬ν
κΈλ‘λ² μ ν리μΌμ΄μ
μμ experimental_useSubscription
μ μ¬μ©ν λ λ€μ λͺ¨λ² μ¬λ‘λ₯Ό κ³ λ €νμΈμ.
1. λ°μ΄ν° νμ§ν
λ€μν μ§μμ μ¬μ©μμκ² μ΅μμ κ²½νμ μ 곡νκΈ° μν΄ λ°μ΄ν° μμ€κ° μ μ νκ² νμ§νλμλμ§ νμΈνμΈμ. μ¬κΈ°μλ λ€λ₯Έ μλ²μμ λ°μ΄ν°λ₯Ό κ°μ Έμ€κ±°λ μ½ν μΈ μ μ‘ λ€νΈμν¬(CDN)λ₯Ό μ¬μ©νμ¬ μ¬μ©μμκ² λ κ°κΉμ΄ κ³³μ λ°μ΄ν°λ₯Ό μΊμ±νλ κ²μ΄ ν¬ν¨λ μ μμ΅λλ€.
2. μκ°λ μ²λ¦¬
μκ°μ λ―Όκ°ν λ°μ΄ν°λ₯Ό λ€λ£° λλ μκ°λλ₯Ό μ¬λ°λ₯΄κ² μ²λ¦¬ν΄μΌ ν©λλ€. UIμ νμνκΈ° μ μ μκ°μ μ¬μ©μμ νμ§ μκ°λλ‘ λ³ννμΈμ.
3. ν΅ν λ³ν
μ ν리μΌμ΄μ μ΄ κ°κ²©μ΄λ κΈ°ν κΈμ΅ μ 보λ₯Ό νμνλ κ²½μ°, λ€λ₯Έ κ΅κ°μ μ¬μ©μλ₯Ό μν΄ ν΅ν λ³ν μ΅μ μ μ 곡νμΈμ.
4. λ€νΈμν¬ μ§μ° μκ°
λ€νΈμν¬ μ§μ° μκ°μ΄ μ ν리μΌμ΄μ μ±λ₯μ λ―ΈμΉλ μν₯μ κ³ λ €νμΈμ. μΊμ± λ° ν리νμΉκ³Ό κ°μ κΈ°μ μ μ¬μ©νμ¬ λ€νΈμν¬λ₯Ό ν΅ν΄ μ μ‘ν΄μΌ νλ λ°μ΄ν°μ μμ μ΅μννμΈμ.
5. μ κ·Όμ±
μ₯μ κ° μλ μ¬μ©μκ° μ ν리μΌμ΄μ μ μ κ·Όν μ μλλ‘ λ³΄μ₯νμΈμ. μλ§¨ν± HTMLμ μ¬μ©νκ³ , μ΄λ―Έμ§μ λν λ체 ν μ€νΈλ₯Ό μ 곡νλ©°, μ ν리μΌμ΄μ μ΄ ν€λ³΄λλ‘ νμ κ°λ₯νλλ‘ νμΈμ.
6. 보μ
μμ ν μ½λ© κ΄νμ λ°λΌ 보μ μ·¨μ½μ μΌλ‘λΆν° μ ν리μΌμ΄μ μ 보νΈνμΈμ. μ¬μ©μ μ λ ₯μ μ΄κ· νκ³ , λ°μ΄ν°λ₯Ό κ²μ¦νλ©°, 보μ ν΅μ νλ‘ν μ½μ μ¬μ©νμΈμ.
7. ν μ€νΈ
μ ν리μΌμ΄μ μ΄ λ€μν νκ²½κ³Ό λ€λ₯Έ λ°μ΄ν° μΈνΈμμ μ¬λ°λ₯΄κ² μλνλμ§ μ² μ ν ν μ€νΈνμΈμ. λ¨μ ν μ€νΈ, ν΅ν© ν μ€νΈ, μ’ λ¨ κ° ν μ€νΈλ₯Ό μ¬μ©νμ¬ μ½λμ κΈ°λ₯μ κ²μ¦νμΈμ.
experimental_useSubscriptionμ λμ
experimental_useSubscription
μ λΉλκΈ° λ°μ΄ν°λ₯Ό κ΄λ¦¬νλ κ°λ ₯ν λ°©λ²μ μ 곡νμ§λ§, νΉμ μ¬μ© μ¬λ‘μ λ μ ν©ν μ μλ λ체 μ κ·Όλ²μ μκ³ μλ κ²μ΄ μ€μν©λλ€.
1. useEffectμ useState
κΈ°μ‘΄μ useEffect
μ useState
ν
μ μ¬μ©νμ¬ λ°μ΄ν°λ₯Ό κ°μ Έμ€κ³ UIλ₯Ό μ
λ°μ΄νΈν μ μμ΅λλ€. μ΄ μ κ·Ό λ°©μμ λ λ§μ μλ μμ
μ΄ νμνμ§λ§, κ°λ¨ν λ°μ΄ν° κ°μ Έμ€κΈ° μλ리μ€μλ λ μ ν©ν μ μμ΅λλ€.
2. μν κ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬ (Redux, Zustand, Recoil)
μν κ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬λ μ ν리μΌμ΄μ μνλ₯Ό μ€μμμ κ΄λ¦¬νλ λ°©λ²μ μ 곡ν©λλ€. μ΄λ¬ν λΌμ΄λΈλ¬λ¦¬μλ μ’ μ’ λ°μ΄ν° λ³κ²½μ ꡬλ νκ³ UIλ₯Ό μλμΌλ‘ μ λ°μ΄νΈνλ λ©μ»€λμ¦μ΄ ν¬ν¨λμ΄ μμ΅λλ€.
3. React Queryμ SWR
React Queryμ SWRμ λ°μ΄ν° κ°μ Έμ€κΈ°, μΊμ±, μ λ°μ΄νΈλ₯Ό μν μΈκΈ° μλ λΌμ΄λΈλ¬λ¦¬μ λλ€. μ΄ λΌμ΄λΈλ¬λ¦¬λ€μ λΉλκΈ° λ°μ΄ν°λ₯Ό κ΄λ¦¬νκΈ° μν μ μΈμ APIλ₯Ό μ 곡νλ©° λ°μ΄ν° κ°μ Έμ€κΈ°μ κ΄λ ¨λ λ§μ 볡μ‘μ±μ μλμΌλ‘ μ²λ¦¬ν©λλ€.
κ²°λ‘
experimental_useSubscription
μ Reactμμ λΉλκΈ° λ°μ΄ν° κ΄λ¦¬μ λ°μν μ¬μ©μ μΈν°νμ΄μ€ κ΅¬μΆ κ³Όμ μ λ¨μνν μ μλ μ λ§ν μ ν
μ
λλ€. λ°μ΄ν° μμ€λ₯Ό ꡬλ
νκ³ λ³κ²½μ΄ λ°μν λ UIλ₯Ό μλμΌλ‘ μ
λ°μ΄νΈνλ μ μΈμ μΈ λ°©λ²μ μ 곡ν¨μΌλ‘μ¨, μ΄ ν
μ μ ν리μΌμ΄μ
μ±λ₯μ κ°μ νκ³ , μμ©κ΅¬ μ½λλ₯Ό μ€μ΄λ©°, κ°λ°μ κ²½νμ ν₯μμν€λ λ° λμμ΄ λ μ μμ΅λλ€. κ·Έλ¬λ μμ§ μ€νμ μ΄λΌλ μ μ κΈ°μ΅νλ κ²μ΄ μ€μν©λλ€. λ°λΌμ μ μ¬μ μΈ API λ³κ²½μ λλΉνκ³ μ μ€νκ² μ¬μ©ν΄μΌ ν©λλ€. νλ‘μ νΈμ νΉμ μꡬ μ¬νμ λ°λΌ λ°μ΄ν° κ°μ Έμ€κΈ° λ° μν κ΄λ¦¬λ₯Ό μν λ체 μ κ·Ό λ°©μμ κ³ λ €νμΈμ.
μ΄ κ°μ΄λμ μ€λͺ
λ λͺ¨λ² μ¬λ‘λ₯Ό λ°λ₯΄λ©΄ experimental_useSubscription
μ ν¨κ³Όμ μΌλ‘ νμ©νμ¬ μ μΈκ³ μ¬μ©μμκ² μνν μ¬μ©μ κ²½νμ μ 곡νλ ν¨μ¨μ μ΄κ³ λ°μμ μΈ κΈλ‘λ² μ ν리μΌμ΄μ
μ ꡬμΆν μ μμ΅λλ€.