FastAPI ํ๋ก ํธ์๋ ์ต์ ํ: ๋ชจ๋ฐ์ผ ์ค์ ๊ฒ์๊ธ์ ์คํฌ๋กค ๋ (Lag)๊ณผ CLS(๋์ ๋ ์ด์์ ์ด๋) ํด๊ฒฐํ๊ธฐ
์น์ฌ์ดํธ์ ์์ง์ IT ์นผ๋ผ 50๊ฐ๋ฅผ ์ฑ์ฐ๊ณ , ๋ด๋ค์ ์ ์ฑ ํธ๋ํฝ์ ๋ฐฉ์ดํ๋ฉฐ ์๋ฒ(FastAPI) ์ธํ๋ผ๋ฅผ ํํํ๊ฒ ๊ตฌ์ถํ์ต๋๋ค. ํ์ง๋ง ์ ์ค๋งํธํฐ์ผ๋ก ์ง์ ์ปค๋ฎค๋ํฐ์ ์ ์ํด ์ฅ๋ฌธ์ '์ค์(์คํฌ๋กค ์๋ฐ)' ๊ฒ์๊ธ์ ์ฝ์ด ๋ด๋ ค๊ฐ๋ ์ค, ๋์ฐํ ์ฌ์ฉ์ ๊ฒฝํ(UX) ๋ฒ๊ทธ๋ค์ ๋ง์ฃผํ๊ฒ ๋์์ต๋๋ค.
์คํฌ๋กค์ ๋ด๋ฆด ๋๋ง๋ค ํ๋ฉด์ด ๋ฒ๋ฒ ๊ฑฐ๋ฆฌ๋ฉฐ ๊ด์ฑ ์คํฌ๋กค์ด ๋จนํต์ด ๋๋ ํ์.
์ด๋ฏธ์ง๋ ๋์์์ด ๋ฆ๊ฒ ๋ก๋ฉ๋๋ฉด์ ๊ธฐ๊ป ์ฝ๊ณ ์๋ ํ ์คํธ๊ฐ ์๋๋ก ํ ๋ฐ๋ ค ๋ด๋ ค๊ฐ๋ ํ์(CLS).
๋ค๋ฅธ ์ฌ์ดํธ์์ ์์ฑ๋ ๊ธ์ ๊ฒฝ์ฐ, ๋์์์ด ์ข์ ํ(
<table>) ์์ ๊ฐํ ์ค๋งํธํฐ ํ๋ฉด ๋ฐ์ผ๋ก ์์ ธ๋๊ฐ ๊ฐ๋ก ์คํฌ๋กค์ด ์๊ฒจ๋ฒ๋ฆฌ๋ ํ์.
์ด๋ฌํ ๋ฌธ์ ๋ค์ ์ ์ ๋ค์ ์ง์ฆ์ ์ ๋ฐํ ๋ฟ๋ง ์๋๋ผ, ๊ตฌ๊ธ ์ ๋์ผ์ค 2026 ์ฒดํฌ๋ฆฌ์คํธ์ ๋ช ์๋ '๋ชจ๋ฐ์ผ ์นํ์ฑ'๊ณผ '์ฝ์ด ์น ๋ฐ์ดํ(Core Web Vitals)' ์ฌ์ฌ ๊ธฐ์ค์์ ์ฆ๊ฐ์ ์ธ ํ๋ฝ(๊ฐ์น ์๋ ์ฌ์ฉ์ ํ๊ฒฝ)์ ์ด๋ํ๋ ์น๋ช ์ ์ธ ์์์ ๋๋ค. ์ ๋ ์ฆ์ CSS์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ๋ฏ์ด๊ณ ์น๋ ํ๋ก ํธ์๋ ๋์์ ์ ๋์ ํ์ต๋๋ค.
1. ์คํฌ๋กค ๋ (Lag)์ ์ฃผ๋ฒ: ๋ธ๋ผ์ฐ์ ๋ฅผ ๊ดด๋กญํ๋ '๋ฌด์ํ ์ค๋ฐ๊ฟ'
๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ์์ ํ ์คํธ๊ฐ ๊ฝ ์ฐฌ ๊ธด ๊ธ์ ์คํฌ๋กคํ ๋ ํ๋ ์์ด ๋๋ ๋๊ธฐ๋ ๊ฐ์ฅ ํฐ ์ด์ ๋ ๋ธ๋ผ์ฐ์ ์ ๋ ๋๋ง ์์ง(CPU)์ด '๋จ์ด ์ค๋ฐ๊ฟ'์ ์ค์๊ฐ์ผ๋ก ๊ณ์ฐํ๋๋ผ ๊ณผ๋ถํ๊ฐ ๊ฑธ๋ฆฌ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ธฐ์กด์๋ ํ
์คํธ๊ฐ ํ๋ฉด ๋ฐ์ผ๋ก ์์ ธ๋๊ฐ๋ ๊ฒ์ ๋ง๊ธฐ ์ํด ๋ฌด์์ break-all ์์ฑ์ ์ผ์ต๋๋ค. ํ์ง๋ง ํ๊ตญ์ด ํ
์คํธ์ ์ด ์์ฑ์ ๋จ์ฉํ๋ฉด ๋จ์ด์ ์ค๊ฐ์ด ๋๋ ๋๊ธฐ๋ฉด์ ๊ฐ๋
์ฑ์ด ๋จ์ด์ง ๋ฟ๋ง ์๋๋ผ, ๋ ๋๋ง ์ฐ์ฐ ๋น์ฉ์ด ํญ์ฆํฉ๋๋ค. ์ ๋ ์ด ๋ธ๋ผ์ฐ์ ๊ณผ๋ถํ๋ฅผ ๋ง๊ธฐ ์ํด CSS ๋ง์คํฐ ํ์ผ์ ํ๊ตญ์ด ํ์ค ์ค๋ฐ๊ฟ ๊ท๊ฒฉ์ ์ ์ญ์ผ๋ก ์ ์ฉํ์ต๋๋ค.

์ด ๊ฐ๋จํ ์์ฑ ๋ณ๊ฒฝ(keep-all)๋ง์ผ๋ก๋ ๋ชจ๋ฐ์ผ ๊ด์ฑ ์คํฌ๋กค์ด ๋๋ผ์ธ ์ ๋๋ก ๋ถ๋๋ฌ์์ก๊ณ , ํ
์คํธ๊ฐ ๋จ์ด ๋จ์๋ก ์์๊ฒ ๋์ด์ง๋ฉฐ '๊น๋ํ ๋์์ธ(Clean design)'์ ์์ฑํ ์ ์์์ต๋๋ค.
2. ํฌ๋กค๋ฌ๊ฐ ๋ง๋ 'ํฌ๋ช ํ ์ด๋ธ ๊ฐ์ฅ'์์ ๋์์ ๊ตฌ์ถํ๊ธฐ
๋ค๋ฅธ ์ฌ์ดํธ(๋์์ธ์ฌ์ด๋, ์ํจ์ฝ๋ฆฌ์ ๋ฑ)์์ ์์ง๋ ๊ฒ์๊ธ์ด๋ ๊ณผ๊ฑฐ์ ์๋ํฐ๋ก ์์ฑ๋ ๊ธ๋ค์ ๋ณด๋ฉด, ์์(video)์ ๊ฐ์ธ๊ธฐ ์ํด ๊ฒ์ผ๋ก ๋ณด์ด์ง ์๋ ํฌ๋ช
ํ <table> ํ๊ทธ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋งค์ฐ ๋ง์ต๋๋ค. ๋ฌธ์ ๋ ์ด ๊ตฌํ ํ
์ด๋ธ ๊ตฌ์กฐ๊ฐ ๋ชจ๋ฐ์ผ ํ๋ฉด(360px)์ ๋ค์ด์ค๋ฉด ํ ํฌ๊ธฐ๊ฐ ๊ณ ์ ๋์ด ๋์์์ด ํ๋ฉด ์ฐ์ธก์ ๋ซ๊ณ ๋๊ฐ๋ฒ๋ฆฐ๋ค๋ ๊ฒ์
๋๋ค.
์ด ๋ชจ๋ฐ์ผ ๋ ์ด์์ ๋ถ๊ดด๋ฅผ ๋ง๊ธฐ ์ํด, ์ต์ CSS์ ๊ฐ๋ ฅํ ๋ฌด๊ธฐ์ธ :has() ๊ฐ์ ํด๋์ค๋ฅผ ๋์
ํ์ต๋๋ค. ์๋ฐ์คํฌ๋ฆฝํธ๋ก DOM์ ์ผ์ผ์ด ์กฐ์ํ ํ์ ์์ด, CSS๋ง์ผ๋ก "๋ด๋ถ์ ์์์ ํ๊ณ ์๋ ํ
์ด๋ธ"์ ์ ํํ ์ฐพ์๋ด์ด ์กฑ์๋ฅผ ํ์ด๋ฒ๋ ธ์ต๋๋ค.

์ด ๋ง๋ฒ ๊ฐ์ :has() ์ฝ๋๋ฅผ ํตํด ์ ์์ ์ธ ์ ๋ณด์ฑ ํ(Data Table)์ ๋ ์ด์์์ ๊ทธ๋๋ก ์ ์งํ๋ฉด์, ์ค์ง ๋์์์ ๊ฐ๋๊ณ ์๋ ๋น์ ์์ ์ธ ํ
์ด๋ธ ๊ป๋ฐ๊ธฐ๋ง display: block์ผ๋ก ํด์ฒดํ์ฌ ๋ชจ๋ฐ์ผ ํ๋ฉด์ 100% ๊ฝ ์ฐจ๋ ์พ์ ํ ๋ทฐ๋ฅผ ๋ง๋ค์ด๋์ต๋๋ค.
3. FOUC (ํ์ ๋๋ฝ) ๋ฐฉ์ง์ CLS ์ต์ ํ
๋ง์ง๋ง์ผ๋ก, ์ฌ์ฉ์๊ฐ ์ฌ์ดํธ์ ๋ค์ด์ฌ ๋ ํ๋ฉด์ด ์ ๊น ํ์๊ฒ ๋ฒ์ฉ์๋ค๊ฐ ๋คํฌ ๋ชจ๋๋ก ๋ณํ๋ FOUC(Flash of Unstyled Content) ํ์์ ์๋ฒฝํ๊ฒ ์ก์์ต๋๋ค. ์ด ํ์์ ๊ตฌ๊ธ ์ ๋์ผ์ค ์ฌ์ฌ ๋ด์ด ์ฌ์ดํธ์ ํ์ง(UX)์ ๊น์๋ด๋ฆฌ๋ ๋ํ์ ์ธ ์์ธ ์ค ํ๋์ ๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด <head> ํ๊ทธ ๊ฐ์ฅ ์์ชฝ์ ์ธ๋ถ CSS๊ฐ ๋ก๋๋๊ธฐ ์ ์ ์ฆ๊ฐ์ ์ผ๋ก ์คํ๋๋ ์งง์ ์ฐจ๋จํ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ฝ์
ํ์ต๋๋ค.

์ด๋ ๊ฒ ํ๋ฉด ๋ธ๋ผ์ฐ์ ๊ฐ HTML์ ์ฝ๊ธฐ ์์ํ๋ 0.001์ด์ ์๊ฐ์ ๋ก์ปฌ ์คํ ๋ฆฌ์ง(localStorage)๋ฅผ ํ์ธํ์ฌ ๋คํฌ ๋ชจ๋ ํด๋์ค(dark-theme)๋ฅผ ์ฆ์ ๋ฎ์ด์์ฐ๋ฏ๋ก, ์ ์ ์ ๋์ ํผ๊ณคํ๊ฒ ํ๋ ๋๋ฝ ํ์์ด 100% ์ฌ๋ผ์ง๋๋ค.
์ฌ๊ธฐ์ ๋ํด, ์คํฌ๋กค์ ๋ด๋ฆด ๋ ์ด๋ฏธ์ง ๋ก๋ฉ์ผ๋ก ์ธํด ํ๋ฉด์ด ๋์ปน๊ฑฐ๋ฆฌ๋ ์ ๊ฒฉ(Layout Shift)์ ๋ง๊ธฐ ์ํด ์ด๋ฏธ์ง์ iframe์ ํฐ์น ์ก์ ์ ๋ถ๋ฆฌํ์ฌ CSS์ ๋ช ์ํด ์ฃผ์์ต๋๋ค.

๋งบ์ผ๋ฉฐ: '๋์ ๋ณด์ด๋ ๊ฒ'์ด ๊ฒฐ๊ตญ SEO์ ์์ฑ์ด๋ค
์๋ฒ ๋ด ๋ฐฉ์ด์ ๋ฐฑ์๋ ํธ๋ํฝ ํ๋์ด ์น์ฌ์ดํธ์ '๋ผ๋'๋ฅผ ์งํค๋ ์ผ์ด๋ผ๋ฉด, ์ค๋ ์งํํ ํ๋ก ํธ์๋ CSS ์ต์ ํ์ ๋ชจ๋ฐ์ผ ๋ ์ด์์ ๋์์ ์ ์ ์ ๊ตฌ๊ธ ์ฌ์ฌ๊ด์๊ฒ ๋ด๋ณด์ด๋ ์ฌ์ดํธ์ 'ํผ๋ถ'๋ฅผ ๊ฐ๊พธ๋ ์ผ์ ๋๋ค.
2026๋ ์ดํ์ ๊ตฌ๊ธ ์ ๋์ผ์ค์ ๊ฒ์ ์์ง์ "๋ชจ๋ฐ์ผ์์ ์ ์ ๊ฐ ๊ธ์ ์ฝ๊ธฐ ํธํ๊ฐ?(Mobile-friendly)", ๊ทธ๋ฆฌ๊ณ "ํ๋ฉด์ด ๋์ปน๊ฑฐ๋ฆฌ์ง ์๋๊ฐ?(CLS 0์ )"๋ฅผ ๋งค์ฐ ์๊ฒฉํ๊ฒ ํ๊ฐํฉ๋๋ค. ๋ฐฑ์๋์์ ๋ด๋ ค์ค ๋ฐ์ดํฐ๋ฅผ ๋จ์ํ ํ๋ฉด์ ๋ฟ๋ฆฌ๋ ๋ฐ ๊ทธ์น์ง ์๊ณ , ์ธ๋ถ ํฌ๋กค๋ฌ์ ๋น์ ์์ ์ธ ํ ์ด๋ธ ๊ตฌ์กฐ๊น์ง CSS๋ก ์ฐ์ํ๊ฒ ํด์ฒดํ๋ ์ง์ํ UX ์ต์ ํ ๊ณผ์ ์ด์ผ๋ง๋ก 1์ธ ๊ฐ๋ฐ์๊ฐ ์ ๋๊ณ ์๋ฅผ ๊ฐ์ฅ ํ์คํ๊ฒ ํต๊ณผํ ์ ์๋ ํ์น ์ ๋ต์ผ ๊ฒ์ ๋๋ค.
โ ์์ฃผ ๋ฌป๋ ์ง๋ฌธ (FAQ)
Q1. :has() ๊ฐ์ ํด๋์ค๋ ์ค๋๋ ๊ตฌํ ๋ธ๋ผ์ฐ์ ์์๋ ์๋ํ์ง ์์ง ์๋์?
A. ๋ง์ต๋๋ค. :has()๋ CSS์ ํ๋ช
์ด์ง๋ง ๊ตฌํ ์ฌํ๋ฆฌ๋ ๊ตฌํ ํฌ๋กฌ์์๋ ์ง์๋์ง ์์ ์ ์์ต๋๋ค. ํ์ง๋ง ํ์ฌ ๊ธ๋ก๋ฒ ๋ชจ๋ฐ์ผ ๋ธ๋ผ์ฐ์ ์ ์ ์จ์ 90% ์ด์์ด ์ด๋ฏธ :has()๋ฅผ ์๋ฒฝํ๊ฒ ์ง์ํ๊ณ ์์ต๋๋ค. ๋ฐ๋ผ์ ์๋ฐ์คํฌ๋ฆฝํธ(JS)๋ก ๋ฌด๊ฒ๊ฒ DOM์ ์ค์บํ๋ฉฐ ๋ ์ด์์ ์ด๋(CLS)์ ์ ๋ฐํ๋ ๊ฒ๋ณด๋ค, CSS :has()๋ฅผ ์ฌ์ฉํ์ฌ ๋ค์ดํฐ๋ธ ๋ ๋๋ง ์๋๋ก ์ฆ์ ํด๊ฒฐํ๋ ๊ฒ์ด '๋ชจ๋ฐ์ผ ์ต์ ํ' ๊ด์ ์์๋ ์๋์ ์ผ๋ก ์ ๋ฆฌํฉ๋๋ค.
Q2. FOUC๋ฅผ ๋ง๋ ์คํฌ๋ฆฝํธ๋ฅผ <head>์ ๋ฃ์ผ๋ฉด ํ์ด์ง ๋ก๋ฉ์ด ๋๋ ค์ง์ง ์๋์?
A. ์ธ๋ถ ์คํฌ๋ฆฝํธ ํ์ผ(<script src="...">)์ ๋ถ๋ฌ์จ๋ค๋ฉด ๋คํธ์ํฌ ๋น์ฉ์ด ๋ฐ์ํด ๋ก๋ฉ์ด ๋๋ ค์ง ์ ์์ต๋๋ค. ํ์ง๋ง ์ ์์์ฒ๋ผ <head> ๋ด๋ถ์ ์ธ๋ผ์ธ(Inline)์ผ๋ก ์์ฑ๋ ๊ทน๋๋ก ์งง์ ์๋ฐ์คํฌ๋ฆฝํธ๋ ์ง์ฐ ์๊ฐ(Latency)์ด 0์ ๊ฐ๊น์ฐ๋ฉฐ, ์คํ๋ ค ๋ธ๋ผ์ฐ์ ๊ฐ ํ๋ฉด์ ๋ ๋ฒ ๊ทธ๋ฆฌ๋ ๋ฆฌํ์ธํธ(Repaint) ๊ณผ์ ์ ์๋ตํ๊ฒ ๋ง๋ค์ด ์ฃผ๊ธฐ ๋๋ฌธ์ ์ต์ข
์ ์ธ ์ฒด๊ฐ ๋ก๋ฉ ์๋๋ ํจ์ฌ ๋นจ๋ผ์ง๋๋ค.
Q3. ๋ชจ๋ฐ์ผ์์ ์คํฌ๋กค์ ๋ง๋ overflow-x: hidden์ ๋ฌด์กฐ๊ฑด ์ข์ ๊ฑด๊ฐ์?
A. ์๋ ์ ๊ฒ์
๋๋ค. ์ฌ์ดํธ ์ ์ฒด ๋ํผ(Wrapper)์ overflow-x: hidden์ ๋จ์ฉํ๋ฉด, ์ค๋งํธํฐ์ ๋ค์ดํฐ๋ธ ๊ด์ฑ ์คํฌ๋กค(๋ถ๋๋ฝ๊ฒ ๋ฐ๋ ค ๋ด๋ ค๊ฐ๋ ๋๋)์ด ๊นจ์ง๊ฑฐ๋ iOS ์ฌํ๋ฆฌ์์ ์คํฌ๋กค์ด ์์ ๋ฉ์ถ๋ ๋ฒ๊ทธ๊ฐ ์์ฃผ ๋ฐ์ํฉ๋๋ค. ์ ๋ ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ต์๋จ body, html { width: 100%; }๋ก ๋ค์ดํฐ๋ธ ์คํฌ๋กค์ ๋ณต๊ตฌํ๊ณ , ๊ฐ๋ก ์ฌ๋ฐฑ ์ฐจ๋จ์ฉ ํด๋์ค(.site-wrapper)์๋ง overflow-x ์์ฑ์ ์ ํ์ ์ผ๋ก ๊ฒฉ๋ฆฌํ์ฌ ์ ์ฉํ์ต๋๋ค.
๐ฌ ๋๊ธ 0๊ฐ