CSS : CSS-in-CSS vs CSS-in-JS

daymoon_ยท2022๋…„ 3์›” 1์ผ
1

CSS

๋ชฉ๋ก ๋ณด๊ธฐ
10/18
post-thumbnail

โœ… ๋“ค์–ด๊ฐ€๊ธฐ ์ „

์›น์ด ์ ์  ๋ณต์žกํ•ด์ง€๊ณ  ๋™์  ๊ธฐ๋Šฅ ์š”๊ตฌ๊ฐ€ ์ฆ๊ฐ€ํ•˜๋ฉด์„œ HTML๊ณผ CSS๋งŒ์œผ๋กœ ํ™”๋ฉด์˜ ๋ชจ๋“  ์Šคํƒ€์ผ์„ ์ œ์–ดํ•  ์ˆ˜ ์—†๋Š” ์ƒํ™ฉ์ด ๋˜์—ˆ๋‹ค.

์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์Šคํƒ€์ผ ๊ตฌ์„ฑ ๋ฐฉ์‹์ด ๋“ฑ์žฅํ–ˆ์œผ๋ฉฐ ํฌ๊ฒŒ ๋‘ ๊ฐˆ๋ž˜๋กœ ๋‚˜๋‰˜์–ด ์ง„๋‹ค.

๐Ÿช„ ์›น ์ปดํฌ๋„ŒํŠธ ์Šคํƒ€์ผ๋ง ๊ด€๋ฆฌ ์ข…๋ฅ˜

  • CSS-in-CSS
  • CSS-in-JS

๐Ÿ—‚๏ธ CSS-in-CSS

๐Ÿ“Œ ์ฐธ๊ณ ์ž๋ฃŒ
์‚ผ์„ฑ ์›น ์ปดํฌ๋„ŒํŠธ ์Šคํƒ€์ผ๋ง ๊ด€๋ฆฌ
๊พธ๋ฐˆ์—†๋Š” [CSS] CSS๋ฅผ ๋Œ€์ฒดํ•  CSS in CSS์™€ CSS in JS์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž (CSS Module , SCSS ๋“ฑ)


๐ŸŽจ CSS ๋ชจ๋“ˆ(Module)

๐Ÿ“Œ ์ฐธ๊ณ ์ž๋ฃŒ
Sel์˜ ์ƒ๊ฐ์ €์žฅ์†Œ CSS ๋ชจ๋“ˆํ™”์˜ ์ค‘์š”์„ฑ
Javascript Stuff What are CSS Modules? A visual introduction

CSS ๋ชจ๋“ˆ์€ CSS๋ฅผ ๋ชจ๋“ˆํ™” ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค. CSS ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๋ฉด ์ž๋™์œผ๋กœ ๊ณ ์œ ํ•œ ํด๋ž˜์Šค๋„ค์ž„์„ ๋งŒ๋“ค์–ด์„œ scope๋ฅผ ์ง€์—ญ์ ์œผ๋กœ ์ œํ•œํ•œ๋‹ค. ๋ชจ๋“ˆํ™”๋œ CSS๋ฅผ ๋ฒˆ๋“ค๋Ÿฌ๋กœ ๋ถˆ๋Ÿฌ์˜ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ–ˆ๋˜ ํด๋ž˜์Šค ๋„ค์ž„๊ณผ ๊ณ ์œ ํ•œ ํด๋ž˜์Šค๋„ค์ž„์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๊ฐ์ฒด๊ฐ€ ๋ฐ˜ํ™˜๋œ๋‹ค.

๐Ÿช„ ์žฅ์ 

  • CSS ํด๋ž˜์Šค ์ค‘๋ณต ํ•ด๊ฒฐ
  • ๋„ค์ด๋ฐ ๊ทœ์น™ ๊ฐ„์†Œํ™”
  • ํด๋ž˜์Šค ์žฌ์‚ฌ์šฉ ์šฉ์ด

๐Ÿช„ ๋‹จ์ 

  • ์œ ์ง€ ๋ณด์ˆ˜ ์ง€์˜ฅ โ–ถ ์ง€๋‚˜์นœ ๋ชจ๋“ˆํ™”๋Š” ์œ ์ง€ ๋ณด์ˆ˜ ๋ฐ ์žฌ์‚ฌ์šฉ์ด ํž˜๋“ค์–ด์ง„๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด, ์ด๋Ÿฌํ•œ ๋”์ฐํ•œ ์ƒํ™ฉ์ด ์˜ฌ ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ“ ์˜ˆ์‹œ

  • Box.module.css
.Box {
	background: blue;
    color: while;
    padding: 2rem;
}
  • Box.js
// CSS module import 
import styles from "./Box.moudule.css";

const Box = () => {
	retrun(
    	<>
        	<div className={styles.Box}>{styles.Box}</div>;
        </>
    
    );
}

export default Box;

๐ŸŽจ CSS ์ „์ฒ˜๋ฆฌ๊ธฐ(Preprocessor)

๐Ÿ“Œ ์ฐธ๊ณ ์ž๋ฃŒ
The State of CSS 2021: ์ „/ํ›„์ฒ˜๋ฆฌ๊ธฐ
MDN CSS ์ „์ฒ˜๋ฆฌ๊ธฐ

CSS ์ „์ฒ˜๋ฆฌ๊ธฐ๋Š” ์ „์ฒ˜๋ฆฌ๊ธฐ์˜ ์ž์‹ ๋งŒ์˜ ํŠน๋ณ„ํ•œ syntax๋ฅผ ๊ฐ€์ง€๊ณ  CSS๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์ด๋‹ค. CSS์˜ ๋ฌธ์ œ์ ์„ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹, ์ฆ‰ ๋ณ€์ˆ˜/ํ•จ์ˆ˜/์ƒ์† ๋“ฑ ์ผ๋ฐ˜์ ์ธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ฐœ๋…์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ณด์™„ํ•œ๋‹ค.

CSS ์ „์ฒ˜๋ฆฌ๊ธฐ์—๋Š” ๋‹ค์–‘ํ•œ ๋ชจ๋“ˆ์ด ์กด์žฌํ•œ๋‹ค.

๐Ÿช„ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ชจ๋“ˆ ์ข…๋ฅ˜

  • Sass
  • Less
  • Post CSS
  • Stylus
  • Assembler CSS โœจNEWโœจ

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

๋‹จ์ ์œผ๋กœ ์ „์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์œ„ํ•œ ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ•˜๊ณ  ๋‹ค์‹œ ์ปดํŒŒ์ผํ•˜๋Š”๋ฐ ์‹œ๊ฐ„์ด ์†Œ์š”๋œ๋‹ค.


๐Ÿช„ ๋น„์œจ ์ˆœ์œ„

๋งŒ์กฑ๋„๊ด€์‹ฌ๋„์‚ฌ์šฉ๋Ÿ‰์ธ์ง€๋„
๋‹ค์‹œ ์‚ฌ์šฉํ•  ์˜ˆ์ • / (๋‹ค์‹œ ์‚ฌ์šฉํ•  ์˜ˆ์ • + ๋‹ค์‹œ ์‚ฌ์šฉ ์•ˆํ•จ)๋ฐฐ์šฐ๊ธธ ์›ํ•จ / (๋ฐฐ์šฐ๊ธธ ์›ํ•จ + ๊ด€์‹ฌ ์—†์Œ)(๋‹ค์‹œ ์‚ฌ์šฉํ•  ์˜ˆ์ • + ๋‹ค์‹œ ์‚ฌ์šฉ ์•ˆํ•จ) / ์ „๋ถ€(์ „๋ถ€ - ๋“ค์–ด๋ณธ ์  ์—†์Œ) / ์ „๋ถ€

  • ๋งŒ์กฑ๋„

  • ๊ด€์‹ฌ๋„

  • ์‚ฌ์šฉ๋Ÿ‰

  • ์ธ์ง€๋„


๐Ÿ“ Sass

๐Ÿ“Œ ์ฐธ๊ณ ์ž๋ฃŒ
Sass ๊ณต์‹ ๋ฌธ์„œ

Sass๋Š” ์ „์ฒ˜๋ฆฌ๊ธฐ ์ค‘ ๊ฐ€์žฅ ๋จผ์ € ์ถœ์‹œ๋˜์—ˆ๋‹ค. ์ดˆ๊ธฐ์—๋Š” ๋ฃจ๋น„(Ruby) ์–ธ์–ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ๋™๋˜์—ˆ๋Š”๋ฐ ์–ธ์–ด๊ฐ€ ์ง€๋‹Œ ํ•œ๊ณ„๋กœ ์ปดํŒŒ์ผ ์†๋„๊ฐ€ ๋Š๋ ค ํ›„๋ฐœ ์ฃผ์ž์ธ Less์— ์ถ”์›”๋‹นํ•œ๋‹ค. ํ•˜์ง€๋งŒ Node-sassํ•˜๋Š” Node.js ๊ธฐ๋ฐ˜์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ๋‚˜์˜ค๋ฉด์„œ ๋‹ค์‹œ ์ธ๊ธฐ๋ฅผ ์–ป๊ณ  ์žˆ๋‹ค.


๐Ÿ“ Less

๐Ÿ“Œ ์ฐธ๊ณ ์ž๋ฃŒ
Less ๊ณต์‹ ๋ฌธ์„œ

Less๋Š” ํŠธ์œ„ํ„ฐ์˜ ๋ถ€ํŠธ์ŠคํŠธ๋žฉ(Bootstrap)์— ์‚ฌ์šฉ๋˜๋ฉด์„œ ์•Œ๋ ค์กŒ๋‹ค. ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ๋ฌธ๋ฒ•์„ ์ทจํ•˜๊ณ  ์žˆ์œผ๋ฉฐ Node.js ๊ธฐ๋ฐ˜์œผ๋กœ ๊ตฌ๋™๋œ๋‹ค.


๐Ÿ“ PostCSS

๐Ÿ“Œ ์ฐธ๊ณ ์ž๋ฃŒ
PostCSS ๊ณต์‹ ๋ฌธ์„œ
wikipedia PostCSS

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

Sass์™€ Less์™€ ๋‹ฌ๋ฆฌ PostCSS๋Š” CSS ์ปดํŒŒ์ผ ํ‹€ ์–ธ์–ด๊ฐ€ ์•„๋‹Œ CSS ๋„๊ตฌ ๊ฐœ๋ฐœ์„ ์œ„ํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ Sass์™€ Less์™€ ๊ฐ™์€ ํ‹€ ์–ธ์–ด๋ฅผ ๊ฐœ๋ฐœํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ“ Stylus

๐Ÿ“Œ ์ฐธ๊ณ ์ž๋ฃŒ
Stylus ๊ณต์‹ ๋ฌธ์„œ

์ƒ๋Œ€์ ์œผ๋กœ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ํŠน์ง•์„ ๋งŽ์ด ๊ฐ€์ง€๊ณ  ์žˆ์–ด CSS ํ”„๋กœํผํ‹ฐ ๋‚ด์—์„œ ์—ฐ์‚ฐ์ž๋‚˜ ํ•จ์ˆ˜, ๋ฃจํ”„ ๋“ฑ์„ ๋น„๊ต์ ์œผ๋กœ ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.


๐Ÿ“ Assembler CSS

๐Ÿ“Œ ์ฐธ๊ณ ์ž๋ฃŒ
Assembler CSS ๊ณต์‹ ๋ฌธ์„œ
Assembler CSS Github

๋น ๋ฅธ ํ”„๋กœํ† ํƒ€์ž…์„ ์ƒ์„ฑ, ๋ณต์žกํ•œ ์†Œํ”„ํŠธ์›จ์–ด ์„ค์น˜์™€ ๊ด€๋ฆฌ ์—†์ด mordern ์›น์‚ฌ์ดํŠธ์™€ UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ์ œ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์šฉํ•œ ํ”„๋ ˆ์ž„์›Œํฌ์ด๋‹ค.


๐Ÿ—‚๏ธ CSS-in-JS

๐Ÿ“Œ ์ฐธ๊ณ ์ž๋ฃŒ
์‚ผ์„ฑ ์›น ์ปดํฌ๋„ŒํŠธ ์Šคํƒ€์ผ๋ง ๊ด€๋ฆฌ
๊พธ๋ฐˆ์—†๋Š” [CSS] CSS๋ฅผ ๋Œ€์ฒดํ•  CSS in CSS์™€ CSS in JS์— ๋Œ€ํ•ด ์•Œ์•„๋ณด์ž (CSS Module , SCSS ๋“ฑ)
SOSOLOG CSS-in-JS, ๋ฌด์—‡์ด ๋‹ค๋ฅธ๊ฐ€์š”?
CSS-TRICKS A Thorough Analysis of CSS-in-JS
The State of CSS 2021: CSS-in-JS

๋‹จ์–ด ๊ทธ๋Œ€๋กœ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ ์ฝ”๋“œ์—์„œ CSS๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ์‹์„ ๋งํ•œ๋‹ค. 2014๋…„ ํŽ˜์ด์Šค๋ถ ๊ฐœ๋ฐœ์ž์ธ Christopher Chedeau aka Vjeux๊ฐ€ ์ฒ˜์Œ ์†Œ๊ฐœํ–ˆ๋‹ค.

โœจCSS-in-JS๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ์ด์Šˆโœจ

  • Global namespace: ๊ธ€๋กœ๋ฒŒ ๊ณต๊ฐ„์— ์„ ์–ธ๋œ ์ด๋ฆ„์˜ ๋ช…๋ช… ๊ทœ์น™ ํ•„์š”
  • Dependencies: CSS๊ฐ„์˜ ์˜์กด ๊ด€๊ณ„๋ฅผ ๊ด€๋ฆฌ
  • Dead Code Elimination: ๋ฏธ์‚ฌ์šฉ ์ฝ”๋“œ ๊ฒ€์ถœ
  • Minification: ํด๋ž˜์Šค ์ด๋ฆ„์˜ ์ตœ์†Œํ™”
  • Sharing Constants: JS์™€ CSS์˜ ์ƒํƒœ ๊ณต์œ 
  • Non-deterministic Resolution: CSS ๋กœ๋“œ ์šฐ์„  ์ˆœ์œ„ ์ด์Šˆ
  • Isolation: CSS์™€ JS์˜ ์ƒ์†์— ๋”ฐ๋ฅธ ๊ฒฉ๋ฆฌ ํ•„์š” ์ด์Šˆ

์ปดํฌ๋„ŒํŠธ ๋ผ์ดํ”„ ์Šคํƒ€์ผ์— ๋‚ฎ๊ฒŒ ์Šคํƒ€์ผ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋™์  ์Šคํƒ€์ผ ์ ์šฉ์— ์ž์œ ๋กœ์šฐ๋ฉฐ ํŠน์ • ์ปดํฌ๋„ŒํŠธ์— ์ปดํฌ๋„ŒํŠธ์— ๋งž๋Š” ์Šคํƒ€์ผ์ด ์ข…์†๋˜๊ณ , ํ•ด๋‹น ์ปดํฌ๋„ŒํŠธ๊ฐ€ ๋ Œ๋”๋ง ๋  ๋•Œ๋งŒ ์Šคํƒ€์ผ ํƒœ๊ทธ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜์˜ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์šฉ์ดํ•˜๋‹ค.


๐Ÿช„ ๋น„์œจ ์ˆœ์œ„

๋งŒ์กฑ๋„๊ด€์‹ฌ๋„์‚ฌ์šฉ๋Ÿ‰์ธ์ง€๋„
๋‹ค์‹œ ์‚ฌ์šฉํ•  ์˜ˆ์ • / (๋‹ค์‹œ ์‚ฌ์šฉํ•  ์˜ˆ์ • + ๋‹ค์‹œ ์‚ฌ์šฉ ์•ˆํ•จ)๋ฐฐ์šฐ๊ธธ ์›ํ•จ / (๋ฐฐ์šฐ๊ธธ ์›ํ•จ + ๊ด€์‹ฌ ์—†์Œ)(๋‹ค์‹œ ์‚ฌ์šฉํ•  ์˜ˆ์ • + ๋‹ค์‹œ ์‚ฌ์šฉ ์•ˆํ•จ) / ์ „๋ถ€(์ „๋ถ€ - ๋“ค์–ด๋ณธ ์  ์—†์Œ) / ์ „๋ถ€

  • ๋งŒ์กฑ๋„

  • ๊ด€์‹ฌ๋„

  • ์‚ฌ์šฉ๋Ÿ‰

  • ์ธ์ง€๋„


๐Ÿค” CSS-in-JS vs CSS-in-CSS

๐Ÿงฉ ์ปดํฌ๋„ŒํŠธ ์œ„์ฃผ

๊ฐœ๋ฐœ ํšจ์œจ์„ฑ์— ์ค‘์ ์„ ๋‘” ์ปดํฌ๋„ŒํŠธ ์œ„์ฃผ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ CSS-in-JS๋ฅผ ์ง€ํ–ฅ

์ฆ‰, ํ•„์š”ํ•œ ์ปดํฌ๋„ŒํŠธ ํŽ˜์ด์ง€์˜ CSS ์Šคํƒ€์ผ ์š”์†Œ๋งŒ ๋กœ๋”ฉํ•œ๋‹ค.


๐Ÿงฉ ์‚ฌ์šฉ์ž ํŽธ์˜ ์œ„์ฃผ

์‚ฌ์šฉ์ž ํŽธ์˜์— ์ค‘์ ์„ ๋‘” ์ธํ„ฐ๋ ‰ํ‹ฐ๋ธŒํ•œ ์›น ํ”„๋กœ์ ํŠธ๋ผ๋ฉด ๋ Œ๋”๋ง ์‹œ ๋ชจ๋“  CSS ์Šคํƒ€์ผ ์š”์†Œ๋ฅผ ๋กœ๋”ฉํ•˜๋Š” CSS-in-CSS๋ฐฉ์‹์„ ์ง€ํ–ฅ

์ฆ‰, ๋ Œ๋”๋งํ•  ๋•Œ ๋ชจ๋“  CSS ์Šคํƒ€์ผ ์š”์†Œ๋ฅผ ๋กœ๋”ฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ปดํฌ๋„ŒํŠธ ์ƒ๋Œ€๊ฐ€ ๋ณ€ํ•˜๋”๋ผ๋„ ๋ฐ”๋กœ ์ ์šฉ์ด ๊ฐ€๋Šฅํ•˜๋‹ค.


๐Ÿ—“๏ธ ์ˆ˜์ • ๋ฐ ์ถ”๊ฐ€

โœ… 2022.03.02

  • ์˜คํƒ€ ์ˆ˜์ •

โœ… 2022.04.10

  • ์˜คํƒ€ ์ˆ˜์ •
  • CSS ๋ชจ๋“ˆ ์„ค๋ช… ์ˆ˜์ • ๋ฐ ์ถ”๊ฐ€
profile
๋ฏธ์ง€์˜ ๊ณต๊ฐ„๐ŸŒ™

0๊ฐœ์˜ ๋Œ“๊ธ€