๐ฑ 26๋ 2์ ํ๊ณ
๋ค์ด๊ฐ๋ฉฐโ
2์์ ๋์๋ณด๋ฉฐ, ์ค๋ ์ฐํด์ ํฐ์ง ๊ฒฐ์ ์ฅ์ ๋ถํฐ, ๋ธ๋ผ์ฐ์ ๊ฐ ์ธ์ฆ ์ฐ๋ ๋ฒ๊ทธ๊น์ง ์์์น ๋ชปํ ๋ฌธ์ ๋ค์ ๋ง๋ฌ๊ณ , ๊ทธ๋๋ง๋ค ์๋์ ์ผ๋ก ์กฐ๊ธ ๋ ๊น์ด ํ์ ํด๋ณด๋ ๋ ธ๋ ฅ์ ํ๋ค.
AI ๋๋ถ์ ๋ณธ์ง์ ๋น ๋ฅด๊ฒ ํ์ ํ ์ ์์ด์ ์ ์ฉํ์ง๋ง, ๋ฌธ์ ์ ๋ณธ์ง์ด๋ผ๊ณ ์๊ฐํ ๊ฒ ๋ณธ์ง์ด ์๋ ์ ์๊ธฐ์ ๊ณ์ ๊ณต๋ถํด์ผ ํจ์ ๋๋ ํ ๋ฌ์ด์๋ค.
๋์ด์ผ๋ณด๋ฉด, ๊ทธ ๊ณผ์ ์์์ ๊ณ ๋ฏผ๋ค์ด 2์์ ๊ฐ์ฅ ํฐ ์์ฐ์ด ๋ ๊ฒ ๊ฐ๋ค. 2์์๋ ํฌ๊ฒ ์ธ ๊ฐ์ง ์ฌ๊ฑด๋ค์ด ์์๋ค.
- ์ค๋ ๊ฒฐ์ ์ฅ์ ๋์ โ ์ฌํ๋ฆฌ์์ ๊ฒฐ์ ์๋ฃ ํ์ด์ง๊ฐ ํฐ ํ๋ฉด์ผ๋ก ๋จ๋ ๋ฌธ์ ๋ฅผ ๊ธด๊ธ ๋์
- ์น-์ง๋ ์ธ์ฆ ์ฐ๋ ํธ๋ฌ๋ธ์ํ โ ์ฌํ๋ฆฌ/ํฌ๋กฌ์์ ํ์๊ฐ์ ํ ์ง๋์ ์ธ์ฆ์ด ๋ฐ์๋์ง ์๋ ๋ฌธ์
- UI ์ ์์ผ๋ก ๋ฌธ์์จ ๊ฐ์ โ ๊ฐ๋ฐ์๊ฐ ๋จผ์ ๊ณ ๊ฐ ๋ถํธ์ ๋ฐ๊ฒฌํ๊ณ , ์์ UI ๋ณ๊ฒฝ์ผ๋ก ์น ๋ฌธ์๋ฅผ ๊ฐ์์ํจ ๊ฒฝํ
๋จผ์ 3๊ฐ์ง ๋ฌธ์ ๋ฅผ ๋ ์ฝ๊ฒ ์ดํดํ๊ธฐ ์ํด ์คํ๋ฅํฐ์น์ ํ์ฌ ์ํฉ์ ์์๋ณด๊ณ 3๊ฐ์ง์ ๋ฌธ์ ๋ฐ ํด๊ฒฐ ๊ณผ์ ์ ์ดํด๋ณด๊ณ ๋ง๋ฌด๋ฆฌํ๊ณ ์ ํ๋ค.
์คํ ๋ฅํฐ ์น์ ํ์ฌ ์ํฉโ
์คํ๋ฅํฐ ์น์ Flutter-web์์ Next.js๋ก ๋ง์ด๊ทธ๋ ์ด์ ์ค์ ์๋ค. ๊ทธ๋์ ๋ฐ์ํ ๋ฌธ์ ๋ค์ด์๋ค.
ํ์ฌ ๊ตฌ์กฐ๋ฅผ ๋จ์ํํ๋ฉด ์ด๋ ๋ค.
- Next.js๊ฐ ๋ถ๋ชจ iframe์ผ๋ก ๋ฐ๊นฅ์ ๊ฐ์ธ๊ณ ์๋ค.
- Next.js์ ์์ iframe์ผ๋ก Flutter-web์ด ๋ค์ด๊ฐ ์๋ค.
- Flutter-web์ ์์ iframe์ผ๋ก React ์ปดํฌ๋ํธ๊ฐ ๋ค์ด๊ฐ ์๋ค.

์๋๋ Flutter-web <-> react ์๋๋ฐ ์์ ์ด๋ฏธ์ง์ ๊ฐ์ด Next.js <-> Flutter-web <-> react ๋ก ๋ณ๊ฒฝ๋๋ค.
์ด ๊ตฌ์กฐ๊ฐ ์ฃผ๋ ์ด์ ์ SEO๋ฅผ ๋ณ๋ ฌ์ ์ผ๋ก ์ฑ๊ธธ ์ ์๋ค๋ ๊ฒ์ด์๋ค. ๋๋ฉ์ธ ๋ณ๋ก ์กฐ๊ธ์ฉ Next.js๋ก ์ปดํฌ๋ํธ๋ฅผ ๊ตฌํํ์ฌ ๊ฐ์๋ผ์ฐ๋ฉด ๋๋ ํ๊ฒฝ์ ๊ตฌ์ถํ ์ ์์๋ค.
๋์ ์ด๋ ค์๋ ์กด์ฌํ๋ค. ํ๋์ ๊ธฐ๋ฅ์ ๋ง๋ค ๋๋ ์ฌ๋ฌ ๊ฐ์ง ๊ณ ๋ คํด์ผ ํ ๊ฒ ๋ง์๋ค. ์๋ฅผ ๋ค์ด ๋ธ๋ผ์ฐ์ ์ ํ์คํ ๋ฆฌ ์คํ ๋ฐ ์ํธ ์์ฉ์ด๋ค. ๋ฌด์๋ณด๋ค... ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ง ์ด์์๋ค. iframe๊ณผ PostMessage API๋ฅผ ์ฌ์ฉํ์ฌ ์ด ํ๊ฒฝ์ ๊ตฌ์ถํ๋๋ฐ Safari์์ ๋ฉ์์ง๊ฐ ๋ณด๋ด์ง์ง ์๋๋ค๊ฑฐ๋?! ๊ทธ๋ฐ ๊ฒฝ์ฐ๊ฐ ์ฆ์๋ค.
Safari๋ ITP(Intelligent Tracking Prevention) ๊ฐ์ ์ ์ฑ ์ผ๋ก iframe ๋ด๋ถ์ ์คํ ๋ฆฌ์งยท์ฟ ํคยท๋ค๋น๊ฒ์ด์ ์ ํฌ๋กฌ๋ณด๋ค ํจ์ฌ ์๊ฒฉํ๊ฒ ์ ์ดํ๋ ๊ฒ์ ์์๋ค. ๋๊ฐ์ ์ฝ๋๊ฐ ํฌ๋กฌ์์ ๋ฉ์ฉกํ ๋๋ค๊ฐ ์ฌํ๋ฆฌ์์ ์กฐ์ฉํ ๋ฉ์ถ๋ ์ผ์ด ์ด ๊ฒฝ๊ณ์์ ์๊ฒผ๋ค... ์ด๋ฐ ๋ฌธ์ ๊ฐ ๊ฐ์ฅ ํด๊ฒฐํ๊ธฐ ๋๊ฐํ๊ณ ์๋์์ ์ดํด๋ณผ ๋ฌธ์ ๋ค์ ์ฃผ๋ ์์ธ์ด ๋์๋ค.
์ด์ 3๊ฐ์ง ๋ฌธ์ ๋ฐ ํด๊ฒฐ ๊ณผ์ ์ ๊ฐ๋จํ๊ฒ ์ดํด๋ณด๋ ค๊ณ ํ๋ค.
1. ์ค๋ ์ ๊ฐ์๊ธฐ ๋ฆฌํฌํธ ๊ฒฐ์ ๊ฐ ์๋๋ค๋ ๋ฌธ์๊ฐ!?โ
๋จผ์ ์คํ๋ฅํฐ์ ๋ฆฌํฌํธ๋ ๋ฌด์์ธ๊ฐ? ์ดํด๋ณด๊ณ ์ ํ๋ค. ๋ง์ ๊ด์ฌ ๋ถํ๋๋ฆฝ๋๋ค!

์คํ๋ฅํฐ ๋ฆฌํฌํธ ์๋น์ค๋ ์ฌ์ฉ์๊ฐ ์๊ธธ ์ํ๋ ์ ์ง์ ์์ ์ ๋ณด๋ฅผ ์กฐํฉํด ๊ฐ์์ ๋์์ด ๋๋ ์ธ์ฌ์ดํธ๋ฅผ ์ ๊ณตํ๋ ์คํ๋ฅํฐ์น์ ์ ๋ฃ ์๋น์ค๋ค. ๊ทธ๋ฐ๋ฐ ํํ ์ค๋ ์ฐํด์ "๋ฆฌํฌํธ๋ฅผ ๊ฒฐ์ ํ๋๋ฐ ์ ๋ณด์ธ๋ค"๋ ๋ฌธ์๊ฐ ๋น๋ฐ์ณค๋ค. ์๋ฌดํผ ๊ธด๊ธ ๋์์ด ํ์ํ๊ณ , ๋ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ๋์ํ๋ค.

- ๊ฒฐ์ ํ์ง๋ง ๋ฆฌํฌํธ๊ฐ ๋ณด์ด์ง ์๋ ๊ณ ๊ฐ์ ํ๋ถ ์ฒ๋ฆฌ๋ฅผ ๋์๋๋ ธ๋ค.
- ๊ฒฐ์ ํ์ง๋ง ๋ฆฌํฌํธ๊ฐ ๋ณด์ด์ง ์๋ ๊ณ ๊ฐ ์ค ๋ฐ๋์ ๋ฆฌํฌํธ๋ฅผ ๋ด์ผ๋ง ํ๋ ๊ณ ๊ฐ์ ์ด๋๋ฏผ ๊ถํ์ผ๋ก ์คํ๋ฅํฐ ์น์ ์ ๊ทผํด ํด๋น ์ง์ญ ๋ฆฌํฌํธ๋ฅผ PDF๋ก ๋ฝ์ ๋ฉ์ผ๋ก ์ง์ ์ ๋ฌ
ํด๋น ์์ธ ํ์ โ
ํด๋น ๋ฌธ์ ๋ ๋ฆฌํฌํธ ์์ธ์์ ๋ง์ด๊ทธ๋ ์ด์ ์ดํ ๋ฐ์ํ ๋ฌธ์ ์๋ค. ๋ง์ด๊ทธ๋ ์ด์ ์ ๋ถ์์ฉ์ด๋ผ๊ณ ๋ณผ ์๋ ์๋๋ฐ ์ด๋ฐ ๋ถ๋ถ์ด ์ด๋ ค์ ๋ค... ์๋ฌด๋ฆฌ ํ ์คํธ ์ฝ๋๊ฐ ์์ด๋ ์ปค๋ฒํ๊ธฐ ์ฝ์ง ์์๋ค. ํ ์คํธ ์ผ์ด์ค๋ฅผ ๊ผผ๊ผผํ ์์ฑํ์ง ์์๋ ๋ด๊ฐ ๋ฌธ์ ์์ ์ ์๊ณ ํ ์คํธ ์ฝ๋๋ก ์ธ๋ถ SDK๋ฅผ ๊ฒ์ฆํ๋๊ฒ ์ด๋ ค์ด ๊ฒ์ผ ์ ์๊ฒ ๋ค๋ ์๊ฐ์ด ๋ ๋ค.
๋ณ๊ฒฝ๋ UI๋ ์๋์ ๊ฐ๋ค.
- ASIS (Flutter-web ๋ฆฌํฌํธ ์์ธ)

- TOBE (Next.js ๋ฆฌํฌํธ ์์ธ)

๊ธํ ๋ง์์ ์ฐ์ ์๋์ ํ ์ค์ ํ๋ฌํฐ์น ์ฝ๋์์ ์ถ๊ฐํด์ ๊ฐ์ ๋ก ํด๋น ๊ฒฐ์ ์๋ฃ ํ์ด์ง๋ก ๋ฐ๋์ ์ด๋ํ๊ฒ ํ๋ค.
window.parent.postMessage({ type: "paymentResult", ... }, "*");
window.location.href = uri; // ๊ฐ์ ๋ก ํ์ด์ง ์ด๋ํ๋ ๋ก์ง์ ํ๋ฌํฐ์์ ์ถ๊ฐ! ๊ธฐ์กด์๋ Next.js์์ ํ์ด์ง ์ด๋ ์ฒ๋ฆฌ๋ฅผ ์งํ
๊ทธ๋ฐ๋ฐ ํ๊ณ ๋ฅผ ์์ฑํ๋ฉด์ ์ปค๋ฐ ํ์คํ ๋ฆฌ๋ฅผ ๋ค์ ๊บผ๋ด๋ณด๋, ๊ตฌ์กฐ์ ์ผ๋ก ํ์ด์ง๋ฅผ ์ด๋์ํค๋ ์ฃผ์ฒด์ ๋ณ๊ฒฝ์ผ๋ก ํด๊ฒฐํ ๋ฌธ์ ์๋ค.
- ์์(Flutter
iamport.js): ๊ฒฐ์ ์ฑ๊ณต โwindow.parent.postMessage๋ก ๋ถ๋ชจ์ ๊ฒฐ๊ณผ๋ง ์ ๋ฌ. - ๋ถ๋ชจ(Next.js): ๋ฉ์์ง ์์ โ
router.push('/payment/complete?...')๋ก ๊ฒฐ์ ์๋ฃ ํ์ด์ง ๋ค๋น๊ฒ์ด์
ํ์ด์ง ์ด๋ ๋ก์ง์ ์ฑ ์์ ๋ถ๋ชจ(Next.js)๊ฐ ๊ฐ๊ณ ์์๋๋ฐ, ์์์ด์๋ ํ๋ฌํฐ์น์์๋ ๊ฒฐ์ ๋ถ๋ถ์์ ์ด๋ํ ์ ์๋๋ก ํ๋ค.
Flutter ์ธก iamport.js โ ์์์ด ์ค์ค๋ก ์ด๋ํ๋ ๋ก์ง ์ถ๊ฐ:
window.parent.postMessage({ type: "paymentResult", ... }, "*");
// Flutter ๊ฒฐ์ ์๋ฃ ํ์ด์ง๋ก ์ด๋ (WebTabIamportResult โ POST /report/region/payment ํธ์ถ)
window.location.href = uri;
Next.js ์ธก ์ค๋ฒ๋ ์ด ํ โ ๋ถ๋ชจ๊ฐ ํ๋ ๋ค๋น๊ฒ์ด์ ๋ก์ง ์ ๊ฑฐ:
- router.push(`/payment/complete?${query.toString()}`);
- router.refresh();
+ // Flutter๊ฐ iamport.js์์ ์ง์ /payment/complete ํ์ด์ง๋ก ์ด๋ํ๋ฏ๋ก
+ // Next.js๋ ๊ฒฐ์ ๋ชจ๋ฌ ์ค๋ฒ๋ ์ด๋ง ๋ซ์์ค
์กฐ๊ธ ๋ ์ ๋๋ก ์ดํดํ๊ธฐ ์ํด์ ์๋ฒ๊ฐ "๊ฒฐ์ ๋๋ค"๋ฅผ ์๊ฒ ๋๋ ํ์ด๋ฐ์ ๋ด์ผ ํ๋ค.
์ด๋ ๊ฒ ํด๊ฒฐํ ์ ์์๋ ์ด์ ๋ ์๋ฒ์์ ๊ฒฐ์ ์๋ฃ๋ฅผ ์์์ฐจ๋ฆฌ๋ ํ์ด๋ฐ์ด Flutter ์ชฝ WebTabIamportResult ์์ ฏ์ด ํ๋ฉด์ ๋ง์ดํธ๋ ๋
Riverpod (ํ๋ฌํฐ์ ์ ์ญ ์ํ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ, zustand๊ณผ ๊ฐ๋ค) ์ postReportPaymentProvider๊ฐ ์ฌ์ฉ๋๊ณ ,
์ฌ๊ธฐ์ POST /report/region/payment๊ฐ ํธ์ถ๋๋ค.
์ฆ ์๋ฒ๊ฐ ๊ฒฐ์ ์๋ฃ๋ฅผ ์๊ฒ ๋๋ ์์ ์ด Flutter ์์ ฏ์ด ํ๋ฉด์ ๋ง์ดํธ๋๋ ์๊ฐ์ ์ผ์ด๋๋ค. ์์ ฏ์ด ๋ง์ดํธ๋์ง ์์ผ๋ฉด ์๋ฒ๋ ๊ฒฐ์ ์ฌ์ค์ ๋ชจ๋ฅด๊ณ , ๊ณ ๊ฐ ์ ์ฅ์์๋ ๋์ ๋๊ฐ๋๋ฐ ๋ฆฌํฌํธ๊ฐ ์ ์ด๋ฆฌ๋ ์ํฉ์ด ๋๋ค.
2. ์คํ๋ฅํฐ ์น์์ ์ธ์ฆํ๋ฉด ์ง๋์ ๋ฐ์์ด ์ ๋๋ค?โ
๋ด์คํ๋ฅํฐ(Next.js)์ ํ์๊ฐ์ ๊ธฐ๋ฅ์ ๋ฐฐํฌํ ๋ค, ๋ฉฐ์น ํ ๋ฐ๊ฒฌ๋ ๋ฌธ์ ์๋ค. Next.js์์ ํ์๊ฐ์ /๋ก๊ทธ์ธ์ ํ๋ฉด ์น์ ์ ์์ธ๋ฐ, Flutter-web ์ง๋์๋ ์ธ์ฆ ์ํ๊ฐ ๋ฐ์๋์ง ์์๋ค. ๋ถ๋ช QA๋ฅผ ํ๋๋ฐ ๋์ณค๋ค... ์์ฌ์ด ๋ง์์ด ์ปธ๋ค.
๋ถ๋ชจ-์์ ์ฌ์ด ์ธ์ฆ ์ํ ๋๊ธฐํ๊ฐ ๋น ์ ธ ์์๋ค.โ
Next.js(๋ถ๋ชจ)์์ ๋ก๊ทธ์ธ์ด ์ผ์ด๋๋, Flutter-web(์์ iframe)์ด ๊ทธ ์ฌ์ค์ ์์์ผ ์ง๋๊ฐ ์ธ์ฆ ์ํ๋ก ๋์ํ๋ค. ์ด ๋ก์ง์ด ๋ถ๋ช ํ ์๊ธด ํ๋๋ฐ ์ ๋๋ก ๋์ํ์ง ์์๋ค.
ํด๋น ๋ฌธ์ ์ ์์ธ์ ๋์ํ ํด๋ณด์๋ค.

๊ทผ๋ณธ ์์ธ: Safari iframe์์ FlutterSecureStorage๊ฐ ๋ฉ์ถ๋ ๊ฒ ์์ธ์ด์๋ค.โ
๋๋ฒ๊น ๊ณผ์ ์์ ์๊ฒ ๋ ์์ธ์ ์ด๋ฌ๋ค.
- Next.js์์ ํ์๊ฐ์
โ
postMessage๋ก Flutter-web์ ํ ํฐ ์ ๋ฌ - Flutter-web์ด ํ ํฐ์
FlutterSecureStorage์ ์ ์ฅ ์๋ FlutterSecureStorage์ ์น ๊ตฌํ์ฒด๋ ๋ด๋ถ์ ์ผ๋ก WebCrypto + IndexedDB๋ฅผ ์ฌ์ฉ- Safari์ ITP๊ฐ iframe ๋ด third-party IndexedDB ์ ๊ทผ์ ํํฐ์ ๋ ์ฒ๋ฆฌ
crypto.subtle์ ๊ทผ์ด ์ฐจ๋จ๋๋ฉด Promise๊ฐ resolve/reject ์์ด ๋ฌดํ ๋๊ธฐ(hang)- ๊ฒฐ๊ณผ: ํ ํฐ ์ ์ฅ ์คํจ โ API ํธ์ถ ์ ์ธ์ฆ ํค๋ ์์ โ ์ง๋์ ์ธ์ฆ ์ํ ๋ฏธ๋ฐ์
ํฌ๋กฌ์ iframe ๋ด third-party storage ์ ๊ทผ์ Safari๋งํผ ์๊ฒฉํ ์ ํํ์ง ์๊ธฐ ๋๋ฌธ์, ํฌ๋กฌ์์๋ ๋ฌธ์ ๊ฐ ์ฌํ๋์ง ์์๋ค.
ํด๊ฒฐ: FlutterSecureStorage โ ์ธ๋ฉ๋ชจ๋ฆฌ ํ ํฐ์ผ๋ก ์ ํโ

๋ชจ๋ ๊ณณ์์ FlutterSecureStorage ์ง์ ์ฝ๊ธฐ๋ฅผ ์ ๊ฑฐํ๊ณ , AuthManager().opn_token์ ์ธ๋ฉ๋ชจ๋ฆฌ๋ก ์ ์ฅ/์ฝ๊ธฐํ๋๋ก ๋ณ๊ฒฝํ๋ค.
// Before: Safari iframe์์ hang ๋ฐ์
const storage = FlutterSecureStorage();
var opnToken = await storage.read(key: "OPN_OPNDOCTOR_KEY_AUTH_OPN_TOKEN");
// After: ์ธ๋ฉ๋ชจ๋ฆฌ ํ ํฐ ์ฌ์ฉ (Safari iframe์์ FlutterSecureStorage๊ฐ ๋ฉ์ถ ์ ์์ด ์ฌ์ฉํ์ง ์์)
var opnToken = AuthManager().opn_token;
๋์์ Next.js ์ชฝ์์๋ Flutter โ Next.js ๊ฐ ์ธ์ฆ ์ํ ์๋ฐฉํฅ ๋๊ธฐํ๋ฅผ
์ํ ๋ฉ์์ง ํธ๋ค๋ฌ(useAuthMessageHandlers)์ ์ธ์
๊ด๋ฆฌ ํฌ์ธํธ๋ฅผ ํ ๊ณณ์ ๋ชจ์ ๊ด๋ฆฌํ๋๋ก ํ๋ค.
3. ๊ฐ๋จํ UI/UX ๊ฐ์ ์๋โ
๊ณ ๊ฐ ์ ์ฅ์์ ๋ถํธํ ์ง์ ์ ๋ฐ๊ฒฌํ๋ฉด, ์ฌ์ํ๋๋ผ๋ ์ ์ํ๊ณ ๊ณ ์น๋ ํ๋๊ฐ ์ค์ํ๋ค๊ณ ์๊ฐํ๋ค. ์ ํํ ๋ฆฌ๋์ธ ์ฑ์ฑ๋์ ๋ง์๊ป ํ ๋ด์ ์๋ก์ด ๊ธฐ๋ฅ ๋ฐ UI/UX ๊ด๋ จํด์ ์ ๋ณดํ ์ ์๋ ๋ถ์๊ธฐ๋ฅผ ๋ง๋ค์ด์ฃผ์ ์ ๋๋ฌด ๊ฐ์ฌํ๋ค.
2์์๋ 2๊ฐ์ง UI ๊ฐ์ ์ ์ง์ ์ ์ํ๋ค. 3/4์์๋ ๋ ๋ง์ด ์ ์ํด๋ณด๋ ค๊ณ ํ๋ค.
์ฃผ๋ฏผ๋ฑ๋ก๋ฒํธ ์๋ด ํดํ ํ ์ค์ ํจ๊ณผโ
์น์์ ๋ฉดํ ์ธ์ฆ์ด ์ ๋ผ์๋ผ๋ ๋ฌธ์๊ฐ ๊ณ์ ๋ค์ด์๋ค... ์ฐ๋ฆฌ๋ ๋ฐ๋ก CSํ์ด ์์ด์ ๋ด๊ฐ ์ง์ ๋์ํ๊ณค ํ๋๋ฐ ๊ทธ ์์ธ์ ํ์ ํด๋ณด๋ ์ฃผ๋ฏผ๋ฑ๋ก๋ฒํธ๋ฅผ ์๋ชป ์ ๋ ฅํ ๊ฒฝ์ฐ ๋ฉดํ ์ธ์ฆ์ ๋ฌธ์ ๊ฐ ์๊ธด๋ค๋ ๊ฒ์ ๋ฐ๊ฒฌํ๋ค.

ํด๊ฒฐ ๋ฐฉ๋ฒ์ ๋ ๊ฐ์ง๋ก ๋๋ ์งํํ๋ค.
- ๊ทผ๋ณธ ํด๊ฒฐ: ๋ฉดํ ์ธ์ฆ API ์ ๊ณต ์ธ์ฃผ ์ ์ฒด์ ์์ธ์ฒ๋ฆฌ ์์ ์ ์์ฒญ
- ์ฆ์ ์กฐ์น: ์ฃผ๋ฏผ๋ฑ๋ก๋ฒํธ ์ ๋ ฅ๋์ ์ฌ๋ฐ๋ฅธ ํ์์ ์๋ดํ๋ ํดํ ์ถ๊ฐ โ ๋์์ด๋์ ๋ ผ์ํ์ฌ ๋ฐ๋ก ๋ฐ์

์นด์นด์คํก ๋ฌธ์ ๋น๊ต (ํดํ ์ ์ฉ ์ vs ํ)โ
ํจ๊ณผ๋ฅผ ๊ณต์ ํ๊ฒ ๋ณด๋ ค๋ฉด ๊ฐ์ ์กฐ๊ฑด์์ ๋น๊ตํด์ผ ํ๋ค. ์คํ๋ฅํฐ ์น์ ํ์๊ฐ์ ๊ธฐ๋ฅ์ด ํ๋ก๋์ ์ ๋ฐฐํฌ๋ ๊ฑด 1์ 19์ผ, ํดํ์ด ๋ฐ์๋ ๊ฑด 2์ 13์ผ์ด๋ค. ์ด ๋ ์์ ์ ๊ธฐ์ค์ผ๋ก ์นด์นด์คํก ์ฑ๋ ์๋ด ๋ฐ์ดํฐ๋ฅผ ์๋ผ๋ดค๋ค.
| ๊ตฌ๊ฐ | ๊ธฐ๊ฐ | ๊ด๋ จ ๋ฌธ์ ๊ฑด์ |
|---|---|---|
| ํดํ ์ ์ฉ ์ | 1/19 ~ 2/12 (25์ผ) | 7๊ฑด |
| ํดํ ์ ์ฉ ํ | 2/13 ~ 3/9 (25์ผ) | 4๊ฑด |
๊ฐ์ 25์ผ ๊ธฐ์ค์ผ๋ก ๋๊ณ ๋ณด๋ฉด ์ฝ 43% ๊ฐ์ํ๋ค. ์ ๋ ๊ฑด์๊ฐ ํฌ์ง ์์ง๋ง, ์ธ์ฃผ ์ ์ฒด์ ๊ทผ๋ณธ ์์ ์ด ๋ค์ด์ค๊ธฐ ์ ์์ ์กฐ์น๋ก์๋ ์ ์๋ฏธํ ๊ฐ์์๋ค๊ณ ๋ณธ๋ค.
๋ฌธ์ ์ง๊ณ ์ ์ฃผ์: ํค์๋("๋ฉดํ ์ธ์ฆ", "์ฃผ๋ฏผ๋ฑ๋ก๋ฒํธ" ๋ฑ)๋ก ๊ด๋ จ ๋ฌธ์๋ง ์ถ๋ ธ๊ณ , ์ค ์ฐํด ๊ธฐ๊ฐ(2/8~2/10)์ ๊ฒฐ์ ์ฅ์ ๋ฌธ์๊ฐ ๊ฒน์ณ ์์ด ๋ถ์ ์ ์ผ๋์ ๋๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก 3์์๋ ๋ฉดํ ์ธ์ฆ ๊ด๋ จํด์ ๋ฌธ์๊ฐ ๋ค์ด์ค์ง ์๊ฒ ๋๊ณ ๋์ ์๊ฐ์ ์๋ ์ ์๊ฒ ๋๋ค.
๋งค๋ฌผ ๋ชฉ๋ก ๋น ์ํ ๊ฐ์ โ
์๊ฒ ๋ ์น๊ตฌ์๊ฒ ์คํ๋ฅํฐ๋ฅผ ๋ณด์ฌ์ค ๊ธฐํ๊ฐ ์์๋ค. ๊ทธ๋ฐ๋ฐ ์๊ณ ๋ณด๋ ์น๊ตฌ ์๋ฒ์ง๊ฐ ์์ฌ์ ์ ํจ๊ป ์๋น์ค๋ฅผ ๋๋ฌ๋ณด๊ฒ ๋๋ค. ๊ทธ ์ํฉ๋ ์ง๊ธ ์๊ฐํด๋ณด๋ฉด ์๊ธด ์ํฉ์ด๋ค. ๊ทธ๋ฐ๋ฐ ์ง๋์์ ํน์ ์์น๋ก ์ด๋ํ์ ๋ "์๋ฌ๊ฐ ์๋ ๊ฒ ๊ฐ๋ค"๊ณ ๋ง์ํ์ จ๋ค... ๋ฃ๊ณ ์๊ฒํ์๋ค.
์ฝ๊ฐ ๊ฒฝ์ง๋ ์ํ๋ก ๋ค์ ์ดํด๋ณด๋ ์๋ฌ๋ ์๋์๋ค. ํด๋น ์์น์ ๋งค๋ฌผ์ด ์์ด์ "์ ์ฒด ๋งค๋ฌผ 0"์ด ํ์๋ ๊ฒ๋ฟ์ด์๋ค. ๊ธฐ๋ฅ์ ์ผ๋ก๋ ๋ฌธ์ ๋ ์์ง๋ง, ์ฌ์ฉ์ ์ ์ฅ์์๋ ๋ญ๊ฐ ์๋ชป๋ ๊ฒ์ฒ๋ผ ๋๊ปด์ง๋ ํ๋ฉด์ด์๋ค.
๊ทธ๋์ ๋จ์ํ ๋น ์ํ ๋ฉ์์ง๋ฅผ ๋ณด์ฌ์ฃผ๋ ๊ฒ์์ ํ ๋ฐ ๋ ๋์๊ฐ, ์ค์๊ฐ์ผ๋ก ๋งค๋ฌผ์ด ๊ฐ์ฅ ๋ง์ ์ง์ญ์ด๋ ์์์ด ๋ง์ ์์น๋ฅผ ์ถ์ฒํด์ ๋ฐ๋ก ์ด๋ํ ์ ์๋ ๊ธฐ๋ฅ์ ์ ์ํ๊ณ , ๋ฐ์๋์ด ๊ตฌํํ๋ค.

๋ฐฑ์๋ API๋ ๋ง๋ค์ด๋ณด์๋ค. ๋ก์ง์ ๋งค๋ฌผ ๋ฐ ์์์ด ๊ฐ์ฅ ๋ง์ ๋ 10๊ฐ๋ฅผ ๋ฐํํ๋ API์๋ค. ํด๋น API์ ํ๋ก ํธ UI๋ฅผ ์ฎ์ด ๊ตฌํํด๋ณด์๋ค.
๋ง๋ฌด๋ฆฌํ๋ฉฐโ
2์์ ๋ง๋ ์ฅ์ ๋ค์ ๋ชจ๋ iframe ์์์ ๋ถ๋ชจ-์์ ์ฌ์ด์ ํต์ ์ ๋ฐ๋ฅธ ํฌ๋ก์ค ๋ธ๋ผ์ฐ์ง ์ด์๋ก ๋ฐ์ํ๊ณ , ์ด๋ ดํ์ด ์๋ ๊ฐ๋ ์ ์ค์ ๋ฌธ์ ๋ฅผ ๋ง๋ ์๊ฒ ๋ ํ ๋ฌ์ด์๋ค. UI ๊ฐ์ ๊ฒฝํ์ ์ฝ๋ ๋ฐ๊นฅ์์๋ ์์ ๋ณํ๋ฅผ ๋ง๋ค์ด๋ผ ์ ์๋ค๋ ๊ฑธ ํ์ธํ๊ฒ ํด์คฌ๋ค. ํ๊ณ ๊ฐ 4์๊น์ง ๋ฐ๋ ธ์ง๋ง, ๊ทธ๋งํผ ์๊ฐ์ ๋๊ณ ๋ค์ ๋ณด๋ ๋ ๋๋ ท์ด ๋จ๋ ์ฌ๊ฑด๋ค์ด๋ค. 3์์๋ ์คํ๋ฅํฐ ์น ๋ง์ด๊ทธ๋ ์ด์ ์ ์ด๋ป๊ฒ ๋ง๋ฌด๋ฆฌ์ง์๋์ง ์ด์ด์ ์ ๋ฆฌํด๋ณด๋ ค ํ๋ค.
