View Transitions

์šฐ๋ฆฌ๋Š” ์ด๋ฏธ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ SPA(๋‹จ์ผ ํŽ˜์ด์ง€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜) ์•„ํ‚คํ…์ฒ˜๊ฐ€ ๋„๋ฆฌ ์ฑ„ํƒ๋œ ์ฃผ์š” ์ด์œ  ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ฏธํ•™์ ์ธ ๊ณ ๋ ค์‚ฌํ•ญ ๋•Œ๋ฌธ์ด๋ผ๋Š” ์ ์„ ๊ฐ•์กฐํ•ด์™”์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์˜ ์ฑ… Hypermedia Systems์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด, Web 1.0 ์Šคํƒ€์ผ์˜ ์—ฐ๋ฝ์ฒ˜ ๊ด€๋ฆฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋‹ค๋ฃฐ ๋•Œ, SPA ๋ฒ„์ „๊ณผ ๊ธฐ๋Šฅ์ƒ ๋™์ผํ•˜๋”๋ผ๋„ ํ•ด๋‹น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—๋Š” ์‹ฌ๊ฐํ•œ ๋ฏธํ•™์  ๋ฌธ์ œ๊ฐ€ ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ๊ด€์ ์—์„œ: ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํŽ˜์ด์ง€๋ฅผ ์ด๋™ํ•˜๊ฑฐ๋‚˜, ์—ฐ๋ฝ์ฒ˜๋ฅผ ์ƒ์„ฑ, ์—…๋ฐ์ดํŠธ ๋˜๋Š” ์‚ญ์ œํ•  ๋•Œ ๋ˆˆ์— ๋„๋Š” ์ƒˆ๋กœ๊ณ ์นจ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๋ชจ๋“  ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ(๋งํฌ ํด๋ฆญ ๋˜๋Š” ํผ ์ œ์ถœ)์ด ์ „์ฒด ํŽ˜์ด์ง€ ์ƒˆ๋กœ๊ณ ์นจ์„ ์š”๊ตฌํ•˜๋ฉฐ, ๊ฐ ์ž‘์—… ํ›„์—๋Š” ์ƒˆ๋กœ์šด HTML ๋ฌธ์„œ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

โ€“Hypermedia Systems - Chapter 5

์ด๋Ÿฌํ•œ ํŽ˜์ด์ง€ ๊ฐ„์˜ ๋ˆˆ์— ๋„๋Š” โ€œ์นด-์ฒ™(ka-chunk)โ€ ํšจ๊ณผ์™€ ์ข…์ข… ๋ฐœ์ƒํ•˜๋Š” ๋ฏธ ์Šคํƒ€์ผ๋ง๋œ ์ฝ˜ํ…์ธ ์˜ ๊นœ๋นก์ž„์€ ์˜ค๋žซ๋™์•ˆ ๋ฌธ์ œ๋กœ ์ง€์ ๋˜์–ด ์™”์Šต๋‹ˆ๋‹ค. ํ˜„๋Œ€ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ด ์ƒํ™ฉ์„ ๋‹ค์†Œ ๊ฐœ์„ ํ–ˆ์ง€๋งŒ(๋ฌผ๋ก , ์š”์ฒญ์ด ์ง„ํ–‰ ์ค‘์ž„์„ ๋œ ๋ช…ํ™•ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋‹จ์ ๋„ ์žˆ์Šต๋‹ˆ๋‹ค), ํŠนํžˆ ์ž˜ ์ œ์ž‘๋œ SPA์™€ ๋น„๊ตํ–ˆ์„ ๋•Œ ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

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

๊ธฐ์ค€์€ ๋‚ฎ์•˜๊ณ , ๊ทธ ์‹œ์ ˆ์€ ์ข‹์•˜์Šต๋‹ˆ๋‹ค.

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

๋‹ค์‹œ ๋งํ•ด, ๋งŽ์€ ํŒ€๋“ค์ด SPA ์ ‘๊ทผ ๋ฐฉ์‹์„ ๊ธฐ๋ณธ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” โ€œ์˜› ๋ฐฉ์‹โ€œ์ด ๊ทธ๋ƒฅโ€ฆ ํˆฌ๋ฐ•ํ•ด ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

#CSS ์ „ํ™˜

์ดˆ๊ธฐ ์›น ์—”์ง€๋‹ˆ์–ด๋“ค์€ ์›น ๊ฐœ๋ฐœ์ž๋“ค์ด ์„œ๋กœ ๋‹ค๋ฅธ ๋ณด๊ธฐ ์ƒํƒœ ๊ฐ„์˜ ๋ถ€๋“œ๋Ÿฌ์šด ์ „ํ™˜์„ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์–ดํ•  ๊ฒƒ์ด๋ผ๋Š” ์ ์„ ๊นจ๋‹ฌ์•˜๊ณ , ์ด๋ฅผ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ๊ธฐ์ˆ ์„ ์ œ๊ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ์ค‘ ์ฃผ์š” ๊ธฐ์ˆ ์€ CSS ์ „ํ™˜์œผ๋กœ, ์ƒํƒœ์—์„œ ๋‹ค๋ฅธ ์ƒํƒœ๋กœ ์ˆ˜ํ•™์  ์ „ํ™˜์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆํƒ€๊น๊ฒŒ๋„ HTML์—์„œ CSS ์ „ํ™˜์€ JavaScript๋ฅผ ์‚ฌ์šฉํ•ด์•ผ๋งŒ ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ „ํ™˜์„ ํŠธ๋ฆฌ๊ฑฐํ•˜๋ ค๋ฉด ์š”์†Œ๋ฅผ ๋™์ ์œผ๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•˜๋ฉฐ, โ€œ์ˆœ์ˆ˜โ€ HTML๋กœ๋Š” ์ด๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์ด๋Š” JavaScript๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ SPA๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋“ค๋งŒ์ด ์ด๋Ÿฌํ•œ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ์Œ์„ ์˜๋ฏธํ•˜๋ฉฐ, ์ด๋Š” SPA์˜ ๋ฏธํ•™์  ์šฐ์›”์„ฑ์„ ๋”์šฑ ๊ณต๊ณ ํžˆ ํ–ˆ์Šต๋‹ˆ๋‹ค.

htmx๋ฅผ ํ†ตํ•ด, ์•„๋งˆ๋„ ์•„์‹œ๊ฒ ์ง€๋งŒ, CSS ์ „ํ™˜์„ ์ˆœ์ˆ˜ HTML์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ๋‹ค์†Œ ๋ณต์žกํ•œ ๊ต์ฒด ๋ชจ๋ธ์„ ํ†ตํ•ด ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” ์ƒˆ ์ฝ˜ํ…์ธ ์™€ ์˜ค๋ž˜๋œ ์ฝ˜ํ…์ธ ์— ๋ชจ๋‘ ์žˆ๋Š” ์š”์†Œ๋“ค์„ ๊ฐ€์ ธ์™€ โ€œ์ •์ฐฉโ€ ์†์„ฑ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•˜์ดํผ๋ฏธ๋””์–ด ๊ธฐ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๋„ ์ž˜ ์ œ์ž‘๋œ SPA์ฒ˜๋Ÿผ ๋งค๋„๋Ÿฝ๊ฒŒ ๋Š๊ปด์ง€๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ƒˆ๋กœ์šด API๊ฐ€ ๋“ฑ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค: View Transition API.

#View Transition API

View Transition API๋Š” CSS ์ „ํ™˜๋ณด๋‹ค ํ›จ์”ฌ ๋” ์•ผ์‹ฌ ์ฐฌ ๋ชฉํ‘œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด API๋Š” ๋‹จ์ˆœํ•˜๋ฉด์„œ๋„ ์ง๊ด€์ ์ธ API๋ฅผ ์ œ๊ณตํ•˜์—ฌ, ์ „์ฒด DOM์„ ํ•˜๋‚˜์˜ ์ƒํƒœ์—์„œ ๋‹ค๋ฅธ ์ƒํƒœ๋กœ ์ „ํ™˜ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž๋“ค๋„ ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋”์šฑ์ด ์ด API๋Š” JavaScript๋ฟ๋งŒ ์•„๋‹ˆ๋ผ HTML์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด, Web 1.0 ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด๋„ ํ›จ์”ฌ ๋” ๋ฉ‹์ง„ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด ๊ธฐ๋Šฅ์ด ๊ฐ€๋Šฅํ•ด์ง€๋ฉด โ€œHypermedia Systemsโ€œ์—์„œ ๋‹ค๋ฃจ๋Š” ์—ฐ๋ฝ์ฒ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋‹ค์‹œ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ๋„ ์žฌ๋ฏธ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค!

ํ•˜์ง€๋งŒ ์ด ๊ธ€์„ ์“ฐ๋Š” ์‹œ์ ์—์„œ, ์ด API๋Š” CSS ์ „ํ™˜์ฒ˜๋Ÿผ JavaScript์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, Chrome 111+์—์„œ๋งŒ ๋ง‰ ์ถœ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

JavaScript์—์„œ ์ด API๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค:

  // ์ด๊ฒƒ๋งŒ์œผ๋กœ๋„ ์ƒํƒœ ๊ฐ„์˜ ๋งค๋„๋Ÿฌ์šด ์ „ํ™˜์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค!
  document.startViewTransition(() => updateTheDOMSomehow(data));

์ด์ œ, ์ด๊ฑด ๋‚ด๊ฐ€ ์ข‹์•„ํ•˜๋Š” API์ž…๋‹ˆ๋‹ค.

์šด ์ข‹๊ฒŒ๋„, ์ด API๋ฅผ ์ผ๋ฐ˜ htmx ๊ต์ฒด ๋ชจ๋ธ ์ฃผ์œ„์— ์‰ฝ๊ฒŒ ๊ฐ์Œ€ ์ˆ˜ ์žˆ์–ด์„œ, HTML์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ์ „์— htmx์—์„œ View Transition์„ ํƒ์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

๊ทธ๋ฆฌ๊ณ  htmx 1.9.0๋ถ€ํ„ฐ๋Š” hx-swap ์†์„ฑ์— transition:true ์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ด API๋ฅผ ์‹คํ—˜ํ•ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

#์‹ค์šฉ์ ์ธ ์˜ˆ์ œ

์ด์ œ ์ด ์ƒˆ๋กœ์šด ๋ฉ‹์ง„ ์žฅ๋‚œ๊ฐ์„ htmx์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•œ ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ด ์ž‘์—…์—๋Š” ๋‘ ๊ฐ€์ง€ ๋‹จ๊ณ„๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:

#CSS

๋จผ์ € ํ•ด์•ผ ํ•  ์ผ์€ ์šฐ๋ฆฌ๊ฐ€ ์›ํ•˜๋Š” View Transition ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

(View Transition API์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ด๋ฅผ ๋ฌธ์„œํ™”ํ•œ Chrome Developer Page์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

<style>
   @keyframes fade-in {
     from { opacity: 0; }
   }

   @keyframes fade-out {
     to { opacity: 0; }
   }

   @keyframes slide-from-right {
     from { transform: translateX(90px); }
   }

   @keyframes slide-to-left {
     to { transform: translateX(-90px); }
   }

   /* ์ด์ „ ๋ฐ ์ƒˆ๋กœ์šด ์ฝ˜ํ…์ธ ์— ๋Œ€ํ•œ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ •์˜ */
   ::view-transition-old(slide-it) {
     animation: 180ms cubic-bezier(0.4, 0, 1, 1) both fade-out,
     600ms cubic-bezier(0.4, 0, 0.2, 1) both slide-to-left;
   }
   ::view-transition-new(slide-it) {
     animation: 420ms cubic-bezier(0, 0, 0.2, 1) 90ms both fade-in,
     600ms cubic-bezier(0.4, 0, 0.2, 1) both slide-from-right;
   }

   /* ์ง€์ •๋œ CSS ํด๋ž˜์Šค์— View Transition ์—ฐ๊ฒฐ */
   .sample-transition {
       view-transition-name: slide-it;
   }
</style>

์ด CSS๋Š” .sample-transition ํด๋ž˜์Šค๋ฅผ ๊ฐ€์ง„ ์ฝ˜ํ…์ธ ๊ฐ€ ์ œ๊ฑฐ๋  ๋•Œ ํŽ˜์ด๋“œ์•„์›ƒํ•˜๊ณ  ์™ผ์ชฝ์œผ๋กœ ์Šฌ๋ผ์ด๋“œํ•˜๋ฉฐ, ์ƒˆ ์ฝ˜ํ…์ธ ๋Š” ํŽ˜์ด๋“œ์ธํ•˜๊ณ  ์˜ค๋ฅธ์ชฝ์—์„œ ์Šฌ๋ผ์ด๋“œํ•ด ๋“ค์–ด์˜ค๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

#HTML

CSS๋ฅผ ํ†ตํ•ด View Transition์„ ์ •์˜ํ–ˆ์œผ๋ฏ€๋กœ, ๋‹ค์Œ์œผ๋กœ ํ•  ์ผ์€ htmx๊ฐ€ ๋ณ€๊ฒฝํ•  ์‹ค์ œ ์š”์†Œ์— ์ด View Transition์„ ์—ฐ๊ฒฐํ•˜๊ณ , htmx๊ฐ€ View Transition API๋ฅผ ํ™œ์šฉํ•˜๋„๋ก ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

<div class="sample-transition">
   <h1>์ดˆ๊ธฐ ์ฝ˜ํ…์ธ </h1>
   <button hx-get="/new-content" 
           hx-swap="innerHTML transition:true" 
           hx-target="closest div">
     Swap It!
   </button>
</div>

์—ฌ๊ธฐ์—๋Š” ์ƒˆ ์ฝ˜ํ…์ธ ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด GET ์š”์ฒญ์„ ๋ณด๋‚ด๊ณ , ์‘๋‹ต์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด div์˜ ๋‚ด๋ถ€ HTML์„ ๊ต์ฒดํ•˜๋Š” ๋ฒ„ํŠผ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ด๋‹น div์—๋Š” sample-transition ํด๋ž˜์Šค๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ, ์œ„์—์„œ ์ •์˜ํ•œ View Transition์ด ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ, hx-swap ์†์„ฑ์— transition:true ์˜ต์…˜์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋ฉฐ, ์ด๋Š” htmx๊ฐ€ ์ „ํ™˜ ์‹œ ๋‚ด๋ถ€ View Transition JavaScript API๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ง€์‹œํ•ฉ๋‹ˆ๋‹ค.

#๋ฐ๋ชจ

์ด์ œ ๋ชจ๋“  ๊ฒƒ์„ ์—ฐ๊ฒฐํ–ˆ์œผ๋ฏ€๋กœ, htmx์™€ ํ•จ๊ป˜ View Transition API๋ฅผ ์‚ฌ์šฉํ•ด ๋ณผ ์ค€๋น„๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ์€ Chrome 111+์—์„œ ์ž‘๋™ํ•˜๋Š” ๋ฐ๋ชจ์ž…๋‹ˆ๋‹ค(๋‹ค๋ฅธ ๋ธŒ๋ผ์šฐ์ €์—์„œ๋„ ์ž‘๋™ํ•˜์ง€๋งŒ ๋ฉ‹์ง„ ์• ๋‹ˆ๋ฉ”์ด์…˜์€ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค):

์ดˆ๊ธฐ ์ฝ˜ํ…์ธ 

Chrome 111+์—์„œ ์ด ํŽ˜์ด์ง€๋ฅผ ๋ณด๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด, ์œ„์˜ ์ฝ˜ํ…์ธ ๊ฐ€ ์™ผ์ชฝ์œผ๋กœ ๋ถ€๋“œ๋Ÿฝ๊ฒŒ ์Šฌ๋ผ์ด๋“œ์•„์›ƒ๋˜๊ณ  ์˜ค๋ฅธ์ชฝ์—์„œ ์ƒˆ ์ฝ˜ํ…์ธ ๊ฐ€ ์Šฌ๋ผ์ด๋“œ์ธํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฉ‹์ง€๋„ค์š”!

#๊ฒฐ๋ก 

์ด์ œ, ๊ฝค ๋ฉ‹์ง€์ง€ ์•Š๋‚˜์š”? ๊ทธ๋ฆฌ๊ณ  ์ด ๊ฐœ๋…์„ ์ดํ•ดํ•˜๊ณ  ๋‚˜๋ฉด ๊ทธ๋ ‡๊ฒŒ ๋งŽ์€ ์ž‘์—…์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค! ์ด ์ƒˆ๋กœ์šด API๋Š” ๋งŽ์€ ๊ฐ€๋Šฅ์„ฑ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

View Transitions๋Š” ๋งค์šฐ ํฅ๋ฏธ๋กœ์šด ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ๋กœ, ํ˜„์žฌ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” SPA ์•„ํ‚คํ…์ฒ˜์™€ ํ•˜์ดํผ๋ฏธ๋””์–ด ๊ธฐ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐ„์˜ ๊ฒฉ์ฐจ๋ฅผ ํฌ๊ฒŒ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Web 1.0 ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณด๊ธฐ ํ‰ํ•œ โ€œ์นด-์ฒ™โ€œ์„ ์—†์• ๊ณ , SPA ์ ‘๊ทผ ๋ฐฉ์‹์˜ ๋ฏธํ•™์  ์ด์ ์„ ์ค„์ž„์œผ๋กœ์จ, ๋‹ค์–‘ํ•œ ์•„ํ‚คํ…์ฒ˜์™€ ๊ด€๋ จ๋œ ์‹ค์ œ ๊ธฐ์ˆ ์  ์ ˆ์ถฉ์ ์— ๋” ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

View Transitions๊ฐ€ ์ˆœ์ˆ˜ HTML์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ด์ง€๋Š” ๊ฒƒ์„ ๊ณ ๋Œ€ํ•˜๊ณ  ์žˆ์ง€๋งŒ, ๊ทธ๋•Œ๊นŒ์ง€๋Š” htmx์—์„œ ์ด๋ฅผ ์˜ค๋Š˜๋ถ€ํ„ฐ ์‚ฌ์šฉํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!