
에러 없이 스타일만 망가지던 지옥의 디버깅에서 tailwind-merge 내부 메커니즘을 파악해 우아하게 해결하는 법
라이브러리 스타일 격리를 위해 Tailwind CSS에 prefix를 도입했다가 tailwind-merge의 병합 기능이 깨지며 발생한 문제를 심도 있게 다룹니다. 기존 1세대의 불안정한 문자열 치환 우회 방식을 극복하고, tailwind-merge가 클래스를 분류하는 원리를 파악하여 직접 제어하는 2세대 해법을 상세한 코드와 함께 공유합니다.
Tailwind 기반의 공용 컴포넌트 라이브러리를 배포하거나, 다중 패키지 환경에서 스타일 오버라이딩 충돌 이슈로 골머리를 앓고 있는 프론트엔드 개발자들에게 정독을 추천합니다.
공용 컴포넌트 라이브러리의 스타일 격리를 위해 Tailwind CSS에 prefix('yf-')를 적용했으나, 스타일 덮어쓰기를 처리하는 tailwind-merge가 해당 prefix 클래스를 인식하지 못해 스타일 충돌이 해결되지 않고 어긋나는 문제가 발생했습니다.
tailwind-merge의 내부 작동 방식인 classGroups와 conflictingClassGroups 설정을 활용하여 prefix가 적용된 클래스들을 직접 등록하고, text-ellipsis나 padding처럼 속성이 충돌하는 세부 그룹 간의 우선순위를 재정의하였습니다.
문자열 치환 등의 임시방편 없이 커스텀 유틸리티와 prefix 스타일의 충돌을 완벽하게 해결했으며, 컴포넌트에서는 템플릿 태그를 통해 설정을 신경 쓰지 않고 단순하게 사용할 수 있게 되었습니다.
Trade-off
새로운 Tailwind 유틸리티나 소수점 임의값을 사용할 때마다 수동으로 classGroups를 최신화해야 하는 유지보수 공수가 수반되며, 이를 자동으로 생성할 수 있는 완벽한 해결책은 아직 확보하지 못했습니다.
Tailwind CSS에서 동일한 CSS 속성을 제어하는 중복 클래스가 선언되었을 때, 마지막에 위치한 클래스가 최종 적용되도록 충돌을 분석하고 걸러내 주는 자바스크립트 라이브러리입니다.
tailwind-merge가 특정 스타일 클래스를 어떤 CSS 기능적 범주(예: 배경색, 패딩 등)로 묶어서 식별할지 결정하는 내부 매핑 설정 테이블입니다.
서로 다른 스타일 그룹 간에 우선순위를 비교하여, 한 그룹이 선언되었을 때 하위 호환 관계에 있는 다른 그룹의 스타일을 지울지 결정하는 충돌 해소용 설정입니다.




