CSS의 역사 톺아보기 : 그래서 어떤 라이브러리가 좋은데..?

ooesny·2023년 11월 6일
6

🌟 Prolouge : About CSS

CSS(Cascading Style Sheets)는 HTML을 꾸며주기 위해 사용하는 스타일시트 언어입니다.

CSS는 특정 언어처럼 복잡한 개념이 없고 간결합니다. 하지만 동시에, CSS는 어렵습니다. 점점 프로젝트가 복잡해질수록 내 의도와 다르게 스타일이 적용되지 않는 등 의 지끈지끈..한 문제들이 발생하기 시작합니다.

또한, CSS를 다루는 방법들이 복잡해지고 다양해지다보니 너무나도 많은 CSS 라이브러리/프레임워크 중 무엇을 사용해야 할지 판단하기 어렵다는 느낌을 받기도 했습니다.

필자 또한 단순히 ‘보편적으로 많이 쓰니까’를 이유로 Styled-Components만을 사용해서 React Project의 스타일링을 하곤 했습니다.

그러므로 이번 글을 계기로 CSS의 역사를 톺아보는 동시에 CSS 라이브러리 각각의 특징에 대해 익히면서,
이를 통해 앞으로 어떤 상황에 어떤 CSS 라이브러리를 사용하는 것이 좋을지 고민해 보고자 합니다.




1️⃣ : 🌈 CSS의 등장과 CSS의 문제점

▷ HTML의 등장

  • 1990년, HyperText 문서를 공유하기 위해 HTML이 등장합니다. 당시에는 HTML에 서식을 입히기 위해 html 태그에 직접 스타일을 입력하는 inline-style을 사용하였습니다. 하지만 이 inline-style은 중복 서식을 반복해서 표현해야 하고, 가독성이 떨어지며, 유지보수가 어렵다는 단점이 있습니다.

▷ CSS의 등장

  • 따라서 1996년, inline-style의 중복을 제거하기 위한 방법으로 CSS가 등장합니다. CSS의 등장으로 별도의 스타일을 선언(Declarations)해두고, html에서 원하는 태그를 선택(Selector)하여 스타일을 적용할수 있게 되었습니다.

    CSS Ruleset : 선택자(Selector) & 선언(Declaration)

    또한 CSS를 별도로 작성하게 되면서 자연스럽게 콘텐츠와 서식이라는 서로 다른 관심의 분리가 이루어졌습니다.

▷ 하지만, CSS도 다음과 같은 문제점이 있었으니..

  • ☠️ 1. Global Scope : CSS의 속성은 어디서든 선언 가능하며 (ex. linline, style 태그, link 태그로 연결한 파일.. 등) 모든 프로젝트에 영향을 줍니다.
    → 따라서, 기존에 사용한 이름을 피해서 작성해야 합니다.
  • ☠️ 2. Specificity : HTML에서 지정한 class 순서가 아니라 CSS의 순서에 의해 서식 우선순위가 결정됩니다.
    → 따라서, 다른 서식을 덮어쓰기 위해 Selector를 더 복잡하게 작성해야 합니다.

▷ CSS의 문제점을 해결 해보자!

이러한 CSS의 한계를 극복하기 위한 노력으로, SCSS(Sass) 및 BEM 방법론 등이 등장하기 시작했습니다.

❓ 1. SCSS

/* css 사용 */
.클래스1  {
	적용할_스타일속성1 : 어쩌구 속성;
}
.클래스1 .클래스2 {
	적용할_스타일속성2 : 저쩌구 속성;
	적용할_스타일속성3 : 저쩌구 속성;
}

/* SCSS 사용 */
.클래스1 {
	적용할_스타일속성1 : 어쩌구 속성;

	.클래스2{
	적용할_스타일속성2 : 저쩌구 속성;
	적용할_스타일속성3 : 저쩌구 속성;
	}
	...이런식으로 계속 중첩이 가능하다!
}
  • CSS의 확장판으로, Nested한 Selector와 variable를 등록할 수 있는 추가적인 문법으로 작성하면 CSS로 변환을 시켜주는 pre-processor입니다.
  • ☠️ BUT! 여전히 어떤 것이 먼저 적용될지 가늠되지 않으며(Specificity 문제), CSS 파일로 변경해주는 컴파일러가 필요하다는 단점이 있습니다.

❓ 2. BEM

  • CSS 내에서 이름이 중복되지 않도록 CSS 아이디와 클래스를 명명하는 방법론입니다.
    • BEM : .Block__Element--Modifier
  • ☠️ BUT! 단순한 코드 명명 규칙이기 때문에 모든 개발자가 이해해야 하며, 클래스 이름이 길어지고 길어진 이름을 매번 입력하며 관리해야 한다는 단점이 있습니다.



2️⃣ : 🗂 CSS-Modules

▷ CSS의 문제.. JS로 해결해보자! (① 번들러 & 모듈화)

CSS의 단점을 해결하고자 나온 방법인 SCSS나 BEM의 경우, 개발자가 클래스가 겹치지 않도록 관리해야 하는 불편함이 있었습니다.

즉, 여전히 Global Scope로 인해서 컴포넌트와 CSS 간 구조와 범위가 일치하는 문제가 남아 있었습니다.

이러한 문제를 해결하려는 첫번째 움직임으로, 2015년 CSS-Modules이 등장하였습니다.


▷ CSS-Modules의 특징 및 사용 방법

  • CSS Modules은 CSS를 모듈화하여 사용하는 방식입니다.
  • CSS 클래스에 해시 문자열을 추가하여 고유한 className을 만들어, Scope를 지역적으로 제한할 수 있습니다.

React에서 CSS Modules 사용하기

  • 파일이름.module.css 형태로 파일을 생성합니다.
  • 생성한 module 파일을 불러오면
    번들러가 클래스에 고유한 해시 값을 추가하여 고유한 클래스네임으로 이뤄진 객체를 생성합니다.
    → 문법 styles 객체를 활용해서 자바스크립트 객체의 프로퍼티 형식으로 참조 가능합니다.
    → 개발자모드로 소스를 보면 클래스명이 '파일명_클래스명__아무말'형식으로 나옵니다.
  • 예시
//Header.module.css

	.header {
  background-color: thistle;
  color: white;

  font-size: 3rem;
}
import React from "react";
import styles from "../styles/Header.module.css";

const Header = ({ title }) => {
  return (
    <header className={styles.header}>
      <h1> CSS-Module의 스타일링 방식입니다!</h1>
    </header>
  );
};

export default Header;

▷ CSS-Modules의 장단점

  • 장점 :
    • 해시 문자열이 추가되어 고유한 클래스네임을 갖기 때문에, 다른 CSS 파일에 동일한 클래스명이 정의되어 있더라도 현재 CSS의 클래스에 영향을 미치지 않습니다.
      → 즉, Global Scope 문제를 해결하여, 중복 및 관리의 위험성이 적다는 것이 가장 큰 장점입니다!
    • css 네이밍 규칙을 간소화 할 수 있습니다.
    • 컴포넌트 단위로 스타일을 관리할 수 있어 유지보수가 용이합니다.
  • 단점 :
    • 별도의 CSS 파일을 만들어 관리해야 합니다.
    • 렌더링 과정에서 자동 변환된 클래스명이 코드의 가독성을 저해하는 경우도 있습니다.
      → 이를 해결하기 위해, CSS Module을 사용하는 경우, classnames 라이브러리를 함께 사용하기도 합니다.



3️⃣ : CSS-In-JS

▷ CSS의 문제.. JS로 해결해보자! (② JS로 만든 CSS!)

💡 CSS-In-JS를 한 눈에 비교해보고 싶다면, 여기를 참고해보세요!(2023ver.)

2016년, 페이스북 개발자 Vjeux는 다음과 같은 CSS의 7가지 문제점을 제시하면서, 이러한 이슈들을 해결하는 방법으로 CSS-In-JS를 소개했습니다.

Facebook FE 개발자가 발표한 css의 7가지 문제

  1. Global namespace: 모든 스타일이 global에 선언되어 중복되지 않는 class 이름을 적용해야 하는 문제
  2. Dependencies: css와 JS간의 의존관계를 관리하기 힘든 문제
  3. Dead Code Elimination: 기능 추가, 변경, 삭제 과정에서 불필요한 CSS를 제거하기 어려운 문제
  4. Minification: 클래스 이름의 최소화 문제
  5. Sharing Constants: JS 코드와 상태 값을 공유할 수 없는 문제
  6. Non-deterministic Resolution: CSS 로드 순서에 따라 스타일 우선 순위가 달라지는 문제
  7. Breaking Isolation: CSS의 외부 수정을 관리하기 어려운 문제(캡슐화)

▷ CSS-In-JS의 특징 및 장단점

  • JS 코드에서 컴포넌트에서 사용할 CSS를 같이 작성하는 스타일링 방식입니다.

  • CSS-Modules의 단점인 방대한 css 파일을 관리해야 하는 것을 해결하기 위해 나온 방법론입니다.

  • 장점 :

    • CSS 모델을 문서 레벨이 아닌 컴포넌트 레벨로 추상화하는 모듈성을 가지고 있습니다.
    • JS와 CSS 사이의 상수와 함수를 공유하면서 JS 환경을 최대한 활용하며, 동적으로 CSS를 변경하기 용이합니다.
    • 현재 사용 중인 스타일만 DOM에 포함합니다.
    • ClassName이 겹치지 않음을 보장합니다. (→ Global Scope 문제 해결)
  • 단점

    • 새로운 의존성이 발생합니다.
    • 별도의 라이브러리를 설치하기 때문에, 번들 크기가 커집니다. → CSS-in-CSS(ex. CSS-Moduels)에 비해 속도가 느립니다.

▷ 🔥 CSS-In-JS의 종류 1 : 💅🏻 Styled-Components

  • JS 파일안에 컴포넌트 이름을 쓰듯 스타일을 선언하는 방식입니다.

공식 문서에 따르면, 스타일드 컴포넌트는 아래와 같은 기능을 제공합니다.

  • Automatic Critcal CSS : 페이지의 컴포넌트를 추적해 필요한 스타일만 삽입합니다.
  • No Class Name Bugs : 스타일에 대해 고유한 클래스 이름을 생성합니다.
  • Easier Deletion of CSS : 모든 스타일링이 특정 컴포넌트와 연결됩니다. 따라서 컴포넌트가 삭제 되면 해당 컴포넌트의 모든 스타일도 함께 삭제됩니다.
  • Simple Dynamic Styling : props나 global theme에 기반하여 여러 컴포넌트의 스타일을 쉽고 직관적으로 적용할 수 있습니다.
  • Painless Maintenance : 컴포넌트에 영향을주는 스타일을 찾기 위해 다른 파일을 찾지 않아도 되어 유지 관리가 쉽습니다.
  • Automatic Vendor Prefixing: 자동으로 벤더 프리픽스를 붙여줍니다.
  • 🌟 React에서 Styled-Components 사용하기

👍 React와 Styled-Components 모두 페이스북(메타)에서 만든만큼, React와 Styled-Components는 궁합이 좋습니다!

  1. styled-components 패키지를 설치합니다.

     # with npm
     $ npm install styled-components
    
     # with yarn
     $ yarn add styled-components
  2. styled 메서드(기본 export 메서드)를 사용해 지정된 스타일을 가진 컴포넌트를 정의합니다.

  3. 만든 컴포넌트를 적용합니다.

    const 컴포넌트이름 = styled.태그이름`
    	/* 적용할 스타일 속성을 적어줍니다 */
    	/* 해당 예시처럼 props를 사용해 동적 스타일링도 가능합니다 */
      적용할 스타일 속성1: ${(props) => pros ? "어쩌구" : "저쩌구"}
    `
    
    export default function App(){
      return (
        <div>
          <컴포넌트이름 default={true} />
          <컴포넌트이름 default={false} />
        </div>
      )
    }```

▷ 🔥 CSS-In-JS의 종류 2 :👩🏻‍🎤 Emotion

  • Emotion은 Styled-Components와 마찬가지로 CSS-In-JS 라이브러리 종류 중 하나입니다.

  • MUI(Material UI)가 스타일링 엔진을 Emotion으로 채택하면서 이목이 집중되고 있습니다.

  • 🌟 React에서 Emotion 사용하기
    - emotion 패키지를 설치합니다. (react)

    # with npm
    $ npm install --save @emotion/react
    
    # with yarn
    $ yarn add @emotion/react

    cf. vanilla 환경에서는 @emotion/css 패키지로 설치합니다

    • JSX Pragma: JSX Pragma 를 css-props 을 사용하는 소스 파일의 가장 상단에 둬야합니다.

      (1) React v16 이하의 버전 : 아래와 같이 작성하고, jsx() 함수도 불러와야합니다.

      /** @jsx jsx */
      import {css, jsx} from '@emotion/react";

      → React.createElement 대신 jsx 함수를 사용하도록 jsx babel 플러그인을 구성하라는 의미입니다.

      (2) 그 이상의 버전에서는

       /** @jsxImportSource @emotion/react */

      → 위와 같이 상단에 쓰면, React 의 jsx() 함수를 사용하지 말고 Emotion 의 jsx() 함수를 사용하라는 의미입니다.

      (써주지 않으면 css prop 에 넘어간 스타일이 제대로 반영이 안될 수 있습니다.)


  • Emotion만의 특징
    • css Prop(css() 함수)로 emotion 사용하기
      - css() 함수의 반환 결과로 해당 스타일을 적용하고 싶은 HTML 요소나 React 컴포넌트의 css라는 prop에 넘겨줍니다.
      - 인자를 객체형 또는 문자형으로 넘길 수 있는데, Emotion 공식문서에서는 가급적 스타일을 객체로 선언하는 것을 권장하고 있습니다.

      import { css } from "@emotion/react";
      
      function ComponentA() {
        return (
          <div
            css={css({
              backgroundColor: "yellow",
            })}
          >
      			객체형 css()함수 사용
          </div>
        );
      }
      
      import { css } from "@emotion/react";
      
      function ComponentB() {
        return (
          <div
            css={css`
              background-color: yellow;
            `}
          >
            문자형 css()함수 사용
          </div>
        );
      }

    • emotion에서 styled 사용하기
      -> @emotions/styled 패키지를 설치하여 사용합니다.

      # with npm
      $ npm install --save @emotion/styled
      
      # with yarn
      $ yarn add @emotion/styled
      
      import styled from '@emotion/styled'
      
      const Button = styled.button`
        color: hotpink;
      `
      
      render(<Button>This is a hotpink button.</Button>)

    • Composition

      : emotion 에서 가장 강력하고 유용한 기능으로, CSS에서 반환된 값을 다른 스타일 블록에 보강하여 스타일을 함께 구성할 수 있습니다.

      👍 이모션의 Compositon 을 사용하면 스타일이 사용 순서대로 병합되므로 style이 생성된 순서를 생각할 필요가 없습니다.

      → cf. 일반적인 css : 여러 클래스를 사용하여 스타일을 함께 구성할 수 있지만, 정의된 순서에 따라 나중에 정의된 것이 우선됩니다. (style이 생성된 순서를 생각해야 한다는 단점!)

      import { css } from '@emotion/react'
      
      const danger = css`
        color: red;
      `const base = css`
        background-color: yellow;
        color: turquoise;
      `render(
        <div>
          <div css={base}>This will be turquoise</div>
          <div css={[danger, base]}>
            This will be also be turquoise since the base styles overwrite the danger
            styles.
          </div>
          <div css={[base, danger]}>This will be red</div>
        </div>)

      ⇒ 이처럼 css 생성 순서대로가 아닌, css 사용 순서대로 적용됩니다!

▷ 🤔 그럼,, Emotion은 Styled-Components와 뭐가 다른가요?

  • 이 문서를 참고하면, Emotion과 Styled-Components는 전반적인 스타일 기능, 문법은 유사합니다.
  • 전반적으로 Emotion의 라이브러리 용량이 더 적고, 퍼포먼스가 더 좋으나 버전에 따라 유의미한 차이는 없을수 있습니다.
  • 그러나 Emotion은 css props을 사용하므로 inline 스타일링이 가능하고, 비교적 네이밍이 간단합니다.
  • 또한 Styled-Componets는 SSR에서 ServerStyleSheet 설정이 필요하지만, Emotion은 SSR에서 별도의 설정 없이 동작할 수 있습니다.
    → 💭 개인적으로 Next.js에 styled-components를 적용하다가 어려움을 겪었던 경험이 있어서,, 이 점이 가장 큰 장점으로 와닿았습니다!



4️⃣ : Atomic CSS - Tailwind CSS

▷ 아니야.. 다시 CSS 생태계에서 해결해보자! (✨새로운 CSS 패러다임 등장)

2017년, JS가 아닌 새로운 CSS 생태계에서(CSS-In-CSS) CSS의 문제점을 해결하고자 하는, Tailwind CSS가 등장했습니다.


▷ Tailwind CSS의 특징 및 사용 방법

  • 특징
    • `Utility-First 컨셉`의 프레임워크 입니다.
      • 즉, 부트스트랩과 같이 미리 세팅된 유틸리티 클래스를 활용하는 방식으로, html 태그 내에서 스타일링을 할 수 있습니다.
    • Atomic CSS 패러다임을 따릅니다.
      • 즉, 미리 정의 된 클래스 네임을 조합해서 스타일링 하는 방식입니다.
    • 빌드 시, 사용하지 않는 클래스가 제거되어 번들 크기가 최소로 유지됩니다.
    • CSS-In-CSS이므로,JS 코드와 완전히 분리되어 사용됩니다.
  • 사용 방식
    • 사용 형식 : <태그이름 class="{tailwind가 정해놓은 className들}">/<태그이름>

      <button className="px-8 py-4 m-0 h-12 border border-solid rounded-lg bg-white">버튼</button>

▷ Tailwind CSS의 장단점

  • 장점
    • Utility-First의 장점! : CSS 파일을 별도로 관리해야 할 필요가 없고, 클래스명을 고민할 필요가 없어 편리하며 개발자 친화적입니다.
    • 모든 곳에서 동일한 유틸리티 클래스 사용해 일관된 스타일을 구현하기 쉽습니다.
    • 로우 레벨의 스타일을 제공하여, 디테일한 부분까지 쉽고 자유롭게 커스텀이 가능합니다.
      → 특히 디자인 시스템, 다크모드 구현이 간편합니다.
      → 공식문서에서 완성된 페이지, 컴포넌트를 제공합니다.
  • 단점
    • HTML과 CSS의 분리가 이루어지 않습니다. 그러므로 코드가 길어지고, 가독성이 떨어집니다.
    • rem 단위가 기본이기 때문에, px 단위 서비스라면 기본값을 바꿔줘야합니다.
    • 빌드 타임에 모두 생성되므로 동적 변수를 사용할 수 없습니다. → 이러한 이유 때문에 Twin.Macro 등의 라이브러리를 사용하기도 합니다.



5️⃣ Zero-Runtime CSS - 🧁 Vanilla Extract

▷ CSS-In-JS 시대의 시작, 그러나…❓

2020년 ~ 2021년쯤부터, React의 압도적인 점유율로 인해 CSS-In-JS의 대유행이 시작되었습니다.

Stateof2021 자료를 보면, 새로운 기술들이 대부분 CSS-In-Js에 몰려 있는 것을 알 수 있습니다.
☠️ 하지만, Styled-Component & Emotion과 같은 Runtime CSS-In-JS는 성능면에서 단점을 가집니다.

런타임에 JS 파일이 실행되면서 style을 생성하기 때문에, style 생성의 규모가 크고 빈번할수록 성능을 저하시킬수 있습니다.
예를 들어 스크롤, 드래그 앤 드랍과 같은 복잡한 애니메이션의 스타일을 생성하면, 런타임 오버헤드가 발생할수 있습니다.


▷ Zero-Runtime CSS-In-JS

이와 같은 Runtime CSS-In-JS의 문제점을 해결하기 위해, Zero-Runtime CSS-In-JS가 등장합니다.

  • Zero Runtime CSS-In-Js

  • JS Bundle에서 Style코드를 모두 실행되어야 페이지가 로드되는 방식입니다.
    → CSS Style까지 모두 로드가 되어야 첫 Paint를 시작합니다.
    → 그러므로 첫 Load는 빠르지만, 첫 Paint는 느릴 수 있습니다.

  • Runtime에 스타일을 생성하지 않으면서 더 빨리 페이지를 로드할 수 있다는 장점이 있습니다.

  • 단, Build Time에 CSS를 생성해야 하기에 webpack 설정을 해야 합니다.


▷ Vanilla Extract의 특징

이러한 Zero-Runtime CSS-In-JS의 대표적인 예로, Vanilla Extract가 있습니다.

Vanilla Extract는 다시 말해, CSS Module-In-Typescript라 할 수 있습니다.

  • Build Time에 TS 파일을 CSS 파일로 만듭니다. (Sass와 같은, preprocessor!) → Vanilla Extract 공식 문서에 있는 ‘Use Typescript as your preprocessor’라는 말이 바로 이것을 의미합니다.
  • 모든 css 코드를 스타일시트(style.css/sccss)가 아닌, style.css.ts와 같은 .css.ts postfix 파일에 작성합니다. → 따라서, Type-safe하게 theme를 다룰 수 있습니다.

▷ Vanilla Extract 사용하기

  1. Vanilla Extract을 설치합니다.

    # with npm
    $ npm install @vanilla-extract/css
    
    # with yarn
    $ yarn add @vanilla-extract/css

  2. .css.ts postfix 파일에 스타일을 작성합니다.

    → 이처럼 .css.ts 파일에 작성된 변수들은, 오른쪽처럼 난수화된 클래스 이름으로 전처리 되어 만들어집니다.
    → CSS Module을 사용하는 것과 유사한 방식이나, 전처리하기 위해 선언된 변수들이 Typescript로 작성되어 바로 타입 추론이 가능하다는 특징이 있습니다.

  3. 스타일을 불러와 적용시킵니다.

    → CSS Module처럼, 전처리하기 위해 사용된 변수들은 Scope가 지역적으로 제한되어 다른 .css.ts 파일에서 선언된 변수와 동일한 이름을 사용하더라도 서로 클래스명이 충돌되지 않습니다!



🌟 Epilogue : 정리하면..

✨ CSS의 진화과정 ✨
: CSS -> SCSS -> BEM -> CSS Moudles -> CSS-In-JS -> Tailwind(Atomic CSS) -> Vanilla Extract(Zero-Runtime CSS-In-JS)

본 글에서는 CSS의 역사를 짧게 톺아보며, CSS 라이브러리와 방법론이 등장하게 된 배경, 특징, 장단점에 대해 비교해 보았습니다.

기술은 언제나 빠르게 진보하고 유행 또한 돌고 돌기 때문에 어떤 것이 가장 좋은 방법이다!라고 단정짓기는 어려운것 같습니다.

그러나 이런 CSS의 흐름과 각 라이브러리들의 장단점을 알고 있다면, 추후 진행할 프로젝트 및 상황에 가장 적절한 스타일링 방법을 적용할수 있을것이라 생각합니다.

  • ex. 빠른 개발이 필요한 상황 -> 개발자 친화적인 CSS-In-JS를 사용하기
  • ex. 성능 향상 및 안정적인 서비스 구축이 필요한 상황 -> CSS module이나 Tailwind와 같은 Utility CSS 활용하기



14개의 댓글

comment-user-thumbnail
2023년 11월 9일

우와앙 읽으면서 진짜 공감가는 부분도 많고, 새로 알게된 부분도 많고, 뜨끔한 부분도 많았던 아티클이었어요!!

우선 저도 react와 상생이 좋다더라 라는 이유로 항상 styled-component 만을 사용해왔는데,, 가끔 이유를 명확히 표현하기는 어려운 불편함이 느껴지더라고요! 이번 아티클을 통해 다양한 css와 각각의 장단점을 알게되어서 너무 좋았습니다!

읽다가 styled-component 내용 중, ssr에서 serversidesheet 설정이 필요하다는 내용이 있었는데, 해당 내용은 제가 잘 몰라서 좀 더 찾아봤습니다!
넥제를 활용하다보면 한번쯤 꼭 마주칠 문제같아서 이번에 배운게 큰 도움이 될 것 같아요 ㅎㅎ 링크 함께 남깁니다!
https://velog.io/@sssm/Next.js-Styled-components%EC%99%80-SSR

지난주차까지 바닐라로 코딩하면서 css 구현할때 되게 자잘한 번거로움이 많았는데, bem 방식으로 구현하려고 시도는 했지만 생각보다 어색해서 제대로 마무리 못한 기억이 있습니닷 ,, 아마 bem의 장단점으로 인한 경험이었던 것 같아요! 경험 덕에 아티클을 더 잘 이해할 수 있었습니다 ㅎㅎ

atomic css랑 zero runtime css는 이번에 새롭게 알게되어 아직은 조금 낯설지만 그만큼 이번 실습이 기대돼요 !!

좋은 아티클 감사합니다 ♡♡

답글 달기
comment-user-thumbnail
2023년 11월 9일

현재 사용하는 거의 모든 css라이브러리나 방법론 등을 알아볼 수 있어서 좋은 글인 것 같습니다!
저 역시 classname 중복문제나 명명하는데에 있어 리소스를 줄이기 위해 BEM방법론을 사용해보았는데 클래스명이 길어지고 더블클릭시 클래스명 선택이 한 번에 되지 않아서 불편함을 느꼈던 기억이 있어요 이부분을 더 알아보았는데 git husky같은 걸로 강제성을 주는 방법은 없는 것 같아 결국은 강제성이 없으면 개발자 개개인의 스타일이나 실수로 컨벤션이 지켜지지 않을 수도 있다고 생각하여 클래스 네임을 자동으로 선정해주는 라이브러리가 좋지 않을까라는 생각도 들었습니다.
classnames 라이브러리와 비슷한 clsx에 관해서도 알아보았는데 긴 조건문을 사용하지 않아도 간단하게 사용할 수 있는 장점 또한 있는 것 같습니다
여러가지를 다뤄주신 것을 보고 역시 각각의 장단점을 직접 느끼고 선택하는 자세가 중요하다고 생각이 들었습니다. 좋은 아티클 감사합니다.

답글 달기
comment-user-thumbnail
2023년 11월 9일

css에 대해 구체적으로 작성해주신 아티클 잘 읽었습니다!

항상 네이밍을 할 때, camelCase를 사용할지 snake_case를 사용할지 고민하곤 했는데요, 그러다 bem 방법론을 처음 접했을 때 굉장히 신기했던 기억이 있습니다! Block, Element, Modifier를 기준으로 네이밍을 하다보니 이름이 겹칠 일도 없고 CSS를 쉽게 읽고 이해할 수 있으며 확장하기에 용이하기하지만, 모든 개발자가 이해해야 하고클래스 이름이 길어지고 길어진 이름을 매번 입력하며 관리해야 한다는 단점이 있다는게 아쉽더라구요..!
그럼에도 바닐라 자스를 활용한 코드 구현을 하게 될 경우에는 bem 방식이 가독성이나 확장성, 그리고 위에서 재훈오빠가 언급해준 리소스 면에서도 가장 괜찮은 방법인 것 같다는 생각이 듭니다.
개인적으로는 Tailwind CSS를 사용해본 경험이 없기 때문에, 이를 꼭 활용하고 싶다는 생각을 쭉 해왔었는데요, 이번 아티클을 통해 tailwind의 장단점과 특징, 사용방식에 대해 한 번 더 짚고 넘어갈 수 있어서 좋았던 것 같아요!

다양한 css 라이브러리와 각각의 장단점 등에 대해 짚어주셔서 해당 아티클만으로도 css에 대해 쭉 훑고 넘어갈 수 있었습니다! 수고 많으셨습니다:-) ❤️‍🔥❤️‍🔥

답글 달기
comment-user-thumbnail
2023년 11월 9일

와아 굉장히 많은 내용을 개괄적으로 정리해주셔서 CSS 라이브러리 생태계를 이해하는데 굉장히 도움이 되었습니다! 특히 마지막에 상황에 따라 적절한 라이브러리 고르는 법을 깔끔하게 정리해주신 게 인상깊네요.

저는 css module을 살짝 맛본적이 있는데 매 폴더에 스타일 파일을 생성해주어야 하다보니 보기 지저분했던 기억이 있고, 그 후로는 styled-components 외길 인생을 살아왔는데요. 연서님의 아티클에 더해서, 우리가 이렇게 많이 쓰고 있는 styled-components의 단점은 무엇이며 이를 어떻게 해결할 수 있을까 찾아보다보니 styled-system 이라는 새로운 라이브러리를 알게되었습니다!

아직 제대로 이해는 못했지만, 이를 도입한 class101의 아티클을 읽게되었는데 오 굉장히 흥미롭더라구요,, 디자인 시스템이라는 것에 대해 관심이 생겼어요..!
지난 앱잼에서 styled-components 를 이용해 공통 컴포넌트를 구축하는 과정에서 배리에이션을 관리하는게 굉장히 까다롭다는 걸 몸소 느꼈거든요. 그런데 저 아티클을 보면 styled-system 을 활용해서 공통컴포넌트의 다양한 배리에이션을 굉장히 체계적이고 유지보수가 용이하도록 구축을 하고 있어서요. 재밌게 읽어보실 수 있을거같아요!

좋은 아티클 감사합니다 :D

답글 달기
comment-user-thumbnail
2023년 11월 9일

여러가지 css의 장단점을 잘 알 수 있게 되는 아티클이었습니다!! 🖤

저는 styled JSX와 styled-component, tailwind CSS를 사용해보았었는데
사용하면서 느꼈던 장단점들이 많이 적혀있어서 많이 공감이 갔습니다!!
저는 보통 styled JSX를 사용했었는데 평소쓰던 css를 그대로 쓰는 것이라 익숙해서 편했어요!
이번에 과제를 하면서 styled-component를 처음써봤는데
컴포넌트 단위로 css를 정의하니 관리하기가 용이했던 것 같아요,

하지만 한 파일안에 실제 렌더링 되는 컴포넌트와 styled component가 같이 있게 되니
뭔가 가독성이 안좋아진다는 느낌이 들기도 했어요 🤔

Emotion은 한번도 사용해보지 못했는데 많이 쓰는 것 같더라고요! 얼른 실습하면서 비교해보고 싶어요 🤓
좋은 아티클 감사합니다 ! ☺️

답글 달기
comment-user-thumbnail
2023년 11월 9일

다양한 CSS 라이브러리들에 대해 궁금했는데 이렇게 발전 과정대로 각 라이브러리의 장단점들을 설명해주셔서 사용 이유에 대해 확실하게 알 수 있어서 아티클 읽으면서 너무너무 유익했어요!!!

저도 기존 CSS의 문제점이 불편해서 프로젝트에서 SCSS 라이브러리를 사용했는데요, 프로젝트 규모가 상당히 커지게 되니 여전히 스타일시트 파일을 따로 관리해야 된다는 점이 너무 불편하더라구요... 그래서 이번 솝트 활동 하면서 CSS-in-JS 방식에 익숙해져보자 해서 이번 과제도 가장 점유율이 높은 styled-components 라이브러리를 적용해서 진행하고 있어요!! 처음에는 되게 낯설었는데 써보니까 점점 익숙해지고, 별도 css 파일을 관리하지 않아도 된다는 점이 굉장히 매력적이더라구요 :)

emotion 라이브러리를 이름만 들어보고 사용법은 처음 알았는데, prop 형태로 css를 준다는 점이 신기하기도 하고, 개인적으로 styled-components보다 더 사용이 편하고 친숙해보였어요. 그래서 emotion도 따로 공부해보고 적용해보고 싶다는 생각이 들어요 :)

이번 아티클을 읽으면서 Zero-Runtime라는 개념에 대해서 처음 알게 되었고, 더 자세히 알아보고 싶어서 찾아보던 와중 Near-Zero-Runtime라는 개념도 새롭게 알게 되었어요. runtime을 아예 가지지 않는 것은 아니지만, component prop에 의한 interpolation을 최소화하는 방향의 API를 제공해 zero run time에 가까운 성능을 낸다고 해요. 대표적인 라이브러리로 stitches가 있고, 다른 라이브러리들과 다르게 사전에 정의한 variants에 의한 스타일링만 가능하다고 하네요!!!

여러 라이브러리들을 발전 과정과 엮어 알기 쉽게 설명해주셔서 엄청 술술 읽혔던 아티클이었어요!!! 실습 벌써 기대되네요 ㅎㅎㅎ 좋은 아티클 감사합니다!!! :)

답글 달기
comment-user-thumbnail
2023년 11월 9일

scss에 대해 전혀 몰랐고, 주변 개발자 분들이 scss에 대해 이야기할 때 나는 모르는 기술 스택인가 싶어서 주눅 들었었는데, scss가 결국 styled components에서 사용하고 있던 중첩 선택을 처음 만들었던 친구라는게 정말 인상깊네요!!
그리고 CSS-Modules가 className을 조작하여 로컬 스코프가 있는 것처럼 활용하는 방식이라는 것을 처음 알 수 있어서 좋았습니다. 또, CSS-Modules는 BEM 방법론을 자동으로 적용시켜주는 번들러가 생긴 것이라는 생각이 되네요 ㅎㅎ 그렇다면 이 CSS-Modules의 한계점은 뭘까라는 궁금증이 들었는데, 이후 아티클 내용을 읽으면서 동적 변경이 어렵다는 한계가 있다는 점을 알 수 있었습니다!!
저희가 보통 html, css 등으로 배우다가 러닝커브가 적다보다 곧바로 react와 styled component로 곧바로 배우게 되곤 했는데, 이렇게 역사 순으로 꼼꼼히 살펴보다 보니 어떤 문제를 해결하도자 어떤 솔루션이 나온건지 알 수 있어서 정말 유용한 기회였습니다.
수고 많으셨습니다! :)

답글 달기
comment-user-thumbnail
2023년 11월 9일

와 진짜 술술 읽혔습니다. 어느 정도였냐면, 놀이기구 40분 기다리는데 그 시간이 순삭될 정도로,,술술 읽힘 이슈입니다.
우선 스타일 항상 스타일들 컴포넌트만을 써왔는데, 정작 styled-components가 css in js인 것을 새롭게 알았네요,, 당연하지만, 그냥 너무 익숙해져와서 본질을 잊었던 느낌,,,이라 머리가 띵했어요!
그리고 년도까지 알려주셔서 오잉 15년도에 나왔구나,,,? 라는 재미도 얻는 일석이조의 리딩타임이었습니다. 더불어 댓글들까지 너무 유익하네요!!!!
또 재밌었던 부분은 이제 스타일드 컴포넌트 만을 약간 찬양하고, 써왔는데
style 생성의 규모가 크고 빈번할수록 성능을 저하시킬 수 있다는 면과 그 예시가 너무 와닿았던 것 같습니다. 그렇게 생긴 제로 인스탈 css in js도 무척 흥미로웠습니다!
JS Bundle에 대해서 잘 모르겠어서(응애이슈) 찾아보니
"웹 개발에서 번들링 = 빌드 라고 할 수 있다.)
사용자에게 웹 애플리케이션을 제공하기 위해 여러 코드와 프로그램들을 묶는 행위로 정의할 수 있다." 라고 하네요!

답글 달기
comment-user-thumbnail
2023년 11월 9일

와 진짜 술술 읽혔습니다. 어느 정도였냐면, 놀이기구 40분 기다리는데 그 시간이 순삭될 정도로,,술술 읽힘 이슈입니다.
우선 스타일 항상 스타일들 컴포넌트만을 써왔는데, 정작 styled-components가 css in js인 것을 새롭게 알았네요,, 당연하지만, 그냥 너무 익숙해져와서 본질을 잊었던 느낌,,,이라 머리가 띵했어요!
그리고 년도까지 알려주셔서 오잉 15년도에 나왔구나,,,? 라는 재미도 얻는 일석이조의 리딩타임이었습니다. 더불어 댓글들까지 너무 유익하네요!!!!
또 재밌었던 부분은 이제 스타일드 컴포넌트 만을 약간 찬양하고, 써왔는데
style 생성의 규모가 크고 빈번할수록 성능을 저하시킬 수 있다는 면과 그 예시가 너무 와닿았던 것 같습니다. 그렇게 생긴 제로 인스탈 css in js도 무척 흥미로웠습니다!
JS Bundle에 대해서 잘 모르겠어서(응애이슈) 찾아보니
"웹 개발에서 번들링 = 빌드 라고 할 수 있다.)
사용자에게 웹 애플리케이션을 제공하기 위해 여러 코드와 프로그램들을 묶는 행위로 정의할 수 있다." 라고 하네요!

답글 달기
comment-user-thumbnail
2023년 11월 9일

너무 술술 읽히는 아티클이었던 것 같아요! 저는 아직까지 넥제를 써보지 않아서, styled-component와 넥제가 어떤 식으로 부닥치는지(?) 아직 몸소 체험을 못해보았습니다.
그치만, 규모가 큰 프로젝트를 구상할 때 styled-component로 인해서 굉장히 느려지는 것
같다는 생각을 계속해서 들었어요!
아직까지 styled-component 이외에 다른 css 라이브러리를 사용해보지 않아서,
실습이 너무너무 기대됩니다!

SSR, SSG 환경과 서버 컴포넌트에서 스타일링이 어렵기 때문에, 넥제 공식문서에서도 경고 문구가 있더라구요,,,styled-component의 동작 방식을 알면, 이유를 알 수 있다고 하는데
스타일 컴포넌트는 클라이언트가 런타임일 때 스타일 시트를 생성하고 <style/> 요소로 DOM에 주입한다고 합니다. 즉, 프로젝트가 실행중일 때 스타일링이 dom 요소에 주입이 되는 것인데,
서버 사이드에서 이러한 방법이 동작한다면, 클라이언트 런타임 때 생성되고 주입되므로 그 사이 깜빡임이 존재하게 된다고 합니다.
next.js의 버전에 따라 이를 해결하는 방법이 다른데,
next.js 12 이상은 styled-component에 ssr 설정을 해주면 된다고 하네요!!

답글 달기
comment-user-thumbnail
2023년 11월 14일

이 아티클은 다양한 라이브러리들의 발전 과정을 이해하기 쉽게 풀어 설명해 주셔서 정말로 흥미롭게 읽을 수 있었습니다! 이미 실습이 기대돼요 ㅎㅎㅎ 훌륭한 아티클 감사합니다!!! :)

답글 달기
comment-user-thumbnail
2023년 11월 15일

백엔드라서 css는 겉핥기로만 알고 지나갔는데 개선을위해 많은 노력들이 있었네요

답글 달기
comment-user-thumbnail
2023년 11월 15일

유용한 공유 감사드립니다 https://geometrydashmeltdown.net/

답글 달기
comment-user-thumbnail
2023년 11월 16일

Name: bravojhony
Website: https://www.migdigitizing.com/vector-conversion
Wow thanks for this amazing informative blog this is very nice and I will share this with my all friends and once again thanks and keep it up.
from:

답글 달기