๐ 15. CSS ํ ์คํ : 'ํฝ์ ํผํํธ๋ฅผ ๋์ด์ ๊ฒฌ๊ณ ํจ'
๐ ๊ฐ์
๋๋์ค์ผ๋ก ํ์ธํ๋ ๋จ๊ณ๋ฅผ ๋์ด, ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ 200% ํ์ฉํ๊ณ ์๊ฐ์ ํ๊ท ํ ์คํธ(Visual Regression Test)๋ก ๋์์ธ์ ๋ณดํธํ๋ ๋ฒ์ ์์ฒ ์ด์ ํจ๊ป ์ฌ์ ์ ๋ง์นจํ๋ก ์ฐ์ด๋ด ๋๋ค.
๐ ์ด ๋ฌธ์๋ฅผ ์ฝ๊ธฐ ์ ์
โฑ๏ธ ์์ ์ฝ๊ธฐ ์๊ฐ: 10๋ถ(์ ์ฒด) / ํต์ฌ ํํธ๋ง: 5๋ถ
๐บ๏ธ ์ด ๋ฌธ์์ ํ๋ฆ
[๊ฐ๋ฐ์ ๋๊ตฌ์ ์จ๊ฒจ์ง ๋ณด๋ฌผ] โ [์ ๊ทผ์ฑ(Accessibility) ์ฒดํฌ] โ [์๊ฐ์ ํ๊ท ํ
์คํธ ์ ๋ต]
๐ฏ ์ด ๋ฌธ์๋ฅผ ๋ค ์ฝ์ผ๋ฉด ํ ์ ์๋ ๊ฒ
- ๋ธ๋ผ์ฐ์ ์ 'Inspector'์ 'Computed' ํญ์ ํ์ฉํด ์คํ์ผ ์ถฉ๋์ ๊ทผ๋ณธ ์์ธ์ ์ฐพ์๋ ๋๋ค.
- ์คํฌ๋ฆฐ ๋ฆฌ๋์ ๋ช ์ ๋๋น(Contrast)๋ฅผ ํ์ธํด ๋ชจ๋๋ฅผ ์ํ ์น์ ๋ง๋ญ๋๋ค.
- ์๋ํ๋ ๋๊ตฌ๋ก ๋ด ์ฝ๋๊ฐ ๋ค๋ฅธ ํ์ด์ง์ ๋์์ธ์ ์ํฅ์ ์คฌ๋์ง ๋น ๋ฅด๊ฒ ํ์ธํฉ๋๋ค.
๐บ๏ธ ์ด ๋ฌธ์์ ๋ฐฐ๊ฒฝ ์ธ๊ณ๊ด: '์์๋ค ์ปค๋ฎค๋ํฐ'
- ๐ฃ ์์ฒ (๊ฐ์ด๋ ํ๋ฐ๋ถ ์ค๋ฌด์): "์ํธ ๋! ์ด์ ๋ฉ์ธ ๋ฐฐ๋๋ฅผ ๊ณ ์ณค๋๋ฐ ์ค๋ ๋ง์ดํ์ด์ง ํธํฐ ๊ฐ๊ฒฉ๋ ๋ฌ๋ผ์ก๋ค๋ ๋ฆฌํฌํธ๊ฐ ์์ต๋๋ค. ์ ๊ฐ ๊ทธ ํ์ผ์ ์ง์ ์์ ํ์ง ์์๋๋ผ๋ ์ ์ญ CSS ์ํฅ์ผ ์ ์๊ฒ ์ฃ ?"
- ๐ฆ ์ํธ (๋ฆฌ๋): "๋ง์์. 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์ ๋ชจ์๋๊ณ , ์ฝ๋ ๋ณ๊ฒฝ ์๋ง๋ค ์๋์ผ๋ก ์ค๋ ์ท์ ์ฐ์ด ๊ณผ๊ฑฐ์ ๋น๊ตํ๋ฉด ์ฌ๋์ด ๋์น๊ธฐ ์ฌ์ด ๋ ์ด์์ ๋ณํ๋ฅผ ๋น ๋ฅด๊ฒ ๋ฐ๊ฒฌํ ์ ์์ต๋๋ค. ๋ค๋ง ์๋ํ ๋ณ๊ฒฝ๋ ์ฐจ์ด๋ก ์กํ๋ฏ๋ก ์น์ธ ์ ์ฐจ๊ฐ ํจ๊ป ํ์ํฉ๋๋ค.
- ์ค๋ต ํผ๋๋ฐฑ: "์์ฒ ๋, ๋์ผ๋ก ํ์ธํ๋ ๊ฑด ํ๊ณ๊ฐ ์์ด์. ํ ์คํธ ์๋ํ๋ก ๋ณํ ์ง์ ์ ๋จผ์ ์ฐพ๊ณ , ์ฌ๋์ด ์๋ํ ๋ณ๊ฒฝ์ธ์ง ํ๋จํด์ผ ํฉ๋๋ค."
- ๐ ํต์ฌ ๊ธฐ์ต๋ฒ: "๋์์ธ์ ํํ๋ ์๋ํ๊ฐ ์งํจ๋ค!"
๐ฃ ์์ฒ ์ด์ ํด๊ทผ ์ผ๊ธฐ
๋๋์ด 15์ฅ์ ๊ฐ์ด๋๊ฐ ๋ชจ๋ ๋๋ฌ๋ค!
์ฒ์ 1px ๋๋ฌธ์ ๋ฐค์๋ ์์ฒ ์ด๊ฐ, ์ด์ ๋ ๋ธ๋ผ์ฐ์ ๋ ๋๋ง ์์ง์ ๊ณ ๋ฏผํ๊ณ ํ
์คํธ ์๋ํ๋ฅผ ๋
ผํ๋ ๊ฐ๋ฐ์๊ฐ ๋๋ค๋... ๋๋ ์ฐธ ๋ง์ด ์ปธ๋ค.
๐ก "CSS๋ ๋์ด ์๋๋ผ ์์์ด๋ค. ์ฐ๋ฆฌ๊ฐ ์ด ์ฝ๋ ํ ์ค์ด ๋๊ตฐ๊ฐ์๊ฒ๋ ์ต๊ณ ์ ๊ฒฝํ์ด ๋๊ณ , ๋๊ตฐ๊ฐ์๊ฒ๋ ๊ฒฌ๊ณ ํ ์ ๋ขฐ๊ฐ ๋๋ค."
์ํธ ๋์ด "์ด์ ๋ ํ๋ฉด์ ๊ณ ์น๋ ์ฌ๋์ ๋์ด ํ์ง์ ์ค๋ช
ํ๋ ์ฌ๋์ด ๋๋ค"๋ผ๊ณ ํด์ฃผ์
จ๋ค. ์์ ๋๋ "์์ฆ ๋ ์ด์์ ๋ฆฌํฌํธ์ ์ฌํ ์กฐ๊ฑด์ด ๊ฐ์ด ์ค๋ ํ์ธ์ด ๋นจ๋ผ์ก๋ค"๊ณ ํ์
จ๊ณ .
๊ฐ์ด๋๋ ์ฌ๊ธฐ์ ๋๋์ง๋ง, ์น์ ์ธ๊ณ๋ ๊ณ์ ๋ณํ๊ฒ ์ง. ๊ทธ๋๋ ์ด์ ๋ ๋๋ ต๊ธฐ๋ณด๋ค ํ์ธํ ์ฒดํฌ๋ฆฌ์คํธ๊ฐ ๋จผ์ ๋ ์ค๋ฅธ๋ค. ์๋ฆฌ๋ฅผ ๋ฐฐ์ ๊ณ , ๊ฒ์ฆํ๋ ๋ฐฉ๋ฒ๋ ๋ฐฐ์ ์ผ๋๊น.