테일윈드 유틸리티에서 벗어나 순수 CSS 구조화 배우기
8년간 테일윈드를 사용해온 개발자가 여러 웹사이트를 시맨틱 HTML과 바닐라 CSS로 마이그레이션하며 얻은 인사이트를 공유합니다. CSS 리셋, 컴포넌트 분리, 색상·간격 등 레이아웃을 위한 일관된 시스템 구축의 중요성을 강조하며, 프레임워크 의존도를 줄이고 자체 CSS 아키텍처를 실험하는 실무자에게 유용한 참고자료입니다.
안녕하세요! 8년 전, 저는 테일윈드(Tailwind)를 발견하고 흥분된 마음으로 글을 썼습니다. 그 당시에는 CSS 코드를 어떻게 구조화해야 할지 정말 몰랐고, 완전한 혼돈의 코드와 테일윈드 중에서 선택해야 했기에 테일윈드를 기꺼이 선택했습니다. 그 덕분에 많은 작은 사이트들을 만들 수 있었습니다!
지난 일주일 정도 몇 개의 사이트를 테일윈드에서 멀어지게 마이그레이션하고, 더 시맨틱(semantic)한 HTML과 순수 CSS(바닐라 CSS) 방향으로 옮겼습니다. 그 과정이 정말 재미있고 흥미로워서, 제가 배운 몇 가지를 공유하려 합니다! 평소처럼 저는 전업 프론트엔드 개발자가 아니며, 그동안 CSS 학습은 여러 해에 걸쳐 단편적으로 이뤄졌습니다.
테일윈드가 저에게 많은 것을 가르쳐 줬더군요 CSS 구조화를 고민하기 시작할 때 처음엔 겁먹었습니다. 제가 CSS 구조화에 별로 능숙하지 않았거든요! 그러나 CSS를 어떻게 구조화할지 다루는 블로그 글(예: ‘A whole cascade of layers’나 ‘How I write CSS in 2024’)을 읽다 보니 몇 가지를 깨달았습니다.
- 모든 CSS 코드베이스에는 여러 가지 요소(레이아웃, 글꼴, 색상, 공통 컴포넌트 등)가 섞여 있습니다.
- 이를 관리하기 위한 체계나 가이드라인이 있으면 매우 유용합니다. 그렇지 않으면 혼돈에 빠집니다.
- 테일윈드에는 이 중 일부를 위한 체계가 이미 있고, 저는 그 체계들을 이미 알고 있습니다!
- 내가 마음에 드는 체계를 모방해볼 수도 있겠다는 생각이 들었습니다.
예를 들어 테일윈드에는 다음이 있습니다:
- 리셋 스타일시트(reset stylesheet)
- 색상 팔레트(colour palette)
- 글꼴 스케일(font scale)
제가 이야기하려는 체계들 CSS 코드베이스의 몇 가지 측면과, 각각에 제가 부여하고 싶은 규칙에 관해 지금까지의 생각을 공유하겠습니다. 일부는 테일윈드에서 가져왔고, 일부는 그렇지 않습니다.
- 리셋(reset)
- 컴포넌트(components)
- 색상(colours)
- 글꼴 크기(font sizes)
- 유틸리티 클래스(utility classes)
- 베이스 간격(the base spacing)
- 반응형 디자인(responsive design)
- 빌드 시스템(the build system)
- 리셋(reset) 저는 테일윈드의 “preflight styles”를 tailwind.css 파일에서 처음 200줄 정도를 복사해 그대로 가져왔습니다. 시간이 지나면서 테일윈드의 CSS 리셋과 관계가 형성되었음을 깨달았습니다. 예를 들어 테일윈드는 모든 요소에 box-sizing: border-box를 설정합니다(요소의 너비에 패딩이 포함되도록).
- { box-sizing: border-box; }
이런 설정 없이 CSS를 작성하는 건 큰 적응이 필요할 것 같습니다. 테일윈드 리셋에는 html { line-height: 1.5; }처럼 무의식적으로 익숙해져 있어 존재조차 인식하지 못했던 다른 규칙들도 분명 많을 것입니다.
- 컴포넌트(components) 이 부분이 CSS의 대부분을 차지합니다! 핵심 아이디어는 CSS를 “컴포넌트” 단위로 조직화하는 것입니다. Vue나 React 컴포넌트와 정신적으로 유사한 방식이에요(사이트에 자바스크립트가 전혀 없더라도 상관없습니다).
기본적으로:
- 각 “컴포넌트”는 고유한 클래스를 갖습니다.
- 한 컴포넌트의 CSS는 다른 컴포넌트의 CSS를 결코 덮어쓰지 않습니다.
- 각 컴포넌트는 자체 CSS 파일을 갖습니다.
이렇게 하면 한 컴포넌트의 CSS를 편집해도 다른 컴포넌트가 알 수 없게 망가지는 일이 없습니다. 실제로 변경하고 싶은 CSS의 약 80%가 여러 컴포넌트 파일에 있기 때문에, 100줄짜리 컴포넌트를 편집할 때 그 100줄만 생각하면 됩니다. 훨씬 더 생각하기 쉽습니다.
예를 들어 다음 HTML은 .zine “컴포넌트”일 수 있습니다:
그리고 CSS는 중첩 선택자(nested selectors)를 사용해 이렇게 작성할 수 있습니다:
.zine { ... &.horizontal { ... } &.vertical { ... } &:hover { ... } }
컴포넌트가 서로 간섭하지 않도록 보장하기 위해 웹 컴포넌트나 @scope 같은 프로그래밍적 장치를 사용하진 않았지만, 단순히 규약을 갖고 최선을 다하는 것만으로도 큰 개선이 느껴집니다.
다음은 사이트 전체에 걸쳐 일관성을 유지하고 이 컴포넌트들이 서로 조화를 이루도록 하는 규약입니다!
- 색상(colours) colours.css에는 필요에 따라 사용할 수 있는 여러 변수가 있습니다. 색상은 정말 어려운 주제라 이번 리팩토링에서는 색상 사용을 다시 고치고 싶지 않아서 그냥 두었습니다. 제가 따르는 유일한 가이드라인은...