2025 . 오은

repo

clsx

문제 정의

프로젝트에서 Tailwind CSS를 활용하여 동적으로 스타일을 적용할 필요가 있었습니다. 특히, 특정 조건에 따라 배경색(bg-red-400 또는 bg-red-700)을 변경해야 하는 상황이 발생했습니다. 이를 위해 다음과 같이 템플릿 리터럴을 사용하여 클래스를 동적으로 설정하려 했으나, 예상대로 작동하지 않는 문제가 있었습니다.

<div className={`bg-red-[${someCondition ? 400 : 700}]`}>
  내용
</div>

위와 같은 방식으로 클래스 이름을 동적으로 설정하려 했지만, Tailwind CSS는 빌드 시 정적 클래스 이름을 분석하여 필요한 스타일을 생성하기 때문에 동적 클래스 이름은 제대로 인식되지 않아 스타일이 적용되지 않는 문제가 발생했습니다.

해결 과정

이 문제를 해결하기 위해 clsx 라이브러리를 도입하여 조건부 클래스를 보다 간편하고 안정적으로 관리할 수 있는 방법을 찾았습니다. clsx는 조건에 따라 클래스를 조합하여 문자열을 생성하는 데 유용한 유틸리티 라이브러리로, Tailwind CSS와의 호환성이 뛰어납니다. 다음과 같은 단계를 통해 clsx를 도입하고 문제를 해결하였습니다:

  1. clsx 라이브러리 설치 프로젝트에 clsx를 설치하여 조건부 클래스를 쉽게 관리할 수 있도록 했습니다.

    npm install clsx
    
  2. 조건부 클래스 적용 방식 변경 템플릿 리터럴을 사용한 방식 대신, clsx를 활용하여 조건에 따라 클래스를 동적으로 조합하도록 코드를 수정했습니다.

    import clsx from 'clsx';
    
    const MyComponent = ({ someCondition }) => {
      return (
        <div className={clsx('bg-red', someCondition ? 'bg-red-400' : 'bg-red-700')}>
          내용
        </div>
      );
    };
    

    또는 더 간결하게 객체 구문을 활용할 수도 있습니다:

    import clsx from 'clsx';
    
    const MyComponent = ({ someCondition }) => {
      return (
        <div className={clsx('bg-red', { 'bg-red-400': someCondition, 'bg-red-700': !someCondition })}>
          내용
        </div>
      );
    };
    
  3. Tailwind CSS 클래스 사전 정의 Tailwind CSS가 동적으로 생성된 클래스를 인식할 수 있도록, 필요한 모든 클래스 이름을 사전에 정의하거나, purge 설정에서 사용되는 패턴을 조정했습니다. 이를 통해 빌드 시 필요한 스타일이 누락되지 않도록 했습니다.

    // tailwind.config.js
    module.exports = {
      purge: {
        content: ['./src/**/*.{js,jsx,ts,tsx}', './public/index.html'],
        options: {
          safelist: ['bg-red-400', 'bg-red-700'],
        },
      },
      // 기타 설정
    };
    

결과

clsx를 도입한 후 다음과 같은 개선 효과를 얻었습니다:

  • 문제 해결: 조건에 따라 Tailwind CSS 클래스를 동적으로 적용할 수 있게 되어, 원하는 스타일이 정확히 적용되었습니다.
  • 코드 간결성 향상: 템플릿 리터럴을 사용하는 것보다 clsx를 활용한 조건부 클래스 적용이 더욱 직관적이고 간결해졌습니다.
  • 유지보수 용이성: 조건부 클래스 로직이 명확해져, 코드 수정 및 유지보수가 용이해졌습니다.
  • 개발 생산성 향상: 조건부 클래스를 보다 효율적으로 관리할 수 있어, 개발 속도가 빨라졌으며 버그 발생 가능성이 줄어들었습니다.

배운 점 (인사이트)

  • 유틸리티 라이브러리의 강력함: clsx와 같은 유틸리티 라이브러리를 활용하면, 조건부 클래스 관리가 훨씬 간편하고 효율적임을 깨달았습니다. 이는 코드의 가독성과 유지보수성을 크게 향상시킵니다.
  • Tailwind CSS와의 호환성: Tailwind CSS의 정적 클래스 분석 방식을 이해하고, 이를 보완하기 위한 방법으로 clsx를 효과적으로 활용할 수 있었습니다.
  • 코드 재사용성 향상: clsx를 사용함으로써, 조건부 클래스 로직을 다양한 컴포넌트에서 재사용할 수 있어 코드의 일관성과 재사용성이 향상되었습니다.
  • 효율적인 개발 패턴 도입: 반복적인 조건부 클래스 로직을 줄이고, 간결하고 효율적인 개발 패턴을 도입함으로써, 전반적인 개발 프로세스의 효율성을 높일 수 있었습니다.