우아한테크코스 프로젝트: Styled Component와 ThemeProvider를 활용한 일관된 디자인 시스템 구축하기

정우시·2023년 7월 12일
2

우아한테크코스

목록 보기
8/13

이번 글에서는 Styled Component와 ThemeProvider를 함께 활용하여 일관된 디자인 시스템을 구축하는 방법에 대해 알아보겠습니다. ThemeProvider를 사용하여 테마를 전역적으로 적용하고, 타입스크립트를 활용하여 타입 안정성을 보장할 수 있습니다. 또한, 코드를 통해 실제로 스타일링된 컴포넌트를 생성하는 방법을 살펴보겠습니다.

디자인 시스템을 구축하기 위해 우리는 styled-components 라이브러리와 ThemeProvider를 사용하고 있습니다. 이를 통해 컴포넌트의 스타일링과 테마의 관리를 효율적으로 처리할 수 있습니다.

먼저, 우리는 다음과 같이 테마를 정의하고 있습니다.

const theme = {
  color: {
    primary: '#F08080',
    secondary: '#FFD3D8',
    error: '#F14646',
    warning: '#EF8523',
    success: '#31A115',
    text: {
      primary: '#212121',
      secondary: '#787878',
    },
    line: {
      primary: '#777777',
      secondary: '#BABABA',
    },
  },
  fontSize: {
    xs: '0.75rem',
    sm: '0.875rem',
    base: '1rem',
    lg: '1.125rem',
    xl: '1.25rem',
    '2xl': '1.5rem',
    '3xl': '1.875rem',
  },
  space: {
    '0.5': '0.125rem',
    '1': '0.25rem',
    '1.5': '0.375rem',
    '2': '0.5rem',
    '2.5': '0.625rem',
    '3': '0.75rem',
    '3.5': '0.875rem',
    '4': '1rem',
    '5': '1.25rem',
  },
  shadow: {
    '1': '0 0 2px 2px rgba(0, 0, 0, 0.2)',
    '2': '0 0 4px 4px rgba(0, 0, 0, 0.2)',
    '3': '0 0 6px 6px rgba(0, 0, 0, 0.2)',
    '4': '0 0 8px 8px rgba(0, 0, 0, 0.2)',
    '5': '0 0 10px 10px rgba(0, 0, 0, 0.2)',
  },
} as const;

export default theme;

위의 코드는 theme 객체에는 다양한 색상, 글꼴 크기, 간격, 그림자 등의 속성이 포함되어 있습니다. 이러한 테마 속성들은 컴포넌트의 스타일을 일관되게 관리하고 통일된 디자인을 유지하는 데에 사용됩니다.

다음으로, 우리는 ThemeProvider를 사용하여 테마를 전역적으로 적용하고 있습니다. 아래의 코드는 App 컴포넌트에서 RouterProvider와 ThemeProvider를 함께 사용하는 방법을 보여줍니다.

import { RouterProvider } from 'react-router-dom';
import { ThemeProvider } from 'styled-components';
import router from './router';
import theme from './styles/theme';

const App = () => {
  return (
    <ThemeProvider theme={theme}>
      <RouterProvider router={router} />
    </ThemeProvider>
  );
};

export default App;

위의 코드에서는 ThemeProvider 컴포넌트를 사용하여 애플리케이션에 전역적으로 테마를 적용하고 있습니다. ThemeProvidertheme 객체를 theme prop으로 전달받아 해당 테마를 사용하도록 설정합니다. 이를 통해 애플리케이션 전체에서 일관된 테마를 사용할 수 있습니다.

테마가 설정된 ThemeProvider 컴포넌트 내부에서는 Styled Component를 사용하여 컴포넌트를 스타일링할 수 있습니다. 컴포넌트 내부에서 theme 객체의 속성을 접근하여 스타일링에 활용할 수 있습니다.

예를 들어, 아래의 코드는 Styled Component를 사용하여 스타일이 적용된 Button 컴포넌트를 생성하는 예시입니다.

import styled from 'styled-components';

const Button = styled.button`
  background-color: ${({ theme }) => theme.color.primary};
  color: ${({ theme }) => theme.color.text.primary};
  font-size: ${({ theme }) => theme.fontSize.base};
  padding: ${({ theme }) => theme.space['1']} ${({ theme }) => theme.space['2']};
  border-radius: 4px;
  box-shadow: ${({ theme }) => theme.shadow['1']};
`;

export default Button;

위의 코드에서는 styled.button 함수를 사용하여 <button> 엘리먼트에 스타일을 적용합니다. 스타일은 백틱 (`)으로 감싸진 템플릿 리터럴 내부에 작성됩니다. Button 컴포넌트는 background-color, color, font-size, padding, border-radius, box-shadow 등의 스타일 속성을 가지고 있습니다.

여기서 {({ theme }) => ...} 형태로 작성된 부분은 테마 객체를 참조하여 테마의 속성을 스타일에 적용하는 부분입니다. 예를 들어, background-color 속성은 theme.color.primary를 사용하여 테마의 primary 색상을 배경색으로 지정합니다. 마찬가지로, color 속성은 theme.color.text.primary를 사용하여 테마의 primary 텍스트 색상을 지정합니다.

이렇게 작성된 Button 컴포넌트는 테마의 속성에 따라 일관된 스타일이 적용되며, ThemeProvider를 통해 전역적으로 설정된 테마가 적용됩니다. 이를 통해 Button 컴포넌트는 일관된 디자인 시스템을 구축하는 데에 활용될 수 있습니다.

마지막으로, 타입스크립트를 활용하여 Styled Component와 ThemeProvider에 타입을 설정할 수 있습니다. styled-components.d.ts 파일에 타입 설정을 추가하여 타입 안정성을 보장할 수 있습니다. 이를 통해 IDE에서 테마 속성을 미리보기로 확인할 수 있고, 올바른 색상 값을 쉽게 선택할 수 있습니다.

styled-components.d.ts 파일에 대한 코드는 아래와 같습니다.

import theme from './styles/theme';

type Theme = typeof theme;

declare module 'styled-components' {
  export interface DefaultTheme extends Theme {}
}

위의 코드는 styled-components.d.ts 파일에 추가한 예시입니다. 이 파일은 타입스크립트에서 타입을 정의하는데 사용되며, styled-components 모듈에 대한 커스텀 타입을 선언합니다.

type Theme = typeof theme; 코드는 theme 객체의 타입을 추출하여 Theme 타입으로 정의합니다. 이를 통해 테마 객체의 속성을 타입 안전하게 참조할 수 있습니다.

declare module 'styled-components' 구문은 styled-components 모듈에 대한 타입 선언을 시작하는 부분입니다. DefaultTheme 인터페이스를 확장하여 Theme 타입을 기본 테마 타입으로 설정합니다. 이를 통해 styled-components를 사용하는 컴포넌트에서 DefaultTheme을 통해 테마의 속성을 타입 안전하게 참조할 수 있습니다.

이러한 방식으로 Styled Component와 ThemeProvider를 활용하면 일관된 디자인 시스템을 구축할 수 있습니다. 테마를 쉽게 적용하고 관리하며, 타입스크립트를 통해 타입 안정성을 보장하면서 개발 생산성을 향상시킬 수 있습니다.

profile
프론트엔드 공부하고 있는 정우시입니다.

0개의 댓글