μ¬λ¬ μλΉμ€κ° ν¨κ» μ°λ λκΈ°μ΄ ν΄λΌμ΄μΈνΈ μ€κ³νκΈ°
- #vwr
- #react
λ€μ΄κ°λ©°
μλ νμΈμ. λ Έλ¨Έμ€ νλ‘ νΈμλ κ°λ°μ μ§μλ―Όμ λλ€.
fromm μ€ν μ΄λ μν μ€νμ΄λ μ΄λ²€νΈ μ μ²μ²λΌ νΉμ μκ°μ μ¬μ©μκ° λͺ°λ¦΄ λ, μ¬μ©μλ₯Ό μ€ μΈμ λ€ μμλλ‘ μ
μ₯μν€λ λκΈ°μ΄ μμ€ν
(Virtual Waiting Room, μ΄ν VWR)μ μ¬μ©νκ³ μμ΅λλ€. λκΈ°μ΄μ νμλ‘ νλ μλΉμ€κ° λμ΄λλ©΄μ, μ¬λ΄ GitHub Packages(npm)μ νΌλΈλ¦¬μν΄ κ° μλΉμ€μμ 곡ν΅μΌλ‘ μ€μΉν΄ μ°λ ν¨ν€μ§(vwr-client2)λ‘ κ°λ°νκ² λμμ΅λλ€.
μ΄ κΈμμλ μ΄ ν¨ν€μ§λ₯Ό λ§λ μ΄μ μ μ€κ³ λ°©μμ 곡μ λλ¦¬κ² μ΅λλ€.
VWR Clientμ μ£Όμ κΈ°λ₯
VWR Clientλ λκΈ°μ΄ λ±λ‘λΆν° ν΄λ§(μν νμΈ), μ μ₯, μΈμ μ’ λ£κΉμ§μ νλ¦μ λ§‘κ³ μμ΅λλ€.
- λκΈ°μ΄ λ±λ‘:
POST /registerλ₯Ό ν΅ν΄ λκΈ°μ΄μ μ§μ ν©λλ€. - μν ν΄λ§:
POST /polling/{visitorId}λ‘ μλ²μ νμΈνλ©° μνλ₯Ό κ°±μ ν©λλ€ (pendingβwaitingβentered). - μ μ₯ λ° μ΄μ©: μμκ° λλ©΄ μλΉμ€λ₯Ό μ΄μ©ν©λλ€.
- μΈμ
μ’
λ£: μ΄μ©μ΄ λλλ©΄ ν΄λ§μ μ€λ¨νκ³
POST /endλ₯Ό νΈμΆν΄ μ리λ₯Ό λ°λ©ν©λλ€ (ended).
register POST /register
βΌ
ν΄λ§ 루ν POST /polling/{visitorId}
pending β waiting β entered
βΌ
end() ν΄λ§ μ€λ¨ β POST /end β ended
λ°°κ²½
κΈ°μ‘΄ ν΄λΌμ΄μΈνΈμ νκ³
κΈ°μ‘΄ ν΄λΌμ΄μΈνΈ(vwr-client)λ μ§κΈκ³Ό κ°μ core β react ꡬ쑰μμ΅λλ€. coreκ° λκΈ°μ΄ λ‘μ§μ λ΄λΉνκ³ , react ν¨ν€μ§κ° κ·Έ μμ ν
μ μ 곡νλ ννμ
λλ€.
νμ§λ§ VWRμ μ¬μ©νλ κ³³μ΄ λμ΄λλ©΄μ νκ³κ° λλ¬λ¬μ΅λλ€. νΈμΆνλ νλ©΄λ§λ€ νμν λμμ΄ λ¬λλλ°, κΈ°μ‘΄ react ν¨ν€μ§μ ν¨μλ§μΌλ‘λ μ΄λ₯Ό λμνκΈ° μ΄λ €μ κΈ° λλ¬Έμ λλ€. κ²°κ΅ κ°μ React μλΉμ€ μμμλ κ°μ coreλ₯Ό μ§μ μ΄μ©ν΄ 컀μ€ν ꡬνμ νκ² λμκ³ , coreλ λ‘μ§, reactλ κ³΅ν΅ ν μ΄λΌλ μ μ΄μ μ€κ³ λͺ©μ λλ‘ μ°μ΄μ§ λͺ»νμ΅λλ€.
μλ‘ λ§λ μ΄μ
ꡬ쑰λ κΈ°μ‘΄κ³Ό λμΌνκ² core β reactλ₯Ό μ μ§νλ, λ΄μ©μ μλ‘ κ΅¬μ±ν μ΄μ λ λ€μκ³Ό κ°μ΅λλ€.
- λ°±μλ API κ°νΈ: VWR API λ²μ μ μΌλ‘ μλν¬μΈνΈ, μν, μ μ₯ λ°©μμ΄ λ¬λΌμ Έ νλ‘ νΈμλλ λμ λμμ΄ νμνμ΅λλ€. μ΄λ² κΈ°νμ νΈν λ μ΄μ΄ λμ ν΄λΌμ΄μΈνΈλ₯Ό μλ‘ λ§λ€κΈ°λ‘ νμ΅λλ€.
- κ³΅ν΅ ν¨ν€μ§ν: ν둬 μλΉμ€μ μ€ν μ΄μ μ±λμ΄ λͺ¨λ Reactλ‘ κ°λ°λμ΄ μμ΄, λ μλΉμ€κ° 곡ν΅μΌλ‘ μΈ μ μλ ν¨ν€μ§κ° νμνμ΅λλ€.
- μ¬μ©μ± κ°μ : ν νλλ‘ μ΄λμλ μ½κ² μΈ μ μλλ‘ λ§λ€μ΄, μλΉμ€λ§λ€ λκΈ°μ΄ λ‘μ§μ μ€λ³΅ ꡬννλ μΌμ μμ κ³ μ νμ΅λλ€.
ꡬ쑰
ν¨ν€μ§λ μν μ λ°λΌ λλ‘ λΆλ¦¬νμ΅λλ€.
| ν¨ν€μ§ | μν |
|---|---|
| core | μλ² API νΈμΆ λ° λκΈ°μ΄ μν κ΄λ¦¬ (νλ μμν¬Β·λΌμ΄λΈλ¬λ¦¬μ μμ‘΄νμ§ μμ, λ°νμ μμ‘΄μ± 0κ°) |
| react | coreλ₯Ό Reactμμ μ½κ² μ°κΈ° μν μ΄λν° (VwrProvider, useVwr μ 곡) |
core: μλ² API νΈμΆκ³Ό μν κ΄λ¦¬
coreλ register, polling, end μμ²κ³Ό μν λ³νλ₯Ό λ§‘μ΅λλ€. Reactλ DOMμ μμ‘΄νμ§ μμ, λμ€μ λ€λ₯Έ νλ μμν¬λ λΌμ΄λΈλ¬λ¦¬λ‘ νμ₯νλλΌλ coreλ κ·Έλλ‘ μ¬μ¬μ©νκ³ μ΄λν°λ§ κ΅μ²΄νλ©΄ λ©λλ€.
// μ¬μ© μμ
const client = createVwrClient({baseUrl});
const session = client.register({roomId, view: 'counter'});
const unsubscribe = session.subscribe(state => render(state));
await session.end();
μΈμ
μ μν μ‘°ν, ꡬλ
(subscribe), μ’
λ£(end) μΈν°νμ΄μ€λ§ λ
ΈμΆνλ―λ‘ νλ μμν¬λ λΌμ΄λΈλ¬λ¦¬μ μν κ΄λ¦¬ λ°©μμ λ§μΆ° μ½κ² μ°κ²°ν μ μμ΅λλ€.
μνλ μλ²κ° λ΄λ €μ£Όλ κ°(pending, waiting, entered)μ, ν΄λΌμ΄μΈνΈκ° νλ©΄μ 그릴 λ νμν μνκ°(disconnected, ended, failed)μ μΆκ°ν΄ μ μνμ΅λλ€.
| μν | μλ―Έ |
|---|---|
| pending | λ±λ‘μ΄ λκΈ°μ΄μ μμ§ λ°μλμ§ μμ |
| waiting | λκΈ° μ€ (μλ² μ 보 ν¬ν¨) |
| entered | μ μ₯ κ°λ₯ |
| disconnected | μΌμ μ₯μ λ‘ μ¬μλ μ€ |
| ended | end()λ‘ μ μ μ’
λ£ |
| failed | μ€λ₯λ‘ μ’
λ£ (errorTypeμΌλ‘ μλ¬μ²λ¦¬) |
coreμ 4κ°μ§ λμ μμΉ:
- ν΄λ§ μ£ΌκΈ°λ μλ²κ° κ²°μ : ν΄λ§ κ°κ²©μ μλ² μλ΅μ
pollIntervalμ λ°λ¦ λλ€. - μ
μ₯ νμλ ν΄λ§ μ μ§: ν΄λ§μ΄ μλ²μ λ§λ£ μκ°(TTL)μ μ°μ₯νλ μν λ νκΈ° λλ¬Έμ, μ
μ₯ν λ€μλ ν΄λ§μ λ©μΆμ§ μμ΅λλ€. μΈμ
μ λλΌ λλ ν΄λ§μ λ¨Όμ λκ³
/endλ₯Ό νΈμΆν©λλ€. - μΈμ€ν΄μ€λΉ λ¨μΌ μΈμ
: κ°μ
roomIdλ‘ μ€λ³΅ λ±λ‘μ λ°©μ§ν©λλ€./registerλ μ¬μλνμ§ μλλ‘ μ€κ³νμ΅λλ€. - μλ¬ μΌμ΄μ€λ³ μ²λ¦¬: μλ²μμ λ΄λ €μ£Όλ μλ¬ μΌμ΄μ€λ³λ‘ μ²λ¦¬ν©λλ€.
react: React μλΉμ€ νκ²½μ μν μ΄λν°
μ± λ£¨νΈμ VwrProviderλ₯Ό μ μΈνκ³ νμν κ³³μμ useVwr ν
μ νΈμΆνλ ꡬ쑰λ‘, μ΄λμλ κ°μ λ°©μμΌλ‘ λκΈ°μ΄μ μ μ΄ν μ μλλ‘ νμ΅λλ€.
react μ¬μ© λ°©λ²
1. Provider λ±λ‘
import {VwrProvider} from '@knowmerce/vwr-client2-react';
<VwrProvider baseUrl="https://...">{children}</VwrProvider>
baseUrlμ νμμ΄λ©° 첫 λ λ κΈ°μ€μΌλ‘ κ³ μ λ©λλ€. Providerλ useState μ΄κΈ°νλ₯Ό ν΅ν΄ ν΄λΌμ΄μΈνΈλ₯Ό ν λ²λ§ μμ±νμ¬ μΈμ
μ€λ³΅ μ°Έμ¬λ₯Ό λ°©μ§ν©λλ€.
2. ν νΈμΆ (roomId, view)
const {state, register, end, clear} = useVwr(roomId, {view: 'counter'});
roomId: λκΈ°μ΄ λ°© ID (λκΈ°μ΄μ΄ μλ μνμ΄λ©΄undefinedλ₯Ό κ·Έλλ‘ λ겨λ λκ³ , μ΄λstateλnull)view: λκΈ° νλ©΄ μ ν (counterλλprogress)
| view | λκΈ° μ€(waiting) μν λ°μ΄ν° | νμ© μμ |
|---|---|---|
| counter | aheadCount, totalWaiting | βλ΄ μμ Nλͺ β λ± λκΈ° μΈμ νμ |
| progress | loadingMetric (μ§νλ₯ ) | μΈμ μ μμ΄ λ‘λ© λ° νμ |
3. μνμ λ°λ₯Έ νλ©΄ λΆκΈ°
function PurchaseButton({roomId}: {roomId?: string}) {
const {state, register, clear} = useVwr(roomId, {view: 'counter'});
const onClick = () => register();
useEffect(() => {
if (state?.status === 'entered') goToOrder();
}, [state?.status]);
if (state?.status === 'waiting' && state.view === 'counter') {
return <Waiting count={state.aheadCount} />;
}
if (state?.status === 'failed') {
return <ErrorView onClose={clear} />;
}
return <button onClick={onClick}>ꡬ맀νκΈ°</button>;
}
4. μ΄μ© μ’ λ£ μ end() νΈμΆ
end()λ ν΄λ§μ μ€λ¨νκ³ μλ²μ μ리λ₯Ό λ°λ©ν©λλ€. μ»΄ν¬λνΈκ° μΈλ§μ΄νΈλμ΄λ μΈμ
μ λλμ§ μμΌλ―λ‘, μ£Όλ¬Έ μλ£ μμ μ΄λ νλ©΄ μ΄ν μμ μ μ§μ νΈμΆν΄μΌ ν©λλ€.
register(): κΈ°μ‘΄ νμ± μΈμ μ¬μ¬μ©end(): μ°Έμ¬ μ’ λ£ λ° μνλ₯Όnullλ‘ μ΄κΈ°νclear():failedμνλ₯Ό μ΄κΈ°ν
λ§μΉλ©°
coreλ λΉμ¦λμ€ λ‘μ§μλ§ μ§μ€νκ³ , react ν¨ν€μ§λ React μ°λ μν λ§ νλλ‘ λΆλ¦¬νμ¬ μ μ§λ³΄μμ±κ³Ό νμ₯μ±μ λμμ΅λλ€. κ³΅ν΅ ν μ μ κ³΅ν΄ μλΉμ€λ§λ€ λκΈ°μ΄ λ‘μ§μ μ€λ³΅ ꡬννλ λ¬Έμ λ₯Ό μ€μ΄κ³ , μΌκ΄λ λ°©μμΌλ‘ μ°λν μ μλλ‘ νμ΅λλ€.
μ€μ μλΉμ€ μ μ© κ³Όμ μμ μ»μ μΈμ¬μ΄νΈλ λ€μ κΈμμ μ΄μ΄μ 곡μ νκ² μ΅λλ€.
κ°μ¬ν©λλ€.