Implement Child Client
WRP์ ๋ ๊ฐ์ง์ ํต์ ๋ฐฉ๋ฒ
Web์์ WRP๋ฅผ ์ด์ฉํ ํต์ ์ ํ๋ ๋ฐฉ๋ฒ์ ๋ ๊ฐ์ง๊ฐ ์์ต๋๋ค.
- ๋ค์ดํฐ๋ธ ์ฑ์ด ์ ๊ณตํ๋ ์ ์ญ ๊ฐ์ฒด ์ฌ์ฉ: ์ฑ๊ณผ ์น๋ทฐ๊ฐ ํต์ ํ ๋ ์น๋ทฐ๊ฐ ์ฌ์ฉํ๋ ๋ฐฉ์์ ๋๋ค.
- iframe์ postMessage ์ฌ์ฉ: ์ฑ๊ณผ ์น๋ทฐ๊ฐ ํต์ ํ๋ ์ํฉ์ ๋ชจ๋ฐฉํด์ผ ํ๋ ํ ์คํธ๋ฅผ ๊ตฌํํ๊ธฐ์ ์ ํฉํ ๋ฐฉ์์ ๋๋ค.
๋ฐ๋ผ์ ์ด๋ฒ ์์ ์์๋ iframe์ผ๋ก ์ฑ๊ณผ ์น๋ทฐ๋ฅผ ๋ชจ๋ฐฉํ๋ ๋ฐฉ์์ ์ฌ์ฉํ๊ฒ ์ต๋๋ค.
์ฑ๊ณผ ์น๋ทฐ ์ฌ์ด์ ๊ด๊ณ๋ฅผ iframe ๋ด์์๋ ๋ถ๋ชจ ์๋์ฐ(parent window)-์์ ์๋์ฐ(child window; iframe ๋ด๋ถ์ ์๋์ฐ)๋ก ๋ํ๋ผ ์ ์์ต๋๋ค.
์ด๋ฒ ์น์ ์์๋ ์์ ์๋์ฐ์ ํด๋ผ์ด์ธํธ๋ฅผ ๊ตฌํํด๋ณด๊ณ , ๋ค์ ์น์ ์์ ๋ถ๋ชจ ์๋์ฐ์ ์๋ฒ๋ฅผ ๊ตฌํํจ์ผ๋ก์จ iframe ์์ ๋ฅผ ์์ฑํด๋ณด๊ฒ ์ต๋๋ค.
์์์ ํด๋ผ์ด์ธํธ(๊ฒ์คํธ) ๋ง๋ค๊ธฐ
์ผ๋จ ์ ๋นํ Client.tsx
๋ฅผ ์ค๋นํด์ค๋๋ค. ์์ ๋ง๋ proto
์ generated
๋๋ ํ ๋ฆฌ๊ฐ ์๋ ํ๋ก์ ํธ ๋ฃจํธ๋ผ๊ณ
๊ฐ์ ํ๊ฒ ์ต๋๋ค.
import React from "react";
const Client = () => {
return (
<>
<div>Hello world!</div>
</>
);
};
export default Client;
ํด๋ผ์ด์ธํธ๋ฅผ ๋ง๋ค๊ธฐ ์ํด์๋ useClientImpl
hook์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
importํ ํ clientImpl
์ ์ค๋นํด์ฃผ์ธ์.
import React from "react";
+ import { useClientImpl } from "@pbkit/wrp-jotai/parent";
const Client = () => {
+ const clientImpl = useClientImpl();
return (
<>
useClientImpl
์ client๋ฅผ ๊ตฌํํ๋ ๋ฐ์ ํ์ํ ์์ผ๊ณผ ์ฑ๋ ๊ฐ์ ์ ์์ค ์์๋ค์ ๋ง๋ ๋ค, clientImpl
์
๋ฐํํฉ๋๋ค.
client๋ ์ด๋ค ๊ฒ(์๋น์ค)์ ์ด๋ป๊ฒ(ํต์ ๋ฐฉ๋ฒ) ๋ณด๋ผ์ง ์์์ผ ๋ง๋ค ์ ์์ต๋๋ค. clientImpl
์ ํต์ ๋ฐฉ๋ฒ(WRP ์ฑ๋)์ ๋ํ
์ ๋ณด๋ง ์๊ณ ์๋ client์ ์ผ๋ถ๋ถ์
๋๋ค. ์๋น์ค๊ฐ ๋ด๊ณ ์๋ ๋ฉ์๋ ์ ๋ณด๋ค์ ๋ฃ์ด์ฃผ๋ฉด ์์ฑ๋ client๋ฅผ ์ป์ ์ ์๋ ๊ฒ์
๋๋ค. ์๋น์ค
์ ๋ณด๋ ์ฐ๋ฆฌ๊ฐ ์ด์ ๋จ๊ณ์์ ์์ฑํ ์ฝ๋์์ ์ป์ด์ฌ ์ ์์ต๋๋ค.
import React, { useMemo } from "react";
import { useClientImpl } from "@pbkit/wrp-jotai/parent";
+ import { createServiceClient } from '../generated/services/pbkit/wrp/example/WrpExampleService';
const Client = () => {
const clientImpl = useClientImpl();
+ const serviceClient = useMemo(() => {
+ if (!clientImpl) return;
+ return createServiceClient(clientImpl);
+ }, [clientImpl]);
return (
<>
์์ฑ๋ ์๋น์ค ์ฝ๋์์ createServiceClient
๋ฅผ ์ด์ฉํด serviceClient
๋ฅผ ๋ง๋ค์์ต๋๋ค.
serviceClient
๋ฅผ ์
๋ ฅํด๋ณด๋ฉด ์ฐ๋ฆฌ๊ฐ ์ ์ํ ๋ rpc๊ฐ ์ถ๋ก ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค!
์ด์ ๋ฒํผ์ ์ถ๊ฐํ๊ณ , ๋ฒํผ์ ๋๋ ์ ๋ GetTextValue
๋ฅผ ํธ์ถํ ๋ค ๋ฐ์ ๊ฐ์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ๋์ ๋ด
์๋ค.
const Client = () => {
+ const [result, setResult] = useState<string>();
const clientImpl = useClientImpl();
const serviceClient = useMemo(() => {
if (!clientImpl) return;
return createServiceClient(clientImpl);
}, [clientImpl]);
+ const onClick = async () => {
+ setResult((await serviceClient?.getTextValue({}))?.text);
+ };
return (
<>
+ <button onClick={onClick}>Click me!</button>
+ {result && <p>Result: {result}</p>}
</>
);
};
๋ฒํผ์ ๋๋ฌ๋ณด๋ฉด ๊ฒฐ๊ณผ๋ก undefined๊ฐ ๋จ๊ฒ ๋ฉ๋๋ค. rpc๋ฅผ ์ ๊ณตํ๋ ์๋ฒ(ํธ์คํธ)๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋น์ฐํ ๊ฒฐ๊ณผ์ ๋๋ค. ์ด์ ํธ์คํธ๋ฅผ ๊ตฌํํด๋ณด๊ฒ ์ต๋๋ค.
์ด๋ฒ ์น์ ์์ ๊ตฌํํ ๋ด์ฉ์ ์๋์์ ํ์ธํด๋ณด์ธ์!