
우테코 스타일링 요구사항이다.
Bootstrap, MUI, Ant Design, Chakra UI, Tailwind CSS 등은 금지된다. 실제 프로덕트의 기획과 디자인은 이런 틀만으로 만족시킬 수 없는 경우가 많기 때문이다. 사용하더라도 서비스의 필요에 맞춰 커스텀이 필요한 일이 잦다고 한다. 그래서 이번 미션에서는 직접 마크업하고 스타일링 하는 기본기를 쌓아두는 것을 목표로 한다.
일단 경험을 바탕으로 CSS, CSS Modules, Emotion을 비교해보면...
[개발] → CSS 파일 생성 → 브라우저가 파일을 읽음<style> 태그를 동적으로 삽입함[앱 실행 시] → JS 코드 실행 → props 값 기반으로 CSS 계산 → <style> 태그 생성 → DOM에 삽입@emotion/babel-plugin 등으로 최적화 가능하다.라이브러리에 따라 런타임 시간 유무가 있다. 하지만 런타임 시간은 충분히 줄일 수 있어서 크게 단점이 되는 것 같지 않다.
Spotify 팀은 스타일링 도구를 선정할 때 사용자 스토리와 기능을 정의하고, 각 항목별로 객관적인 점수를 매겨 결정하는 POS 과정을 거친다고 한다. (링크)
그래서 나도 이전 미션에서의 경험을 가지고 스타일링 도구를 비교해보았다.
기능이 존재하지 않으면 0점, 기술 부채를 유발하는 경우에는 1점, 완벽하게 제공되면 2점이다.
| 기술 | 점수 | 이유 |
|---|---|---|
| CSS | 2 | ✅ 클래스명 그대로 보여서 구조 파악 쉬움 |
| CSS Modules | 2 | ✅ 해시 클래스지만 JS import로 추적 가능 |
| Emotion/css | 1 | ⚠️ 클래스명이 난독화(css-abc123) → 직관성 조금 떨어짐 |
| Emotion/styled | 0 | ❌ DOM에 StyledComponent로 표시 → HTML에서 스타일 추적 어려움 |
| 기술 | 점수 | 이유 |
|---|---|---|
| CSS | 0 | ❌ 글로벌 스코프라 네이밍 전략(BEM 등) 필요 |
| CSS Modules | 2 | ✅ 자동 해시 처리 → 네이밍 충돌 완벽 방지 |
| Emotion/css | 2 | ✅ 해시 클래스 생성으로 네이밍 부담 없음 |
| Emotion/styled | 2 | ✅ 해시 클래스 생성으로 네이밍 부담 없음 |
| 기술 | 점수 | 이유 |
|---|---|---|
| CSS | 0 | ❌ CSS 파일과 JS가 분리돼있어 코드 확인 시 파일 이동 필요 |
| CSS Modules | 1 | ⚠️ 컴포넌트 단위로 관리 가능하지만 여전히 CSS 파일 따로 관리 |
| Emotion/css | 2 | ✅ 스타일을 JS 코드와 같이 작성 → 파일 이동 불필요 |
| Emotion/styled | 2 | ✅ 스타일과 컴포넌트 완전 결합 → 한곳에서 관리 가능 |
| 기술 | 점수 | 이유 |
|---|---|---|
| CSS | 0 | ❌ 빌드 시 클래스명이 그대로 노출 |
| CSS Modules | 2 | ✅ 클래스명이 해시 처리(Button_button__abc123)로 난독화됨 |
| Emotion/css | 2 | ✅ 클래스명이 해시 처리(css-xyz456)로 난독화됨 |
| Emotion/styled | 2 | ✅ 클래스명이 해시 처리(css-xyz456)로 난독화됨 |
| 기술 | 점수 | 이유 |
|---|---|---|
| CSS | 0 | ❌ TS와 연계된 기능 없음 |
| CSS Modules | 1 | ⚠️ 클래스명 타입 추론 가능하지만 CSS 속성 자동완성 불가 |
| Emotion/css | 2 | ✅ props 타입 추론과 자동완성 지원 |
| Emotion/styled | 2 | ✅ props 타입 추론과 자동완성 지원 |
| 기술 | 점수 | 이유 |
|---|---|---|
| CSS | 0 | ❌ props 기반 스타일링 불가, 자동완성 미지원 |
| CSS Modules | 1 | ⚠️ 제한적 지원 (조건부 클래스 처리만 가능) |
| Emotion/css | 2 | ✅ props 기반 동적 스타일링 지원 → 디자인 시스템에 최적화 |
| Emotion/styled | 2 | ✅ props 기반 스타일링 자연스럽게 지원 |
| 기술 | 점수 | 이유 |
|---|---|---|
| CSS | 2 | ✅ CSS는 모든 프로젝트 기본 포함 → 이전 용이 |
| CSS Modules | 2 | ✅ React 생태계에서 많이 사용 → 다른 프로젝트 적용 용이 |
| Emotion/css | 2 | ✅ CSS-in-JS 지원하는 프로젝트로 이전 가능 |
| Emotion/styled | 2 | ✅ CSS-in-JS 지원하는 프로젝트로 이전 가능 |
| 기술 | 점수 | 총평 |
|---|---|---|
| CSS | 10 | 기본적인 스타일링에 적합. 글로벌 충돌 관리 필요 |
| CSS Modules | 17 | 클래스 충돌 방지 및 정적 스타일링 강점. props 기반 동적 스타일은 불편 |
| Emotion/css | 21 | 디자인 시스템 구축에 최적. props 기반 동적 스타일링 자연스럽고 재사용성 높음 |
| Emotion/styled | 20 | 빠른 개발에 적합. 스타일과 컴포넌트 결합 → 재사용 설계 시 주의 필요 |
Spotify가 중요하게 생각하는 사용자 스토리 중 나에게 필요한 항목만 뽑아 점수를 매겨보니, Emotion이 가장 높은 점수를 기록했다. 특히 props 기반 조건부 스타일링, 타입스크립트 지원, 디자인 시스템 자동완성 등에서 CSS와 CSS Modules와 차이를 보였다. 런타임 비용이라는 단점이 있긴 하지만, 이는 최적화로 해결할 수 있는 부분이고 개발 생산성 측면에서는 Emotion이 가장 적합하다고 판단했다.
이전 미션까지는 컴포넌트 중심으로 빠르게 작업하기 위해 emotion/styled를 주로 사용했다. 하지만 공통된 스타일을 여러 컴포넌트에서 재사용하는 것이 쉽지 않아 점점 불편함을 느꼈다.
그래서 이번에는 Emotion/react를 선택했다. Bootstrap이나 Tailwind CSS처럼 아주 작은 스타일 단위로 그룹을 만들어 클래스로 지정하고, 이를 조합하여 재사용하는 방식에 도전해보려 한다. 이 방식은 유지보수성과 확장성이 높아져, 디자인 시스템을 따라갈 때도 도움이 될 것이라 기대한다.
우리가 사용할 디자인 도구를 신중하게 선택했다. 앞으로도 프로젝트를 진행하면서 계속 선택의 순간들을 마주하게 될 것이다. 그 과정에서 더 나은 판단을 내릴 수 있는 선택의 감각을 기르기 위해 여러 방법을 시도하며 경험을 쌓아갈 계획이다 :)