-
Notifications
You must be signed in to change notification settings - Fork 53
[5팀 김채영] Chapter3-1. UI 컴포넌트 모듈화와 디자인 시스템 #14
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
rlacodud
wants to merge
22
commits into
hanghae-plus:main
Choose a base branch
from
rlacodud:main
base: main
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
- primitive.css: 색상 팔레트와 간격 정의 - index.css: @theme inline으로 Tailwind 유틸리티 매핑
- Storybook 설정 - Button, Badge 컴포넌트 스토리 추가 - 다크 모드 테마 토글 지원
- Button, Badge, Input, Select, Card, Table, Form 컴포넌트 추가 - CVA를 활용한 variant 패턴 적용 - 토큰 기반 스타일링으로 일관성 확보 - Badge variant: default, success, danger, warning, info, muted - Button variant: primary, secondary, danger, success
- Tailwind CSS 추가 - Storybook 추가 - postcss.config.js 제거
- Alert/Card 컴포넌트 variant별 색상 토큰 추가 - Card 컴포넌트 variant별 텍스트 색상 자동 적용 - Alert 컴포넌트 variant 스타일 적용 - Storybook 컬러 팔레트 문서 추가 - 사용되지 않는 토큰 정리
- atoms/molecules/organisms 폴더 구조 제거 - shadcn/ui 기반의 단순한 폴더 구조로 통합 - components/ui/ - 순수 UI 컴포넌트 - components/management/ - 도메인 특화 컴포넌트 - 기존 컴포넌트를 shadcn/ui 스타일로 마이그레이션 - 컴포넌트 구조 단순화로 유지보수성 향상
- ManagementPage를 순수 뷰 컴포넌트로 전환 - 비즈니스 로직을 커스텀 훅으로 분리 - useManagementPage: 페이지 상태 관리 및 API 호출 - useManagementPagination: 페이지네이션 로직 - useManagementStats: 통계 계산 로직 - form-utils: 폼 데이터 변환 유틸리티 - 도메인 상수 및 타입 정의 추가 - constants/management.ts: 역할, 상태, 카테고리 등 - type/management.ts: 타입 정의 - 관심사 분리로 코드 가독성 및 테스트 용이성 향상
- Dialog 컴포넌트 추가 - Pagination 컴포넌트 추가 - Switch 컴포넌트 추가 - Textarea 컴포넌트 추가 - NativeSelect 컴포넌트 추가 - 모든 컴포넌트에 CVA 기반 variants 적용
- Header 컴포넌트에 다크모드 토글 기능 구현 - localStorage를 통한 테마 설정 저장 - 시스템 설정 감지 지원 - styles/index.css에 다크모드 토큰 정의 - 모든 색상 토큰이 라이트/다크 모드 지원
- 기존 .ts 스토리 파일을 .tsx로 전환 - 새로운 컴포넌트 스토리 추가 - Dialog.stories.tsx - EntityTable.stories.tsx - InputField.stories.tsx - NativeSelect.stories.tsx - 기존 스토리 파일 업데이트 - Alert.stories.tsx - Badge.stories.tsx - Button.stories.tsx - Card.stories.tsx - Colors.stories.tsx
- styles/index.css: 디자인 토큰 시스템 개선 - InfoAlert 컴포넌트 스타일 업데이트 - main.tsx: 앱 초기화 로직 개선 - package.json: 의존성 업데이트
- shadCN Tabs 컴포넌트 추가 및 ManagementPage에 적용 - 탭 스타일을 버튼의 primary/secondary 스타일로 변경 - EntityTabContent 컴포넌트 분리로 코드 구조 개선 - 사용자/게시글 생성 폼에 필드별 에러 메시지 표시 기능 추가 - Required 필드 클라이언트 사이드 검증 추가 - 테스트 코드 수정 (role='tab'으로 변경)
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Chapter3-1. UI 컴포넌트 모듈화와 디자인 시스템
배포 링크
과제 목표
레거시 코드베이스를 현대적인 디자인 시스템으로 개편하는 실무 경험
Before 패키지 분석 후 After 패키지 개편
개편 목표
디자인 시스템
컴포넌트 아키텍처
사용할 도구
TailwindCSS 4.x
shadcn/ui
CVA (Class Variance Authority)
React Hook Form + Zod
필수 과제
1. 디자인 시스템 구축
2. Before 패키지 분석
3. 컴포넌트 개편
심화 과제
과제 회고
Before 패키지에서 발견한 문제점
(1) 접근성
(1-1) ESC키 지원 부재

ESC키로 팝업이 안 닫힌다. => 접근성 위배
(1-2) 닫기 버튼 순서 오류

모달의 닫기 버튼은 모달의 가장 마지막 요소로 마크업되어야 하나, 헤더 영역에 위치한다.
참고 문서
(1-3) ARIA 속성 부재

1️⃣ 모달 트리거 버튼
모달을 트리거하는 버튼에는 data-target 속성으로 모달 id가 부여되어야 한다.
2️⃣ 모달 영역
모달 영역에는 트리거 버튼과 동일한 이름의 id와 aria-labelledby를 지정해야 하고 role="dialog"로 해당 영역의 role을 명시해야 한다.
(2) 스타일
(2-1) 토큰없이 중복 사용되는 색상값



(2-2) 단위값 혼재

(2-3) 미흡한 반응형 처리

(2-4) 케이스 명세 미흡
한번에 각 컴포넌트의 props에 따른 케이스를 확인하기 어렵다.
(3) 컴포넌트
(3-1) 카테고리 미지정 시 대응 미흡

카테고리 미지정 후 생성 시 해당 영역 분기 처리가 미흡하다.
(3-2) 텍스트 분기 처리 미흡


옳은 조사가 와야 하는데 해당 영역에 대한 분기 처리가 미흡하다.
(4) 폴더 구조
(4-1) 비효율적인 폴더 구조

(4-2) 분리되어있지 않은 UI와 기능 로직

개편 과정에서 집중한 부분
단순히 UI를 예쁘게 만드는 것이 아니라 재사용성과 확장성을 고려한 UI 설계가 핵심이었습니다.
(1) before 패키지 분석
before 패키지를 빌드하고 분석하며 해당 내용을 블로그에 정리했습니다.
(1-1) 분석 과정
(1-2) 발견된 주요 문제점
(2) tailiwind 설정 + 디자인 토큰 생성
문제점 파악 후 일관된 디자인 시스템 구축을 위해 하드코딩된 색상 값은 제거하고 디자인 토큰을 생성했습니다.
(2-1) 원시 토큰 정의 (primitive.css)
(2-2) 의미론적 토큰 매핑 (index.css)
(3) shadCN으로 컴포넌트 생성 및 CVA 작업
기본적인 디자인 토큰 설정이 완료됐으면 shadCN으로 재사용 가능하고 타입 안전한 UI 컴포넌트를 생성합니다.
(4) Storybook 생성
구현한 컴포넌트를 문서화하기 위해 스토리북을 생성합니다.
이 때 컴포넌트 외에도 토큰값도 문서화하여 협업 시 파악이 쉽도록 합니다.
(5) PostManagement 마이그레이션
before의 복잡한 컴포넌트를 after의 깔끔한 구조로 전환합니다.
(5-1) 비즈니스 로직 분리.
(5-2) 커스텀 훅 분리
(5-3) 도메인 로직 분리
(5-4) 컴포넌트 분리
✅[추가 개선] 탭 레이아웃 구조 개선
Before 패키지의 Dashboard는 탭 버튼과 콘텐츠가 시각적으로 연결되지 않아 사용자가 현재 어떤 패널을 보고 있는지 인지하기 어려울 것 같다고 생각했습니다.
[문제점]
[개선 방향]
사용한 기술 스택 경험
1️⃣ TailwindCSS
TailwindCSS는 유지보수하던 프로젝트에 적용되어있어서 수정정도만 해본 경험이 전부였습니다.
그러나 퍼블리셔이다보니 직접 스타일을 짜는 게 더 편하기도 하고 가독성이 안좋아서 선호하지 않았습니다.
처음에는 디자인 토큰을 만드는데 왜 TailwindCSS를 사용하는지 이해가 안갔고 재윤님과 이에 관해 얘기를 나눴습니다.
그러다 TailwindCSS가 유틸리티 클래스 기반이라 토큰 적용을 즉각적으로 할 수 있다는 걸 알게 됐습니다.
일반적으로 TailwindCSS를 많이 사용하는 이유를 깨닫게 되면서 그게 장점이라면, 만약 토큰 적용만 필요한 프로젝트에서는 TailwindCSS가 오히려 용량을 차지할 수도 있겠다는 생각이 들어
토큰 적용을 즉각적으로 할 수 있는 또다른 라이브러리가 있는지 찾아보게 되면서 확장시키는 경험을 할 수 있었습니다.
2️⃣ shadcn/ui
shadcn도 지나가며 아는 정도였는데 우선 CLI로 코드를 적용할 수 있다는 게 신기했습니다.
마치 마트에서 사온 초밥 포장을 뜯고 그릇에 옮겨 직접 만든 것처럼 보이는 형태가 떠올랐습니다.
접근성을 보장하고 compound component를 제공한다는 점에서 react 프로젝트에서 널리 쓰이는 이유를 이해할 수 있었고
무엇보다 구조 잡기 귀찮은 모달이나 테이블에 대해 딸깍 한번으로 생성된다는 것에서 편리함을 몸소 깨달을 수 있었습니다.
여기에 cva라는 개념을 접목해 유형별 스타일링을 타입 정의하듯이 보기 좋게 적용할 수 있다는 점도 인상 깊었습니다.
어려웠던 점과 해결 방법
생각보다 다크모드를 구현할 때 색상 적용에서 애를 먹었습니다.
TailwindCSS의 기본 클래스와 충돌이 나서 그런가 싶어서 유니크한 네이밍으로 변경했음에도 몇몇 토큰은 다크모드가 제대로 적용되지 않아 명시적인 클래스명으로 정의하여 적용했습니다.
리뷰받고 싶거나 질문하고 싶은 내용
어떤 부분에서 세팅이 잘못되어 다크모드일 때, 특정 토큰만 정상 적용되고 그 외에는 적용이 안된 이유가 궁금합니다.
shadCN의 탭 컴포넌트를 활용하도록 수정하다보니 role을 button으로 찾는 부분에서 테스트가 실패해서 tab으로 변경했습니다!
=> 이 부분을 수정하는 것까지 의도된 부분이 맞을까용?
태그는 button이 맞지만 접근성 상 role은 tab으로 제공하는 게 맞다보니 테스트를 수정하지 않고 통과하는 방법을 모르겠습니다!
❗️과제 제출 이후 조금 더 리팩토링을 진행하고 싶어서 추가 커밋을 남겼습니다❗️
자세한 구현 과정과 회고는 아래 블로그에 정리했습니다! 😊
6주차_디자인 시스템 발전기
WIL 6주차_Chapter3-1. UI 컴포넌트 모듈화와 디자인 시스템