์žฌ๋ฐŒ๊ฒŒ ํ•ฉ์‹œ๋‹ค

๊ธฐ๋กํ•˜๊ธฐ, ๊ฐ€์‹œํ™”ํ•˜๊ธฐ

ํ”„๋กœ์ ํŠธ ๊ธฐ๋ก/YSS | ์—ฐ์„ธ๋Œ€ํ•™๊ต ๊ณต๊ฐ„๋Œ€๊ด€ ์„œ๋น„์Šค

ํ† ์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์œ„ํ•œ css ๋ฐฉ์‹ ๊ฒฐ์ •ํ•˜๊ธฐ

์€๋˜๋”” 2022. 8. 10. 23:50

๐Ÿงธ ๐Ÿš‚ ๐ŸŽˆ ์ƒˆ๋กœ์šด ํ† ์ด ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉํ•  css ๋ฐฉ์‹์„ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด
์ง์ ‘ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ์‹๋“ค์„ ์กฐ์‚ฌํ•˜๊ณ  ์žฅ๋‹จ์ ์„ ๋น„๊ตํ•ด ๋ดค๋‹ค!
๐Ÿ™‹๐Ÿป‍โ™‚๏ธ

๐ŸŽˆ ๊ณ ๋ คํ•œ ์„ ํƒ์ง€

  • css module
  • css preprocessor(scss)
  • css-in-js(styled-components)

์ปดํฌ๋„ŒํŠธ๋ฅผ ์ง์ ‘ ์ œ์ž‘ํ•ด๋ณด๊ณ  ์‹ถ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— Tailwind CSS, Bootstrap, Material UI ๋“ฑ์˜ CSS Framework๋Š” ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜๋‹ค.

โ—๏ธ ๊ธฐ์กด css๊ฐ€ ๊ฐ€์ง€๋Š” ๋ฌธ์ œ์ 

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

์„ธ ๊ฐ€์ง€ ์„ ํƒ์ง€ ๋ชจ๋‘, ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

1๏ธโƒฃ css module

  • ๊ธฐ์กด css์™€ ์œ ์‚ฌํ•˜๋‚˜ ํŒŒ์ผ์˜ ํ™•์žฅ์ž๋ช…์ด ๋‹ค๋ฅด๋‹ค. ( .css๊ฐ€ ์•„๋‹Œ .css.module.css)
  • css module๋กœ ์ž‘์„ฑํ•  ๊ฒฝ์šฐ ํด๋ž˜์Šค๋ช…์ด ์ž๋™์œผ๋กœ ํ•ด์‹ฑ๋œ๋‹ค! ํด๋ž˜์Šค๋ช…์ด ์ž๋™์œผ๋กœ ๊ณ ์œ ํ•œ ๊ฐ’์„ ๊ฐ–๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์—ฌ๋Ÿฌ css ํŒŒ์ผ์—์„œ ๋™์ผํ•œ ํด๋ž˜์Šค๋ช…์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ์Šคํƒ€์ผ ์ค‘์ฒฉํ˜„์ƒ์ด ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค.

2๏ธโƒฃ css pre-processor(sass)

  • ๊ธฐ์กด css์— ์ƒˆ๋กœ์šด ๋ฌธ๋ฒ•์ด ๋”ํ•ด์ง„ ์–ธ์–ด๋กœ์„œ, ์‹ค์ œ ๋™์ž‘ ์‹œ์—๋Š” ์ˆœ์ˆ˜ css๋กœ ๋ณ€ํ™˜๋œ๋‹ค.
    ์Šคํƒ€์ผ ์ค‘์ฒฉํ˜„์ƒ์˜ ํ•ด๊ฒฐ ๋ฟ ์•„๋‹ˆ๋ผ ๋ฐ˜๋ณต์ ์ธ ์Šคํƒ€์ผ ์ž‘์„ฑ์„ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ๋ฌธ๋ฒ•๋“ค์„ ์ œ๊ณตํ•œ๋‹ค.
  • ๊ธฐ์กด css, css module๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ณ„๋„์˜ css ํŒŒ์ผ์— ์Šคํƒ€์ผ์„ ์ž‘์„ฑํ•œ๋‹ค.
  • ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” css pre-processor๋กœ๋Š” Sass๊ฐ€ ์žˆ๋‹ค.

3๏ธโƒฃ css-in-js(styled-components)

  • ๋ณ„๋„์˜ css ํŒŒ์ผ์ด ์•„๋‹Œ JS ํŒŒ์ผ ๋‚ด์— ์Šคํƒ€์ผ์„ ์ž‘์„ฑํ•œ๋‹ค๋Š” ์ ์ด ๊ฐ€์žฅ ํฐ ์ฐจ์ด์ ์ด๋‹ค.
  • ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋Š” css-in-js๋กœ๋Š” styled-components๊ฐ€ ์žˆ๋‹ค.
  • ๋‹ค๋ฅธ ๋‘ ๋ฐฉ์‹์— ๋น„ํ•ด ์†๋„๊ฐ€ ๋Š๋ฆฌ๋‹ค. JS๋ฅผ ํ•ด์„ํ•˜๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
  • (styled-components) ํด๋ž˜์Šค๋ช…์„ ํ™œ์šฉํ•˜์ง€ ์•Š๊ณ , ์Šคํƒ€์ผ์ด ์ž…ํ˜€์ง„ ์—˜๋ฆฌ๋จผํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

๊ธฐ์กด css
: ์—˜๋ฆฌ๋จผํŠธ์— ํด๋ž˜์Šค๋ช…์„ ํ™œ์šฉํ•ด ์Šคํƒ€์ผ์„ ์ ์šฉํ•œ๋‹ค.

function App() {
    return <div className="title">Hello</div>;

// style.css
.title {
    color: blue;
}

styled-components
: ์Šคํƒ€์ผ์ด ์ž…ํ˜€์ง„ ์—˜๋ฆฌ๋จผํŠธ ์ž์ฒด๋ฅผ ์ƒ์„ฑํ•ด ์‚ฌ์šฉํ•œ๋‹ค.

function App() {
    return <StyledDiv>Hello</StyledDiv>

const StyledDiv = styled.div`
    color: blue;
`

๐Ÿ™‹๐Ÿป‍โ™‚๏ธ ๋‚ด ๊ฒฐ์ •

๊ฒฐ๋ก ์ ์œผ๋กœ ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” Sass๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค. ์ด์œ ๋Š” ์•„๋ž˜์™€ ๊ฐ™๋‹ค.

  • styled-components๋ฅผ ์‚ฌ์šฉํ–ˆ์—ˆ์„ ๋•Œ ๋Š๊ผˆ๋˜ ๋ถˆํŽธํ•จ
    • ์žฌ์‚ฌ์šฉ์„ฑ์ด ๋–จ์–ด์ง„๋‹ค.
      ์Šคํƒ€์ผ์ด JS ํŒŒ์ผ ์•ˆ์— ์ž‘์„ฑ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์Šคํƒ€์ผ ์ฝ”๋“œ๋ฅผ ๋ณด๊ธฐ ์œ„ํ•ด์„œ๋Š” JS ํŒŒ์ผ์„ ์—ด์–ด๋ด์•ผ๋งŒ ํ–ˆ๋‹ค. ์Šคํƒ€์ผ ๊ฐ„์˜ ์œ„๊ณ„๋ฅผ ํ•œ ๋ˆˆ์— ํŒŒ์•…ํ•  ์ˆ˜ ์—†์–ด์„œ, ํŒŒ์ผ์ด ๋งŽ์•„์งˆ์ˆ˜๋ก ๋™์ผํ•œ ์Šคํƒ€์ผ์ด ๋ณ„๋„์˜ JS ํŒŒ์ผ์— ์—ฌ๋Ÿฌ ๋ฒˆ ์ž‘์„ฑ๋˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜๋‹ค.
    • ์—˜๋ฆฌ๋จผํŠธ ์ด๋ฆ„ ์ง“๋Š” ๊ฒŒ ์ƒ๊ฐ๋ณด๋‹ค ์—„์ฒญ ๊ท€์ฐฎ๋‹ค ๐Ÿ˜‘ ๊ทธ๋ฆฌ๊ณ  ์•ˆ์˜ˆ์˜๋‹ค.
  • styled-components์˜ ์žฅ์ ์„ sass๋กœ๋„ ์ถฉ๋ถ„ํžˆ ์ปค๋ฒ„๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
    ์•„์ง sass๋ฅผ ์ œ๋Œ€๋กœ ์‚ฌ์šฉํ•ด๋ณด์ง€๋Š” ์•Š์•˜์ง€๋งŒ, styled-components์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š” props๋ฅผ ์ด์šฉํ•œ ์Šคํƒ€์ผ๋ง์„ sass์˜ mixin์œผ๋กœ ์ถฉ๋ถ„ํžˆ ๋Œ€์ฒดํ•  ์ˆ˜ ์žˆ์–ด ๋ณด์ธ๋‹ค.
  • ๋Š๋ฆฐ ์„ฑ๋Šฅ์„ ์ปค๋ฒ„ํ•  ๋งŒํผ css-in-js์˜ ์žฅ์ ์ด ์™€๋‹ฟ์ง€ ์•Š๋Š”๋‹ค. ์ธํ„ด ๋•Œ์—๋Š” ๋ณ„ ์กฐ์‚ฌ ์—†์ด “๋ฆฌ์•กํŠธ์—๋Š” styled-components๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค๋”๋ผ~”๋ผ๊ณ  ํ•ด์„œ styled-components๋ฅผ ์‚ฌ์šฉํ–ˆ์—ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์ด๋ฒˆ์— ์ฐพ์•„๋ณด๋‹ˆ ์ „์ฒด ์›น์‚ฌ์ดํŠธ ์ค‘์—์„œ css-in-js๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์›น์‚ฌ์ดํŠธ์˜ ๋น„์œจ์€ 3% ๋ฐ–์— ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ํ•œ๋‹ค.
  • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ์Šคํƒ€์ผ์ด ํ•œ ํŒŒ์ผ ์•ˆ์— ์„ž์—ฌ ์žˆ๋Š”๊ฒŒ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š๊ฒŒ ๋Š๊ปด์ง„๋‹ค.

๋ฌผ๋ก  ๋‚ด๊ฐ€ styled-components์˜ ์‚ฌ์šฉ ๋ชฉ์ ์„ ์˜จ์ „ํžˆ ์ดํ•ดํ•˜๊ณ  ์ž˜ ํ™œ์šฉํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง„ ์•Š๋Š”๋‹ค… ๊ทธ ์ธํ„ด์ƒํ™œ์€ ์ •๋ง ์ฃผ๋จน๊ตฌ๊ตฌ์˜ ๋์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์—. ๋‹ค๋งŒ ์—˜๋ฆฌ๋จผํŠธ ์ด๋ฆ„ ์ง“๋Š” ๊ฑด ์ง„์งœ ๊ท€์ฐฎ์•˜๊ณ  ์ŠคํŠธ๋ ˆ์Šค ๋ฐ›์•˜๋‹ค. -> ์‚ฌ์‹ค ์ด๊ฒŒ ๊ฐ€์žฅ ํผ๐Ÿ˜ก ํ†ต์ผ์„ฑ ์—†๋Š” ๋„ค์ด๋ฐ ์ง„์งœ ์‹ซ์€๋ฐ ์ง“๋‹ค๋ณด๋ฉด ๊ณ„์† ๊ธธ์–ด์ง€๊ณ  ๊ทœ์น™๋„ ์‚ฌ๋ผ์ง„๋‹ค.

 


๊ทธ๋ƒฅ ๋‹ค๋“ค ์จ์„œ ์“ฐ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ์ง์ ‘ ๋น„๊ตํ•ด์„œ ๊ฒฐ์ •ํ•˜๋‹ˆ ์žฌ๋ฐŒ๋‹ค. “๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ/ํ”„๋ ˆ์ž„์›Œํฌ์˜ ๋ณธ๋ž˜ ์šฉ๋„์™€ ์ฒ ํ•™์„ ๊ณผ์—ฐ ์–ผ๋งŒํผ ์ดํ•ดํ•˜๊ณ  ๊ทธ์— ๋งž๊ฒŒ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”๊ฐ€?” ๐Ÿ‘‰ ์ด๊ฒŒ ์š”์ฆ˜ ๋‚ด ์ตœ๋Œ€ ๊ด€์‹ฌ์‚ฌ๋‹ค. ๊ฐ ๋„๊ตฌ์˜ ์ฒ ํ•™์„ ์ดํ•ดํ•˜๊ณ  ์ ์žฌ์ ์†Œ์— ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๊ณ  ์‹ถ๋‹ค๋Š” ์ƒ๊ฐ์„ ํ•œ๋‹น.