Front-end/Styling

[Styled-components] 스타일링을 코드에 녹여내는 마법 🪄

xeunnie 2024. 12. 16. 01:00
728x90
반응형

스타일드 컴포넌트(Styled-components) 톺아보기! 🪄

React 생태계에서 스타일링은 단순한 CSS를 넘어 점점 진화하고 있습니다. 그중에서도 Styled-components는 스타일링을 컴포넌트 내부로 가져와 더 직관적이고 유지보수하기 쉬운 코드를 가능하게 만드는 강력한 도구입니다. 이번 글에서는 Styled-components의 기본부터 실무에서의 활용까지, 모든 걸 다뤄보겠습니다.


Styled-components란? 🤔

Styled-components는 CSS-in-JS 라이브러리의 대표 주자로, 스타일을 자바스크립트 코드 안에 작성할 수 있도록 도와줍니다. 이를 통해 스타일을 컴포넌트화하고, 코드와 스타일을 하나의 논리적 단위로 결합할 수 있습니다.

 

주요 특징

  • CSS 문법 그대로 사용: CSS를 템플릿 리터럴로 작성
  • 동적 스타일링 지원: props를 활용한 조건부 스타일링
  • 자동 클래스 이름 생성: 고유한 클래스 이름 생성으로 스타일 충돌 방지
  • 컴포넌트 기반 개발: 스타일과 기능을 하나의 컴포넌트로 캡슐화.

설치와 시작하기 🚀

설치

Styled-components는 별도의 설치가 필요합니다. 아래 명령어로 설치하세요:

npm install styled-components

 

타입스크립트 사용 시

npm install @types/styled-components

 

기본 사용법

import styled from 'styled-components';

const Button = styled.button`
  background-color: #4caf50;
  color: white;
  padding: 10px 20px;
  border: none;
  border-radius: 5px;
  cursor: pointer;
  &:hover {
    background-color: #45a049;
  }
`;

function App() {
  return <Button>Click Me</Button>;
}

export default App;

 

결과

  • CSS를 작성하듯이 스타일을 정의
  • Button 컴포넌트는 고유한 클래스 이름을 생성하여 스타일 충돌 방지

Styled-components의 강력한 기능 🌟

1. 동적 스타일링

Styled-components는 props를 활용해 스타일을 동적으로 변경할 수 있어요.

 

예제

const Button = styled.button`
  background-color: ${(props) => (props.primary ? '#4caf50' : '#f44336')};
  color: white;
  padding: 10px 20px;
  border: none;
  border-radius: 5px;
  &:hover {
    background-color: ${(props) => (props.primary ? '#45a049' : '#e53935')};
  }
`;

function App() {
  return (
    <div>
      <Button primary>Primary Button</Button>
      <Button>Secondary Button</Button>
    </div>
  );
}

 

2. 스타일 확장

기존 스타일을 확장해 새로운 스타일을 정의할 수 있습니다.

 

예제

const Button = styled.button`
  background-color: #4caf50;
  color: white;
  padding: 10px 20px;
`;

const LargeButton = styled(Button)`
  padding: 20px 40px;
  font-size: 1.5rem;
`;

function App() {
  return <LargeButton>Large Button</LargeButton>;
}

 

3. 글로벌 스타일

프로젝트 전체에 적용되는 글로벌 스타일도 쉽게 작성할 수 있어요.

 

예제

import { createGlobalStyle } from 'styled-components';

const GlobalStyle = createGlobalStyle`
  body {
    margin: 0;
    font-family: Arial, sans-serif;
  }
  h1 {
    color: #333;
  }
`;

function App() {
  return (
    <>
      <GlobalStyle />
      <h1>Styled-components</h1>
    </>
  );
}

 

4. 테마 지원

Styled-components는 테마를 통해 스타일의 일관성을 유지할 수 있습니다.

 

예제

import { ThemeProvider } from 'styled-components';

const theme = {
  primary: '#4caf50',
  secondary: '#f44336',
};

const Button = styled.button`
  background-color: ${(props) => props.theme.primary};
  color: white;
  padding: 10px 20px;
`;

function App() {
  return (
    <ThemeProvider theme={theme}>
      <Button>Themed Button</Button>
    </ThemeProvider>
  );
}

Styled-components의 장단점 🎯

장점

  1. 스타일 충돌 방지: 고유 클래스 이름 생성
  2. 가독성 향상: 스타일과 컴포넌트를 같은 파일에서 관리
  3. 동적 스타일링: props와 상태에 따라 스타일 조정
  4. CSS 문법 사용: CSS 지식만으로 쉽게 사용 가능
  5. 확장성: 글로벌 스타일, 테마 적용 등 다양한 기능 제공

단점

  1. 런타임 성능 이슈: 많은 스타일을 동적으로 처리할 경우 성능에 영향을 줄 수 있음
  2. 초기 설정 필요: 기존 CSS보다 복잡한 설정 요구
  3. CSS 전통적 접근 방식과 다름: 팀 내 학습 곡선 발생 가능

실무에서의 활용 사례 💼

1. 컴포넌트 재사용

Styled-components는 컴포넌트의 재사용성을 극대화합니다.

 

예제: 공통 버튼 스타일

const Button = styled.button`
  background-color: ${(props) => props.theme.primary};
  color: white;
  padding: 10px 20px;
  border-radius: ${(props) => (props.rounded ? '20px' : '5px')};
`;

 

2. 다크 모드 테마 적용

Styled-components는 다크 모드와 같은 동적 테마 변경에 유용합니다.

 

예제

const lightTheme = {
  background: '#ffffff',
  color: '#000000',
};

const darkTheme = {
  background: '#000000',
  color: '#ffffff',
};

const Wrapper = styled.div`
  background-color: ${(props) => props.theme.background};
  color: ${(props) => props.theme.color};
  padding: 20px;
`;

function App() {
  const [isDarkMode, setIsDarkMode] = useState(false);
  return (
    <ThemeProvider theme={isDarkMode ? darkTheme : lightTheme}>
      <Wrapper>
        <p>This is a themed component!</p>
        <button onClick={() => setIsDarkMode((prev) => !prev)}>Toggle Mode</button>
      </Wrapper>
    </ThemeProvider>
  );
}

Styled-components vs CSS Module vs Vanilla CSS 🚀

특징 Styled-components CSS Module Vanilla CSS
스타일 스코프 고유 클래스 이름 생성 고유 클래스 이름 생성 글로벌
동적 스타일링 props로 동적 스타일링 별도 처리 필요 별도 처리 필요
CSS 문법 사용 가능 가능 가능
러닝 커브 중간 쉬움 쉬움
성능 런타임에 일부 처리 빌드 시 처리 빠름

결론: 스타일과 로직을 하나로 ✨

Styled-components는 컴포넌트 기반 개발 방식과 완벽히 맞아떨어지는 스타일링 도구입니다. 동적 스타일링, 글로벌 테마 지원 등 현대적인 웹 개발에서 필요한 기능을 풍부하게 제공합니다. 하지만 프로젝트 규모와 팀의 스타일링 요구 사항에 따라 CSS Module, Vanilla CSS 등과 적절히 병행해 사용하는 것이 중요합니다.

 

🌷전설의 개발자가 되어봅시당! 🌷

728x90
반응형