현대 웹 개발에서는 스타일링을 처리하는 방법이 다양하게 발전했다.
그 중 CSS-in-JS와 CSS-in-CSS는 가장 대표적인 접근 방식이다.
이 두방식은 각기 다른 장점과 단점을 지니고 있어 사용자의 프로젝트에 맞게 선택할 수 있다.
이번 글에서는 두 스타일링의 특성을 비교해보려 한다.
컴포넌트 기반 개발이 증가하면서 CSS의 범위(scope)를 제한하고, 스타일 충돌을 방지하기 위해 CSS-in-JS가 등장했다. 특히 styled-components 및 emotion 같은 라이브러리는 동적인 스타일링과 props활용이 가능해 큰 인기를 끌었다. 하지만 최근 런타임 성능, 스타일 재사용 어려움 등의 단점으로 CSS-in-JS에서 벗어나 성능 최적화를 위한 Vanilla CSS, Tailwind CSS, CSS Modules와 같은 대안으로 움직이는 동향이 보인다.
프론트엔드라면 처음 코드를 시작할때 대부분이 사용하는 방식으로, CSS파일을 외부에서 작성하여 HTML 파일이나 Javascript 파일에 링크하는 전통적인 스타일링 방법이다.
스타일을 별도의 css파일로 관리하는 방식으로 , Javascript에서 분리되어 독립적으로 관리된다.
Javascript 파일 내에서 CSS 스타일을 작성하는 방법이다. 리액트 커뮤니티에서 가장 인기있는 styled-components, emotion과 같은 라이브러리를 사용하여 구현한다. 스타일을 컴포넌트 단위로 관리할수 있다는 장점이 있다.
런타임 CSS-in-JS : 단순하게 앱이 실행될 때 라이브러리가 스타일을 해석하고 적용하는 것을 의미
| 특성 | CSS-in-CSS | CSS-in-JS |
|---|---|---|
| 스타일 관리 | 외부 CSS 파일에서 관리 | 컴포넌트 내부에서 관리 |
| 동적 스타일링 | JS로 동적 스타일링 어려움 | 상태에 따른 동적 스타일링 가능 |
| 성능 | 브라우저 최적화된 CSS렌더링, 성능 우수 | 런타임에 스타일을 계산하므로 성능 저하 가능 |
| 스타일 충돌 방지 | 전역 스타일 관리 시 충돌 가능 | 스타일 캡슐화 및 충돌 방지 |
| 디버깅 | 쉽게 디버깅 가능 | 동적으로 생성되는 클래스명으로 디버깅 어려움 |
| 스타일 재사용 | 명시적인 설정 필요 | props와 함께 동적 스타일 재사용 용이 |
| 번들 크기 | 별도의 CSS파일로 번들 크기 최적화 가능 | 스타일을 포함한 JS파일로 번들 크기 증가 |
컴포넌트 기반의 개발을 선호하거나 동적 스타일링이 중요한 프로젝트라면? ->
CSS-in-JS
전통적인 방식을 선호하거나, 성능 최적화와 스타일 충돌 방지가 중요한 프로젝트라면? ->CSS-in-CSS
CSS-in-JS는 여전히 유용하지만, 성능 문제와 유지보수성을 고려할 때 대체 기술(Vanilla CSS, Tailwind CSS, CSS Modules)들이 더 좋은 선택이 될 수도 있을 것 같다.
CSS-in-JS는 이제 필수가 아니라 선택지가 되었고, 성능과 유지보수를 고려해 적절한 스타일링 방식을 선택하는 것이 중요한 것 같다!