학습
CSS CSS-in-JS 개념
CSS CSS-in-JS 개념 — 고급
CSS-in-JS 개념
1. 도입 (왜 배워야 하는가)
CSS-in-JS는 JavaScript 코드 내에서 직접 CSS 스타일을 정의하고 적용하는 방식을 의미합니다. 이 방식은 특히 React와 같은 컴포넌트 기반 라이브러리에서 인기를 얻고 있습니다. 왜냐하면 컴포넌트의 재사용성과 유지보수성을 크게 향상시킬 수 있기 때문입니다.
실무에서 CSS-in-JS를 사용하지 않으면 다음과 같은 문제가 발생할 수 있습니다:
- 스타일의 전역화: CSS 파일이 커지면서 어떤 스타일이 어디에 적용되는지 파악하기 어려워 집니다. 이로 인해 중복된 스타일이 발생하거나, 의도치 않게 다른 컴포넌트의 스타일이 변경될 수 있습니다.
- 동적 스타일링의 어려움: 사용자 상호작용에 따라 스타일을 변경하는 것이 어려워집니다. CSS-in-JS 방식은 JavaScript의 로직과 스타일을 함께 묶어 관리할 수 있어 이러한 문제를 해결할 수 있습니다.
- Scoped Styles: 컴포넌트에 대한 스타일이 해당 컴포넌트 내에서만 적용되어, 전역적인 스타일 충돌을 방지합니다.
- Dynamic Styling: props나 state에 따라 스타일을 동적으로 변경할 수 있습니다.
2. 핵심 개념 설명
CSS-in-JS는 기본적으로 JavaScript 코드 내에서 CSS를 정의하는 패턴입니다. 이를 통해 다음과 같은 이점을 얻을 수 있습니다.
관련 용어 정리
| 용어 | 설명 |
|---|---|
| Scoped Styles | 특정 컴포넌트에만 적용되는 스타일 |
| Dynamic Styling | 상태나 프로퍼티에 따라 스타일을 변경하는 방식 |
3. 기본 코드 예제
아래는 CSS-in-JS 라이브러리인 styled-components를 사용하여 버튼을 만드는 간단한 예제입니다.
import styled from 'styled-components';
// styled-components를 이용하여 Button 컴포넌트 생성
const Button = styled.button
background-color: ${({ primary }) => (primary ? 'blue' : 'gray')}; // primary props에 따라 색상 결정
color: white;
padding: 10px 20px;
border: none;
border-radius: 5px;
cursor: pointer;
;
// 컴포넌트를 사용하는 예제
const App = () => (
<div>
<Button primary>Primary Button</Button> {/ Primary 버튼 /}
<Button>Default Button</Button> {/ 기본 버튼 /}
</div>
);
// 실행 결과: 두 개의 버튼이 보인다. 첫 번째는 파란색, 두 번째는 회색 배경.
styled.button은 버튼 요소를 기반으로 새로운 스타일이 적용된 컴포넌트를 생성합니다.background-color 속성은 primary props에 따라 동적으로 변경됩니다.App 컴포넌트에서 두 개의 버튼을 렌더링하여 결과를 확인할 수 있습니다.4. 실전 활용 예제
예제 1: 쇼핑몰 장바구니 아이콘
장바구니 아이콘이 비어있을 때와 가득 찼을 때의 스타일을 다르게 할 수 있습니다.
const CartIcon = styled.div
background-color: ${({ filled }) => (filled ? 'red' : 'lightgray')};
width: 40px;
height: 40px;
border-radius: 50%;
;
// 사용 예
<CartIcon filled={true} /> {/ 가득 찬 장바구니 아이콘 /}
<CartIcon filled={false} /> {/ 비어있는 장바구니 아이콘 /}
예제 2: 사용자 프로필 카드
프로필 카드에서 사용자의 상태에 따라 스타일을 변경할 수 있습니다.
const ProfileCard = styled.div
border: 1px solid ${({ online }) => (online ? 'green' : 'red')};
padding: 20px;
border-radius: 10px;
;
// 사용 예
<ProfileCard online={true}>Online User</ProfileCard> {/ 온라인 사용자 /}
<ProfileCard online={false}>Offline User</ProfileCard> {/ 오프라인 사용자 /}
5. 흔한 실수와 주의사항
실수 1: Props를 잘못 전달하기
// 잘못된 코드
<Button isPrimary>Click Me</Button> // 'isPrimary'는 정의되지 않음
// 올바른 코드
<Button primary>Click Me</Button> // 'primary'로 props 전달
실수 2: 스타일을 너무 복잡하게 만들기
// 잘못된 코드
const ComplexButton = styled.button
background-color: ${({ primary }) => primary ? 'blue' : 'gray'};
transition: all 0.3s ease; // 너무 많은 스타일이 겹침
;
// 올바른 코드
const SimpleButton = styled.button
background-color: ${({ primary }) => primary ? 'blue' : 'gray'};
transition: background-color 0.3s ease; // 필요한 스타일만 적용
;