๐ 15. CSS ํ ์คํ : 'ํฝ์ ํผํํธ๋ฅผ ๋์ด์ ๊ฒฌ๊ณ ํจ'
๐ ๊ฐ์
๋๋์ค์ผ๋ก ํ์ธํ๋ ๋จ๊ณ๋ฅผ ๋์ด, ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ 200% ํ์ฉํ๊ณ ์๊ฐ์ ํ๊ท ํ ์คํธ(Visual Regression Test)๋ก ๋์์ธ์ ๋ณดํธํ๋ ๋ฒ์ ์์ฒ ์ด์ ํจ๊ป ์ฌ์ ์ ๋ง์นจํ๋ก ์ฐ์ด๋ด ๋๋ค.
๐ ์ด ๋ฌธ์๋ฅผ ์ฝ๊ธฐ ์ ์
โฑ๏ธ ์์ ์ฝ๊ธฐ ์๊ฐ: 10๋ถ(์ ์ฒด) / ํต์ฌ ํํธ๋ง: 5๋ถ
๐บ๏ธ ์ด ๋ฌธ์์ ํ๋ฆ
[๊ฐ๋ฐ์ ๋๊ตฌ์ ์จ๊ฒจ์ง ๋ณด๋ฌผ] โ [์ ๊ทผ์ฑ(Accessibility) ์ฒดํฌ] โ [์๊ฐ์ ํ๊ท ํ
์คํธ ์ ๋ต]
๐ฏ ์ด ๋ฌธ์๋ฅผ ๋ค ์ฝ์ผ๋ฉด ํ ์ ์๋ ๊ฒ
- ๋ธ๋ผ์ฐ์ ์ 'Inspector'์ 'Computed' ํญ์ ํ์ฉํด ์คํ์ผ ์ถฉ๋์ ๊ทผ๋ณธ ์์ธ์ ์ฐพ์๋ ๋๋ค.
- ์คํฌ๋ฆฐ ๋ฆฌ๋์ ๋ช ์ ๋๋น(Contrast)๋ฅผ ํ์ธํด ๋ชจ๋๋ฅผ ์ํ ์น์ ๋ง๋ญ๋๋ค.
- ์๋ํ๋ ๋๊ตฌ๋ก ๋ด ์ฝ๋๊ฐ ๋ค๋ฅธ ํ์ด์ง์ ๋์์ธ์ ๋ง๊ฐ๋จ๋ ธ๋์ง 1์ด ๋ง์ ํ์ธํฉ๋๋ค.
๐บ๏ธ ์ด ๋ฌธ์์ ๋ฐฐ๊ฒฝ ์ธ๊ณ๊ด: '์์๋ค ์ปค๋ฎค๋ํฐ'
- ๐ฃ ์์ฒ ( ์ ์ ): "์ํธ ๋! ์ด์ ์ ๊ฐ ๋ฉ์ธ ๋ฐฐ๋ ๊ณ ์ณค๋๋ฐ, ์ค๋ ๋ณด๋๊น ๋ฌ๊ธ์์ด ๋ง์ดํ์ด์ง ํธํฐ๊ฐ ๊นจ์ก๋์. ์์ ๋์ด ๋๋์ฒด ์ฝ๋๋ฅผ ์ด๋ป๊ฒ ์ง ๊ฑฐ๋๊ณ ์์ฒญ ํ๋ด์๋๋ฐ... ์ ๋ ๊ฑฐ๊ธธ ๊ฑด๋๋ฆฐ ์ ์ด ์๊ฑฐ๋ ์! ์ต์ธํด์! ๐ญ"
- ๐ฆ ์ํธ ( ๋ฆฌ๋ ): "์์ฒ ๋, CSS๋ ๊ฑฐ๋ํ ๊ฑฐ๋ฏธ์ค ๊ฐ์์ ํ๋๋ฅผ ๊ฑด๋๋ฆฌ๋ฉด ์ด๋๊ฐ ํ๋ค๋ฆด์ง ๋์ผ๋ก ๋ค ๋ณผ ์ ์์ฃ . ๊ทธ๋์ ์ฐ๋ฆฌ์๊ฒ '๋๊ตฌ'์ '์์คํ '์ด ํ์ํฉ๋๋ค. ์, ์ฐ๋ฆฌ๊ฐ ์ง ๋์์ธ์ ๋๊น์ง ์ฑ ์์ง๋ ๋ฒ์ ๊ฐ์ด๋์ ๋ง์ง๋ง ์ฅ์์ ๋ฐฐ์๋ด ์๋ค."
๐ค ์ ์์์ผ ํ๋๊ฐ
ํ๋ก ํธ์๋ ๊ฐ๋ฐ์์๊ฒ "์ด๊ฑฐ ์์ ํ๋ฉด ๋ค๋ฅธ ๋ฐ๋ ๊ด์ฐฎ๋์?"๋ผ๋ ์ง๋ฌธ์ ๊ฐ์ฅ ๋ฌด์์ด ์ง๋ฌธ์ ๋๋ค. ๋จ์ํ "๊ด์ฐฎ์ ๊ฑฐ์์"๋ผ๊ณ ๋ตํ๋ ๊ฑด ์ฃผ๋์ด์ ๋ฐฉ์์ ๋๋ค.
์๋์ด๋ "ํ ์คํธ ๊ฒฐ๊ณผ ์ด์ ์์ต๋๋ค" ๋ผ๊ณ ๋งํฉ๋๋ค. ๊ฐ๋ฐ์ ๋๊ตฌ๋ก ์ ๋ฐํ๊ฒ ๋๋ฒ๊น ํ๊ณ , ์ ๊ทผ์ฑ ์งํ๋ฅผ ํ์ธํ๋ฉฐ, ์๋ํ๋ ์๊ฐ ํ ์คํธ๋ก ์ ์ฒด ํ์ด์ง๋ฅผ ๊ฒ์ํ๋ ๋ฅ๋ ฅ! ์ด๊ฒ์ด 15์ฑํฐ๋ฅผ ๋ฌ๋ ค์จ ์์ฒ ์ด๊ฐ ๊ฐ์ ธ์ผ ํ ๋ง์ง๋ง ํผ์ฆ ์กฐ๊ฐ์ ๋๋ค.
๐ ๏ธ 1. ๊ฐ๋ฐ์ ๋๊ตฌ: ๋จ์ ๊ฒ์ฌ๋ฅผ ๋์ด์ ์คํ์ค
- Computed ํญ: ์๋ง์ CSS ์ค ๋ธ๋ผ์ฐ์ ๊ฐ **'์ต์ข ์ ์ผ๋ก ์ ํํ ๊ฐ'**์ ๋ณด์ฌ์ค๋๋ค. "๋ฒ์ธ์ ์ด ์์ ์์ด!"
- Flex/Grid Overlay: ๋์ ๋ณด์ด์ง ์๋ ์ถ๊ณผ ๊ทธ๋ฆฌ๋ ๋ผ์ธ์ ์๊ฐํํด์ค๋๋ค.
- Animations ํจ๋: ์ ๋๋ฉ์ด์ ์ ํ์๋ผ์ธ์ ๋๋ฆฌ๊ฒ ๋๋ ค๋ณด๋ฉฐ 1ํ๋ ์ ๋จ์๋ก ๋๋ฒ๊น ํ ์ ์์ต๋๋ค.
๐ฆ ์ํธ์ ๋ํ ์ผ:
"์คํ์ผ์ด ์ ๋จนํ ๋ ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ์์ ํด๋น ์์ฑ์ ์ค์ด ๊ฐ ์๋์ง, ์๋๋ฉด ์์ ๋ฆฌ์คํธ์ ์๋์ง๋ถํฐ ๋ณด์ธ์. ์ค์ด ๊ฐ ์๋ค๋ฉด ๋ช ์๋ ์ธ์์์ ์ง ๊ฑฐ๊ณ , ๋ฆฌ์คํธ์ ์๋ค๋ฉด ์คํ๋ ๋ก๋ ๋ฌธ์ ์ ๋๋ค."
โฟ 2. ์ ๊ทผ์ฑ(A11y): ๋ชจ๋์ ์น์ ์ํ์ฌ
๋์์ธ์ ๋์ผ๋ก๋ง ๋ณด๋ ๊ฒ ์๋๋๋ค.
- Lighthouse: ์ฑ๋ฅ๋ฟ๋ง ์๋๋ผ ์ ๊ทผ์ฑ ์ ์๋ฅผ ์ฒดํฌํด์ค๋๋ค.
- Color Contrast: ๋ฐฐ๊ฒฝ๊ณผ ๊ธ์์์ ๋๋น๊ฐ ๋๋ฌด ๋ฎ์ ์ฝ๊ธฐ ํ๋ ์ฌ๋๋ค์ ์ํด ๋ธ๋ผ์ฐ์ ๊ฐ ๊ฒฝ๊ณ ๋ฅผ ๋ณด๋ด์ค๋๋ค.
๐ฃ ์์ฒ : "์, ์ ๊ฐ ๊ณ ๋ฅธ ํ์คํ ํค ์์์ด ์๋งน์ธ ๋ถ๋ค์๊ฒ๋ ์์ ์ ๋ณด์ผ ์๋ ์๋ค๋ ๊ฑธ ์ฒ์ ์์์ด์. ์์ ๊ฒ๋ ์ค์ํ์ง๋ง '์ฝํ๋ ๊ฒ'์ด ๋จผ์ ๋ค์!"
๐ธ 3. ์๊ฐ์ ํ๊ท ํ ์คํธ (Visual Regression Testing)
- ์ ๋ต: ์ฝ๋ ์์ ์ (Before)๊ณผ ์์ ํ(After)์ ์คํฌ๋ฆฐ์ท์ ์ฐ์ด ํฝ์ ๋จ์๋ก ๋น๊ตํฉ๋๋ค. (Playwright, Cypress, Storybook-test-runner ๋ฑ ์ฌ์ฉ)
- ํจ๊ณผ: "๋ด๊ฐ ํธํฐ๋ฅผ ์ ๊ฑด๋๋ ค๋ ํธํฐ๊ฐ ๊นจ์ก๋์ง" ์ปดํจํฐ๊ฐ ์๋ ค์ค๋๋ค.
๐ ๋ง๋ฌด๋ฆฌ ํด์ฆ
Q1. ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ์์ ์๋ง์ CSS ๊ท์น ์ค '์ต์ข ์ ์ผ๋ก ์ ์ฉ๋ ์ง์ง ๊ฐ'๋ง ๋ชจ์์ ๋ณด์ฌ์ฃผ๋ ํญ์ ์ด๋ฆ์ ๋ฌด์์ธ๊ฐ์?
โ
์ ๋ต: Computed (๊ณ์ฐ๋จ) ํญ
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ:
Stylesํญ์๋ ๋ชจ๋ ์ ์ธ์ด ๋์ค์ง๋ง,Computedํญ์๋ ๋ช ์๋ ์ธ์์์ ์น๋ฆฌํ์ฌ ์ค์ ๋ก ๋ธ๋ผ์ฐ์ ๊ฐ ํ๋ฉด์ ๋ฐ์ํ๊ณ ์๋ ์ต์ข ์ ์ธ ํฝ์ ๊ฐ๋ค์ด ํ์๋ฉ๋๋ค. - ์ค๋ต ํผ๋๋ฐฑ: "์์ฒ ๋, ๋ฒ์ธ์ ์ฐพ์ผ๋ ค๋ฉด ์ฅ๋ถ๋ฅผ ๋ค ๋ณด์ง ๋ง๊ณ '์ต์ข ๊ฒฐ๊ณผ(Computed)'๋ถํฐ ํ์ธํ๋ ๊ฒ ๊ณ ์์ ๋๋ฒ๊น ์ต๊ด์ด์์!"
Q2. ์น ์ ๊ทผ์ฑ์ ํ๊ฐํ ๋, ํ ์คํธ์ ๋ฐฐ๊ฒฝ์ ๋ช ์ ๋๋น(Contrast Ratio)๊ฐ ์ต์ํ ๋์ด์ผ ํ๋ ํ์ค ๊ธฐ์ค(AA)์ ๋ณดํต ์ผ๋ง์ธ๊ฐ์?
- 1.5:1
- 3.0:1
- 4.5:1
- 10:1
โ
์ ๋ต: 3. 4.5:1
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ: WCAG 2.0 ํ์ค์ ๋ฐ๋ฅด๋ฉด ์ผ๋ฐ ํ ์คํธ์ ๊ฒฝ์ฐ ๊ฐ๋ ์ฑ์ ํ๋ณดํ๊ธฐ ์ํด ์ต์ 4.5:1์ ๋ช ์๋น๋ฅผ ๊ถ์ฅํฉ๋๋ค. (ํฐ ๊ธ์๋ 3:1)
- ์ค๋ต ํผ๋๋ฐฑ: "์์ฒ ๋, ์์ ์๋ณด๋ค ์ ์ฝํ๋ ์์ด ๋จผ์ ์์. ๊ฐ๋ฐ์ ๋๊ตฌ์ ์ ์ํ์ ํญ์ ์ฒดํฌํด๋ณด์ธ์!"
Q3. [์์ฒ ์ด์ ํ
์คํธ ํ์: ์ ํ์ ํ์]
์์ ๋์ด "์์ผ๋ก ์คํ์ผ ์์ ํ ๋๋ง๋ค ์ ์ ๊ฒ์ฌํ๋ ๊ฒ ๋๋ฌด ์๊ฐ ๋ญ๋น์์. ์๋ํํ ์ ์๋์?"๋ผ๊ณ ํ์ญ๋๋ค. ์์ฒ ์ด๊ฐ ์ ์ํ ์ ์๋ ๊ฐ์ฅ ์ ๋ฌธ์ ์ธ ๊ธฐ์ ์คํ์ ๋ฌด์์ผ๊น์?
โ
์ ๋ต: Storybook๊ณผ Playwright๋ฅผ ๊ฒฐํฉํ์ฌ ์ฃผ์ UI ์ปดํฌ๋ํธ์ ์๊ฐ์ ํ๊ท ํ
์คํธ(Visual Regression Testing)๋ฅผ ๋์
ํ๋ค.
๐ก ์์ธ ํด์ค:
- ์๋ฆฌ ์ค๋ช : ์ปดํฌ๋ํธ๋ค์ Storybook์ ๋ชจ์๋๊ณ , ์ฝ๋ ๋ณ๊ฒฝ ์๋ง๋ค ์๋์ผ๋ก ์ค๋ ์ท์ ์ฐ์ด ๊ณผ๊ฑฐ์ ๋น๊ตํ๋ฉด ๋ฏธ์ธํ ๋ ์ด์์ ๊นจ์ง๋ 100% ์ก์๋ผ ์ ์์ต๋๋ค.
- ์ค๋ต ํผ๋๋ฐฑ: "์์ฒ ๋, ๋์ผ๋ก ํ์ธํ๋ ๊ฑด ํ๊ณ๊ฐ ์์ด์. ๊ธฐ๊ณ์ ๋(ํ ์คํธ ์๋ํ)์ ๋ฏฟ์ผ์ธ์."
- ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: "๋์์ธ์ ํํ๋ ์๋ํ๊ฐ ์งํจ๋ค!"
๐ฃ ์์ฒ ์ด์ ํด๊ทผ ์ผ๊ธฐ
๋๋์ด 15์ฅ์ ๊ฐ์ด๋๊ฐ ๋ชจ๋ ๋๋ฌ๋ค!
์ฒ์ 1px ๋๋ฌธ์ ๋ฐค์๋ ์์ฒ ์ด๊ฐ, ์ด์ ๋ ๋ธ๋ผ์ฐ์ ๋ ๋๋ง ์์ง์ ๊ณ ๋ฏผํ๊ณ ํ
์คํธ ์๋ํ๋ฅผ ๋
ผํ๋ ๊ฐ๋ฐ์๊ฐ ๋๋ค๋... ๋๋ ์ฐธ ๋ง์ด ์ปธ๋ค.
๐ก "CSS๋ ๋์ด ์๋๋ผ ์์์ด๋ค. ์ฐ๋ฆฌ๊ฐ ์ด ์ฝ๋ ํ ์ค์ด ๋๊ตฐ๊ฐ์๊ฒ๋ ์ต๊ณ ์ ๊ฒฝํ์ด ๋๊ณ , ๋๊ตฐ๊ฐ์๊ฒ๋ ๊ฒฌ๊ณ ํ ์ ๋ขฐ๊ฐ ๋๋ค."
์ํธ ๋์ด "์ด์ ๋ ํผ์์๋ ์ํ ์ ์์ ๊ฑฐ๋ค"๋ผ๋ฉฐ ๋ฑ์ ๋๋๋ ค ์ฃผ์
จ๋ค. ์์ ๋๋ "์์ฆ ๋ ์ด์์ ๋ฒ๊ทธ๊ฐ ํ ์ค์๋ค?"๋ผ๋ฉฐ ์์ง๋ฅผ ์น์ผ์ธ์ฐ์
จ๊ณ .
๊ฐ์ด๋๋ ์ฌ๊ธฐ์ ๋๋์ง๋ง, ์น์ ์ธ๊ณ๋ ๊ณ์ ๋ณํ๊ฒ ์ง. ํ์ง๋ง ๋๋ ๋๋ ต์ง ์๋ค. ์๋ฆฌ๋ฅผ ์์์ผ๋๊น!
์ค๋์ ์ํธ ๋, ์์ ๋, ์์ ๋ ๋ค ๊ฐ์ด ์์ก์ ์์ฃผ ํ ์ ํ๋ฌ ๊ฐ๊ธฐ๋ก ํ๋ค. ์์ฒ ์ด, ๋๋์ด ์ง์ง ๊ฐ๋ฐ์๋ก ์
์ฌ ์ฑ๊ณต์ด๋ค! ๐