Skip to main content

๐ŸŒฑ 25๋…„ 11์›” ํšŒ๊ณ 

16 min read
Ju young Lee
A contribution-driven developer

๋“ค์–ด๊ฐ€๋ฉฐโ€‹

img alt="autumn-night"

์ด๋ฒˆ 11์›”์„ ๋Œ์•„๋ณด๋ฉด ์˜คํ”ˆ๋‹ฅํ„ฐ์—์„œ ์ˆ˜์Šต์ด ๋๋‚œ ์ดํ›„, ๋ณธ๊ฒฉ์ ์œผ๋กœ ํ”„๋กœ๋•ํŠธ๋ฅผ ์•Œ๊ฒŒ ๋˜๋Š” ํ•œ๋‹ฌ์ด์—ˆ๋‹ค. ๋ ˆ๊ฑฐ์‹œ๋ฅผ ํ•œ์ค„ ํ•œ์ค„ ์ฝ์–ด๋ณด๋ฉฐ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์ด ์žˆ์—ˆ๋‹ค. dart๋กœ ๊ตฌํ˜„๋œ ์ฝ”๋“œ์ด์ง€๋งŒ ์–ธ์–ด ์•ˆ์— ์žˆ๋Š” ์˜๋ฏธ๋ฅผ ์ฐพ์•„๊ฐ€๋ฉฐ ์ดํ•ดํ•˜๋Š” ๊ณผ์ •์ด ์žฌ๋ฐŒ์—ˆ๋‹ค. ์ต์ˆ™ํ•œ ํ™˜๊ฒฝ์ด ์•„๋‹ˆ๋ผ ๋” ์ข‹์•˜๋˜ ๊ฒƒ ๊ฐ™๋‹ค.

์šฐ๋ฆฌ ํ”„๋กœ๋•ํŠธ๋Š” ์ „๊ฒฉ ๊ฐœํŽธ์„ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ๋‹ค. ํ”„๋กœ๋•ํŠธ ์‚ฌ์šฉ์„ฑ ๋ฌธ์ œ์™€ ์‚ฌ์šฉ์ž ์ฆ๊ฐ€๊ฐ€ ๊ทธ ์ด์œ ์ธ๋ฐ ์ด๋ฅผ ์œ„ํ•ด ๋ชฉํ‘œํ•˜๊ณ  ์žˆ๋Š” Step์€ SEO/AEO ์ตœ์ ํ™”์ด๋‹ค.

ํ˜„์žฌ ์˜คํ”ˆ๋‹ฅํ„ฐ ์›น ํ”„๋กœ๋•ํŠธ๋Š” flutter๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ตฌํ˜„๋˜์–ด์žˆ๋‹ค. flutter๋Š” ์•ฑ ๋งŒ๋“ค ๋•Œ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ์•Œ๊ณ  ์žˆ์—ˆ์œผ๋‚˜ flutter ์ปดํŒŒ์ผ๋Ÿฌ์—๊ฒŒ web์œผ๋กœ ๋ฐฐํฌํ•˜๊ธธ ์›ํ•˜๋Š” ํ”Œ๋ž˜๊ทธ๋งŒ ์ฃผ๋ฉด ์•Œ์•„์„œ ์›น์œผ๋กœ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.

ํ•˜์ง€๋งŒ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. flutter๋ฅผ ํ†ตํ•ด ๋งŒ๋“  ํ”„๋กœ๋•ํŠธ๋Š” ๊ทน๋‹จ์ ์ธ Client Side Rendering ๋ฐฉ์‹์œผ๋กœ ๋งŒ๋“ค์–ด์ง„๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๊ฐ€ ๋ชฉํ‘œํ•˜๋Š” SEO ์ตœ์ ํ™”๊ฐ€ ์–ด๋ ค์šด ์ƒํ™ฉ์ด๋‹ค.

๊ธฐ์กด ํ”„๋กœ๋•ํŠธ์—๋Š” ์ˆ˜ ๋งŽ์€ ๊ธฐ๋Šฅ๋“ค์ด ์กด์žฌํ•˜๊ณ  ์ˆจ์–ด์žˆ๋Š” ๊ธฐ๋Šฅ๋“ค๋„ ๋งŽ์€๋ฐ, ๋‹ฌ๋ฆฌ๋Š” ๋งˆ์ฐจ์˜ ๋ฐ”ํ€ด๋ฅผ ๋ฐ”๊พผ๋‹ค๋Š”๊ฒŒ ์‰ฝ์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™์•˜๋‹ค. ๊ทธ๋ž˜์„œ ๋Œ€์•ˆ์œผ๋กœ PostMessage๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ CORS๋ฅผ ๊ณต์‹์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๋™์‹œ์— Next.js๋กœ SEO๋ฅผ ๋ณ‘๋ ฌ์ ์œผ๋กœ ์žก์•„๊ฐ€๋Š” ์‹œ๋„๋ฅผ ํ•˜๊ธฐ๋กœ ํ•ฉ์˜ํ–ˆ๋‹ค.

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ „๋žต: ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์„ค๊ณ„โ€‹

๋‹ฌ๋ฆฌ๋Š” ๋งˆ์ฐจ์˜ ๋ฐ”ํ€ด๋ฅผ ๋ฐ”๊พธ๊ธฐ ์œ„ํ•ด์„œ๋Š” ์‹ ์ค‘ํ•œ ์ „๋žต์ด ํ•„์š”ํ–ˆ๋‹ค. ๊ธฐ์กด ํ”„๋กœ๋•ํŠธ๋ฅผ ์ค‘๋‹จ ์—†์ด ์šด์˜ํ•˜๋ฉด์„œ SEO ์ตœ์ ํ™”๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ „๋žต์„ ์ˆ˜๋ฆฝํ–ˆ๋‹ค.

img alt="work-3"

๊ธฐ์กด์—๋Š” flutter-web -> react ํ™˜๊ฒฝ์ด์—ˆ๋‹ค. flutter-web ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•œ ์˜คํ”ˆ๋‹ฅํ„ฐ ์ตœ์ดˆ์˜ ๊ฐœ๋ฐœ์ž๊ฐ€ ํ‡ด์‚ฌํ•˜๊ณ  ์ด์ „ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž…์‚ฌ๋ฅผ ํ–ˆ์„ ๋•Œ, flutter-web์˜ ์ฝ”๋“œ๋ฅผ ์œ ์ง€๋ณด์ˆ˜ํ•˜๊ธฐ๊ฐ€ ๋งŒ๋งŒ์น˜ ์•Š์•˜๋‹ค๊ณ  ํ–ˆ๋‹ค. ๊ทธ๋ž˜์„œ postMessage๋ฅผ ํ™œ์šฉํ•ด์„œ react ์ปดํฌ๋„ŒํŠธ๋ฅผ flutter-web ์•ˆ์— ์ƒˆ๋กœ์šด Document๋ฅผ ๊ฐ€์ง€๊ณ  ์™€์„œ ๋ณด์—ฌ์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ UI๋ฅผ ๊ตฌํ˜„ํ•˜์‹œ๊ณ  ๊ณ„์…จ๋‹ค.

์ตœ์ƒ์œ„์— Next.js๋ฅผ ๋‘์–ด ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์ด์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•˜๋‹ค.

  • ์žฅ์ 
  1. ๊ธฐ์กด ํ”„๋กœ๋•ํŠธ ์œ ์ง€ํ•˜๋ฉฐ SSR ํ™˜๊ฒฝ ๊ตฌ์ถ• ๊ฐ€๋Šฅ
  2. ์ •์  ๋ฐ ๋™์  ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ถ”๊ฐ€ ๊ฐ€๋Šฅ
  3. ์„œ๋ฒ„์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ง€๊ณ  ์™€ ์ •์ /๋™์  Sitemap ์ถ”๊ฐ€ ๊ฐ€๋Šฅ
  • ๋‹จ์ 
  1. PostMessage๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ํ”„๋กœ๊ทธ๋žจ ๊ฐ„ ๋ฉ”์‹œ์ง€ ํ†ต์‹ ์„ ์ž˜ ๊ด€๋ฆฌํ•ด์•ผ ํ•ด์„œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์‹œ ๋ณต์žก์„ฑ ์ฆ๊ฐ€

์ด๋Ÿฌํ•œ ์ „๋žต์œผ๋กœ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•˜๊ณ , ๋„๋ฉ”์ธ ์„ค์ •๋„ ๋ณ€๊ฒฝํ–ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ƒˆ๋ฒฝ์— ๋ฐฐํฌ๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ๋ฌด์‚ฌํžˆ ์™„๋ฃŒํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฐฐํฌ ํ›„ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฌธ์ œ๋“ค์ด ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์—ˆ๋‹ค.

๋ฐฐํฌ ํ›„ ๋งˆ์ฃผํ•œ ๋ฌธ์ œ๋“ค๊ณผ ํ•ด๊ฒฐ ๊ณผ์ •โ€‹

๋ฐฐํฌ๋Š” ์„ฑ๊ณตํ–ˆ์ง€๋งŒ, ๋ณต์žกํ•œ ์•„ํ‚คํ…์ฒ˜ ๋ณ€๊ฒฝ์˜ ์—ฌํŒŒ๊ฐ€ ๋ฐ”๋กœ ๋‚˜ํƒ€๋‚ฌ๋‹ค. ์„ธ ๊ฐ€์ง€ ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฌธ์ œ๋ฅผ ๋งˆ์ฃผํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

๋ฌธ์ œ 1: ์ธ์ฆ ํ† ํฐ์ด ์ „๋‹ฌ๋˜์ง€ ์•Š์•„ ๋ฆฌํฌํŠธ๊ฐ€ ๋ณด์ด์ง€ ์•Š๋‹ค.โ€‹

๋ฌธ์ œ ์ƒํ™ฉ

๋ฐฐํฌ ์งํ›„ ๋ฆฌํฌํŠธ ๊ฒฐ์ œ ๋ฌธ์˜๊ฐ€ ๋น—๋ฐœ์ณค๋‹ค. ๋ฆฌํฌํŠธ๋ฅผ ๊ฒฐ์ œํ–ˆ๋Š”๋ฐ, ๋ฆฌํฌํŠธ๊ฐ€ ๋ณด์—ฌ์ง€์ง€ ์•Š๋Š” ๋ฌธ์ œ์˜€๋‹ค.

์šฐ๋ฆฌ ์„œ๋น„์Šค์—๋Š” ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ๋“ค์ด ์กด์žฌํ•˜๋Š”๋ฐ ๊ทธ ์ค‘์— ์ž…์ง€ ๋ถ„์„ ๋ฆฌํฌํŠธ๋ฅผ ์ œ๊ณตํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค. ์›ํ•˜๋Š” ์ง€์—ญ์„ ์„ ํƒํ•˜๋ฉด ํ•ด๋‹น ์ง€์—ญ์˜ ์˜์› ๋ฐ ์•ฝ๊ตญ ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ์˜์›/์•ฝ๊ตญ๋“ค์˜ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฆฌํฌํŠธ์ด๋‹ค.

Next.js์˜ ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ๊ตฌํ˜„ํ•œ ๋ฆฌํฌํŠธ ํŽ˜์ด์ง€๋Š” ๋„คํŠธ์›Œํฌ ํ˜ธ์ถœ๋„ ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ณผ ์ˆ˜๊ฐ€ ์—†์–ด ๋””๋ฒ„๊น…์ด ์–ด๋ ค์› ๋‹ค. ํ•˜์ง€๋งŒ ์„ผํŠธ๋ฆฌ๋ฅผ ํ†ตํ•ด ์—๋Ÿฌ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ , ๊ทธ๊ฒƒ์€ ๋ฐ”๋กœ 403 ์—๋Ÿฌ์˜€๋‹ค.

์›์ธ ๋ถ„์„

์˜คํ”ˆ๋‹ฅํ„ฐ ์›น -> ๋ฆฌํฌํŠธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ๋•Œ ํ† ํฐ์ด ์˜ฎ๊ฒจ์ง€์ง€ ์•Š์€ ๋ฌธ์ œ์˜€๋‹ค.

์˜คํ”ˆ๋‹ฅํ„ฐ ์„œ๋น„์Šค์˜ ํŠน์ง•์ธ๋ฐ ๋ฆฌํฌํŠธ๋Š” ๋…๋ฆฝ์ ์ธ ํ”„๋กœ์ ํŠธ๋กœ ๋”ฐ๋กœ ์กด์žฌํ•˜๊ณ  ์žˆ๋‹ค. flutter-web์—์„œ ๋ฆฌํฌํŠธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•  ๋•Œ, ์•„๋ž˜์˜ ์˜ˆ์ œ์™€ ๊ฐ™์ด ์ฟ ํ‚ค๋ฅผ ์‹ฌ์–ด์ฃผ์–ด ์ธ์ฆ ์ •๋ณด๋ฅผ ๊ณต์œ ํ•˜๊ณ  report๊ฐ€ ๋ณด์—ฌ์ง€๋Š” ๊ณผ์ •์ด ์žˆ๋‹ค.

const domain = '.opndoctor.com';
html.document.cookie = 'token=$token; domain=$domain; path=/; secure; SameSite=Strict';

์œ„์™€ ๊ฐ™์ด ํ† ํฐ์„ ์ฟ ํ‚ค์— ๋‹ด์•„ ์ด๋™ํ•˜๋Š”๋ฐ, ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ํ•˜๋ฉด์„œ ๋„๋ฉ”์ธ์„ ๋ณ€๊ฒฝํ•œ ๊ฒƒ์ด ๋ฌธ์ œ์˜ ์›์ธ์ด์—ˆ๋‹ค.

๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๋ฐฐํฌ ์‹œ ๋„๋ฉ”์ธ ์„ค์ • (๋ฌธ์ œ ์ƒํ™ฉ):

  • ๋„ฅ์ŠคํŠธ : https://www.opndoctor.com/
  • ๊ธฐ์กด flutter-web : https://**.amplify.com/
  • ๋ฆฌ์•กํŠธ : https://**.opndoctor.com/
  • ๋ฆฌํฌํŠธ : https://**.opndoctor.com/

๊ธฐ์กด flutter-web์˜ ๋„๋ฉ”์ธ์„ https://www.opndoctor.com์—์„œ https://**.amplify.com๋กœ ๋ณ€๊ฒฝํ–ˆ๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ ๋•Œ๋ฌธ์— flutter-web์—์„œ ๋ฆฌํฌํŠธ ํŽ˜์ด์ง€๋กœ ํ† ํฐ์ด ์ „๋‹ฌ์ด ๋˜์ง€ ์•Š์•˜๋˜ ๊ฒƒ์ด๋‹ค.

์ฟ ํ‚ค๋Š” domain ์†์„ฑ์— ๋”ฐ๋ผ ๊ณต์œ  ๋ฒ”์œ„๊ฐ€ ๊ฒฐ์ •๋œ๋‹ค. ์ฝ”๋“œ์—์„œ domain='.opndoctor.com'์œผ๋กœ ์„ค์ •๋˜์–ด ์žˆ์–ด์„œ, opndoctor.com๊ณผ ๊ทธ ๋ชจ๋“  ์„œ๋ธŒ๋„๋ฉ”์ธ(www.opndoctor.com, report.opndoctor.com ๋“ฑ)์—์„œ๋Š” ์ฟ ํ‚ค๊ฐ€ ๊ณต์œ ๋˜์ง€๋งŒ, ์™„์ „ํžˆ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์ธ *.amplify.com์—์„œ๋Š” ๊ณต์œ ๋˜์ง€ ์•Š๋Š”๋‹ค.

SameSite=Strict ์„ค์ •๋„ ์˜ํ–ฅ์„ ๋ฏธ์ณค๋‹ค. SameSite=Strict๋Š” ๊ฐ™์€ ์‚ฌ์ดํŠธ์—์„œ๋งŒ ์ฟ ํ‚ค๋ฅผ ์ „์†กํ•˜๋ฏ€๋กœ, ๋‹ค๋ฅธ ๋„๋ฉ”์ธ ๊ฐ„ ์š”์ฒญ ์‹œ ์ฟ ํ‚ค๊ฐ€ ์ „์†ก๋˜์ง€ ์•Š๋Š”๋‹ค. ๋งŒ์•ฝ SameSite=Lax์˜€๋‹ค๋ฉด GET ์š”์ฒญ์˜ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ์‚ฌ์ดํŠธ์—์„œ๋„ ์ฟ ํ‚ค๊ฐ€ ์ „์†ก๋  ์ˆ˜ ์žˆ์ง€๋งŒ, ์ด ๊ฒฝ์šฐ์—๋„ domain ์†์„ฑ์ด ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ๊ทผ๋ณธ์ ์œผ๋กœ ์ฟ ํ‚ค๋ฅผ ์ฝ์„ ์ˆ˜ ์—†๋Š” ๋ฌธ์ œ๋Š” ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋Š”๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

๋„๋ฉ”์ธ์„ ์•„๋ž˜์™€ ๊ฐ™์ด ๋ณ€๊ฒฝํ•˜์—ฌ ๊ฐ™์€ ๋„๋ฉ”์ธ ๊ณ„์—ด๋กœ ํ†ต์ผํ–ˆ๋‹ค.

  • ๋„ฅ์ŠคํŠธ : https://www.opndoctor.com/
  • ๊ธฐ์กด flutter-web : https://**.opndoctor.com/
  • ๋ฆฌ์•กํŠธ : https://**.opndoctor.com/
  • ๋ฆฌํฌํŠธ : https://**.opndoctor.com/

๊ฒฐ๊ณผ

์ธ์ฆ ํ† ํฐ์ด ๋ฌด์‚ฌํžˆ ๋„˜์–ด๊ฐ€๊ฒŒ ๋๊ณ  ๋ฆฌํฌํŠธ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋ณด์—ฌ์ง€๊ฒŒ ๋๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ํ†ตํ•ด ๋„๋ฉ”์ธ ๋ณ€๊ฒฝ์ด ์ธ์ฆ ํ๋ฆ„์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ๊นŠ์ด ์ดํ•ดํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

๋ฌธ์ œ 2: ๋ฆฌํฌํŠธ ์žฌ๊ตฌ๋งค์‹œ 404 ํŽ˜์ด์ง€๊ฐ€ ๋ณด์ธ๋‹ค?โ€‹

๋ฌธ์ œ ์ƒํ™ฉ

๋ฆฌํฌํŠธ๋ฅผ ์žฌ๊ตฌ๋งค ๊ฒฐ์ œ ์ดํ›„ 404 ํŽ˜์ด์ง€๋กœ ๋ณด์ธ๋‹ค๋Š” ์นด์นด์˜คํ†ก ๋ฌธ์˜๊ฐ€ ์Ÿ์•„์กŒ๋‹ค.

์›์ธ ๋ถ„์„

์›์ธ ํŒŒ์•…ํ•ด๋ณด๋‹ˆ, ํ•ต์‹ฌ ๋ฌธ์ œ๋Š” URL ๋ Œ๋”๋ง ๋ฌธ์ œ์˜€๋Š”๋ฐ, ์ด๋Ÿฐ ๊ฒฝ์šฐ๋Š” ์ฒ˜์Œ ๊ฒฝํ—˜ํ•ด๋ณด์•˜๋‹ค. ์ง€๊ธˆ๊นŒ์ง€๋Š” ์ด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ์—†์—ˆ๋Š”๋ฐ, Next.js๋ฅผ ๊ธฐ์กด flutter-web ์ƒ์œ„๋กœ ๊ฐ์‹ธ๋ฉด์„œ ์ด๋Ÿฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ํ•ต์‹ฌ์ ์œผ๋กœ๋Š” flutter-web์—์„œ URL์ด ๋ณ€๊ฒฝ๋์„ ๋•Œ, ์ƒ์œ„ Next.js๋กœ ํ•ด๋‹น URL์„ ๋„˜๊ฒจ์ฃผ๋Š” ๋กœ์ง์—์„œ ์ฟผ๋ฆฌ์ŠคํŠธ๋ง ๋ฐ URL Hash ์•ž์— "?"์™€ "#"์ด ์‚ฌ๋ผ์ง€๋Š” ๋ฌธ์ œ์˜€๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

flutter-web์—์„œ URL์ด ๋ณ€๊ฒฝ๋  ๋•Œ URL์„ ์ œ๋Œ€๋กœ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ๋Š” ์œ ํ‹ธ ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ๋‹ค. ์ฟผ๋ฆฌ์ŠคํŠธ๋ง๊ณผ Hash๋ฅผ ํฌํ•จํ•œ ์ „์ฒด URL์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๊ตฌ์„ฑํ•˜์—ฌ ์ƒ์œ„ Next.js๋กœ ์ „๋‹ฌํ•˜๋„๋ก ์ˆ˜์ •ํ–ˆ๋‹ค.

๊ฒฐ๊ณผ

๋ฆฌํฌํŠธ ์žฌ๊ตฌ๋งค ํ›„์—๋„ ์ •์ƒ์ ์œผ๋กœ ํŽ˜์ด์ง€๊ฐ€ ๋ณด์ด๊ฒŒ ๋˜์—ˆ๋‹ค. PostMessage๋ฅผ ํ†ตํ•œ URL ๋™๊ธฐํ™” ๋กœ์ง์˜ ์ค‘์š”์„ฑ์„ ๊นจ๋‹ฌ์•˜๋‹ค.

๋ฌธ์ œ 3: ์ƒˆ๋กœ๊ณ ์นจ ํ›„ URL ๋™๊ธฐํ™”๊ฐ€ ๋Š์–ด์ง„๋‹ค.โ€‹

๋ฌธ์ œ ์ƒํ™ฉ

์ˆ˜์ •ํ•œ ์˜คํ”ˆ๋‹ฅํ„ฐ ์›น ์•„ํ‚คํ…์ฒ˜๋Š” Next.js๊ฐ€ ์ƒ์œ„ HTML์„ ๋‹ด๋‹นํ•˜๊ณ , ๊ทธ ์•ˆ์— iframe๊ณผ postMessage API๋กœ Flutter-web์ด ํ•˜์œ„ HTML๋กœ ์‚ฝ์ž…๋œ๋‹ค. Flutter-web ์˜์—ญ์—์„œ ์ƒˆ๋กœ๊ณ ์นจ์„ ํ•˜๊ฒŒ ๋˜๋ฉด ์ดํ›„์— URL์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

์›์ธ ๋ถ„์„

Flutter-web์—์„œ window.location.reload()๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋ฉด, iframe ๋‚ด๋ถ€๋งŒ ์ƒˆ๋กœ๊ณ ์นจ๋˜์–ด ๋ถ€๋ชจ(Next.js)์™€์˜ PostMessage ํ†ต์‹  ์—ฐ๊ฒฐ์ด ๋Š์–ด์ง€๊ฒŒ ๋œ๋‹ค. ์ด๋กœ ์ธํ•ด ์ดํ›„ Flutter-web์—์„œ URL์ด ๋ณ€๊ฒฝ๋˜์–ด๋„ ์ƒ์œ„ Next.js๋กœ ํ•ด๋‹น ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์ „๋‹ฌํ•  ์ˆ˜ ์—†์–ด, Next.js์˜ URL์ด ๋™๊ธฐํ™”๋˜์ง€ ์•Š๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

Flutter-web์—์„œ ์ง์ ‘ ์ƒˆ๋กœ๊ณ ์นจํ•˜๋Š” ๋Œ€์‹ , IframeChildManager๋ฅผ ํ†ตํ•ด ๋ถ€๋ชจ(Next.js)์—๊ฒŒ ์ƒˆ๋กœ๊ณ ์นจ ์ด๋ฒคํŠธ๋ฅผ ์ „๋‹ฌํ•˜๋„๋ก ๋ณ€๊ฒฝํ–ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ถ€๋ชจ๊ฐ€ ์ „์ฒด ํŽ˜์ด์ง€๋ฅผ ์ƒˆ๋กœ๊ณ ์นจํ•˜๊ฑฐ๋‚˜ URL์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์–ด, PostMessage ํ†ต์‹  ์ฑ„๋„์ด ์œ ์ง€๋˜๊ณ  URL ๋™๊ธฐํ™”๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค.

ASIS (๋ฌธ์ œ ์ƒํ™ฉ)

void webReload() async {
window.location.reload()
}

TOBE (ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•)

void webReload() async {
final manager = IframeChildManager();

const storage = FlutterSecureStorage();
final somthing_token = await storage.read(
key: "SOMETHING_TOKEN");

manager.send(
type: ParentIframeMessageType.message,
payload: {
'event': ChildIframeMessageEventType.reload.value,
'data': {
if (somthing_token != null) 'token': somthing_token,
},
},
);
}

๊ฒฐ๊ณผ

์ƒˆ๋กœ๊ณ ์นจ ํ›„์—๋„ PostMessage ํ†ต์‹ ์ด ์œ ์ง€๋˜์–ด URL ๋™๊ธฐํ™”๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. iframe๊ณผ ๋ถ€๋ชจ ๊ฐ„ ํ†ต์‹  ๊ด€๋ฆฌ์˜ ์ค‘์š”์„ฑ์„ ๋ฐฐ์› ๋‹ค.

๋ฌธ์ œ ํ•ด๊ฒฐ์˜ ๊ฒฐ๊ณผ: ๋‹ฌ์„ฑํ•œ ์„ฑ๊ณผโ€‹

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋“ค์„ ํ•˜๋‚˜์”ฉ ํ•ด๊ฒฐํ•˜๋ฉฐ ์–ป์€ ๊ฒฐ๊ณผ๋Š” ๊ธฐ๋Œ€ ์ด์ƒ์ด์—ˆ๋‹ค.

SEO ๋…ธ์ถœ/ ํด๋ฆญ ์ƒ์Šน

img alt="opn-seo"

๊ตฌ๋ถ„10์›”(๊ธฐ์ค€)11์›”~12/310์›” ๋Œ€๋น„ 11์›” ์ƒ์Šน๋ฅ 
๋…ธ์ถœ ์ˆ˜์•ฝ 1,300ํšŒ์•ฝ 2,000ํšŒ (ํ‰๊ท )์•ฝ 3,700ํšŒ์•ฝ +180% (2.8๋ฐฐ) ๐Ÿ”บ
ํด๋ฆญ ์ˆ˜์•ฝ 10ํšŒ์•ฝ 25ํšŒ (ํ‰๊ท )์•ฝ 75ํšŒ์•ฝ +650% (7.5๋ฐฐ) ๐Ÿ”บ

๊ฐœ์„ ์„ ์‹œ๋„ํ–ˆ์„ ๋•Œ ์„ฑ๊ณผ๋กœ ๋ˆˆ์— ๋ณด์ด๋Š”๊ฒŒ ๋„ˆ๋ฌด ํฅ๋ฏธ์ง„์ง„ํ•œ ํ•œ ๋‹ฌ์ด์—ˆ๋‹ค.

๊ธฐ์ˆ ์  ์„ฑ๊ณผ

  • ๋ณ‘๋ ฌ์ ์œผ๋กœ Next.js๋กœ ๊ฐ ํŽ˜์ด์ง€ ์ด๊ด€ ๊ฐ€๋Šฅํ•œ ํ™˜๊ฒฝ ๊ตฌ์ถ•
  • ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ™œ์šฉํ•œ SEO ์ตœ์ ํ™” ๊ธฐ๋ฐ˜ ๋งˆ๋ จ
  • ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์ „๋žต ์ˆ˜๋ฆฝ ๋ฐ ์‹คํ–‰
  • PostMessage๋ฅผ ํ†ตํ•œ ๋ณต์žกํ•œ ์•„ํ‚คํ…์ฒ˜ ๊ด€๋ฆฌ ๊ฒฝํ—˜ ์ถ•์ 

๋ฌธ์ œ ํ•ด๊ฒฐ ๊ณผ์ •์—์„œ ์–ป์€ ๊ตํ›ˆโ€‹

11์›”์€ ๋ชฐ์ž…์˜ ํ•œ ๋‹ฌ์ด์—ˆ๋‹ค. ์ƒˆ๋กœ์šด ๊ฐœ๋ฐœ ํ™˜๊ฒฝ๊ณผ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉฐ ์‹ฌ์žฅ์ด ๋›ฐ์—ˆ๋˜ ํ•œ ๋‹ฌ์ด์—ˆ๋‹ค.

์ด๋ฒˆ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ํ†ตํ•ด ๋ฐฐ์šด ๊ฐ€์žฅ ํฐ ๊ตํ›ˆ์€ ๋‹ฌ๋ฆฌ๋Š” ๋งˆ์ฐจ์˜ ๋ฐ”ํ€ด๋ฅผ ๋ฐ”๊พธ๋Š” ๊ฒƒ์˜ ์–ด๋ ค์›€์ด์—ˆ๋‹ค. ์„ธ ๊ฐ€์ง€ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ณผ์ •์—์„œ ๋‹ค์Œ์„ ๊นŠ์ด ๋А๊ผˆ๋‹ค:

1. ๋„๋ฉ”์ธ ๋ณ€๊ฒฝ์ด ์ธ์ฆ ํ๋ฆ„์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ

๋ฌธ์ œ 1์„ ํ•ด๊ฒฐํ•˜๋ฉด์„œ ๋ฐฐ์šด ์ ์ด๋‹ค. ์ฟ ํ‚ค ๊ธฐ๋ฐ˜ ์ธ์ฆ์„ ์‚ฌ์šฉํ•  ๋•Œ, ๋„๋ฉ”์ธ ๊ฐ„ ์ฟ ํ‚ค ๊ณต์œ  ๊ทœ์น™์„ ์ •ํ™•ํžˆ ์ดํ•ดํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ๋ชธ์†Œ ์ฒด๊ฐํ–ˆ๋‹ค. domain ์†์„ฑ๊ณผ SameSite ์„ค์ •์ด ์ธ์ฆ ํ๋ฆ„์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์ด๋ก ์ด ์•„๋‹Œ ์‹ค์ œ ๋ฌธ์ œ๋กœ ๊ฒฝํ—˜ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

2. ์„œ๋ฒ„ ์ปดํฌ๋„ŒํŠธ ๋””๋ฒ„๊น…์˜ ์–ด๋ ค์›€

๋ธŒ๋ผ์šฐ์ €์—์„œ ๋„คํŠธ์›Œํฌ ํ˜ธ์ถœ์„ ๋ณผ ์ˆ˜ ์—†์–ด ์„ผํŠธ๋ฆฌ ๊ฐ™์€ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ์˜ ์ค‘์š”์„ฑ์„ ๊นจ๋‹ฌ์•˜๋‹ค. ์„œ๋ฒ„ ์‚ฌ์ด๋“œ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ๋””๋ฒ„๊น…ํ•  ๋•Œ๋Š” ์ „ํ†ต์ ์ธ ๋ฐฉ๋ฒ•๋งŒ์œผ๋กœ๋Š” ๋ถ€์กฑํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ฐฐ์› ๋‹ค.

3. ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์˜ ๋ณต์žก์„ฑ

PostMessage๋ฅผ ํ†ตํ•œ ์—ฌ๋Ÿฌ ํ”„๋กœ๊ทธ๋žจ ๊ฐ„ ๋ฉ”์‹œ์ง€ ํ†ต์‹  ๊ด€๋ฆฌ๊ฐ€ ์˜ˆ์ƒ๋ณด๋‹ค ๋ณต์žกํ–ˆ๋‹ค. ๋ฌธ์ œ 2์™€ ๋ฌธ์ œ 3์„ ํ•ด๊ฒฐํ•˜๋ฉด์„œ iframe๊ณผ ๋ถ€๋ชจ ๊ฐ„ ํ†ต์‹  ๊ด€๋ฆฌ์˜ ๋ฏธ๋ฌ˜ํ•จ์„ ๋ฐฐ์› ๋‹ค. URL ๋™๊ธฐํ™”, ์ƒˆ๋กœ๊ณ ์นจ ์ฒ˜๋ฆฌ ๋“ฑ ๋‹จ์ˆœํ•ด ๋ณด์ด๋Š” ๋™์ž‘๋“ค์ด ๋ณต์žกํ•œ ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค.

๋งˆ๋ฌด๋ฆฌํ•˜๋ฉฐโ€‹

์ด์ œ ์–ด๋А ์ •๋„ ์ต์ˆ™ํ•ด์กŒ์œผ๋‹ˆ, ๋” ๊นŠ์ด ํŒŒ์„œ ์ œ๋Œ€๋กœ ์ดํ•ดํ•ด๋ณด๊ณ  ์ œ๋Œ€๋กœ ์ˆ˜์ •ํ•ด๋ณด์ž. ์ ์ง„์  ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ ์ด์ œ ์•ฝ 20ํผ์„ผํŠธ ์ง„ํ–‰๋๋Š”๋ฐ, ์ด์ œ๋Š” ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋„ ๋„์ž…ํ•ด๋ณด๋ฉฐ ์•ˆ์ •์ ์ด๊ณ  ๋น ๋ฅด๊ฒŒ ๋ณ€ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋งŒ๋“œ๋Š” ๋ฐ ์ง‘์ค‘ํ•ด๋ณด๋ ค๊ณ  ํ•œ๋‹ค.

12์›”์€ ์—ฐ๋ง๋กœ ์•ฝ์†์ด ๊ฝค๋‚˜ ์žˆ๋‹ค. ํ•˜์ง€๋งŒ ์ •์‹  ๋†“์น˜ ์•Š๊ณ  ์ž˜ 25๋…„์„ ๋งˆ๋ฌด๋ฆฌํ•˜๊ณ  26๋…„์„ ์ค€๋น„ํ•˜๋Š” ํ•œ ๋‹ฌ๋กœ ๊ธด ํ˜ธํก์œผ๋กœ ๊ฐ€์ ธ๊ฐ€๋ ค๊ณ  ํ•œ๋‹ค.