Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
조합이폭발하는디자인시스템이걸눈으로도테스트하라고요
Search
giljongyu
October 25, 2026
Programming
220
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
조합이폭발하는디자인시스템이걸눈으로도테스트하라고요
feconf2026
giljongyu
October 25, 2026
Other Decks in Programming
See All in Programming
APNsからLive Activityを開始する話
yumnumm
0
170
sbt 2.0: takeoff
eed3si9n
0
170
気持ちぃ〜角丸 Squircle
ryu1013
0
330
コードレビューのボトルネックを"する側"と"される側"の両面から解消する
yub0n
2
1.7k
GraphQL の onError と Nullability のこれから
quramy
0
170
Lambda durable functionsでHuman in the Loopを楽に…楽に……
har1101
1
190
Event is what happens
moro
2
1.3k
JIS keyboard support in Omarchy
lef237
0
150
IBM Bob でAI駆動開発『QC-Playbook』
ichirokano2
0
120
3回つくってわかった、 定期実行ジョブ基盤の本質情報
takai
0
610
Next.js: The final boss of Web Performance
guaca
0
320
オーケストレーション記述言語 Katari
yukikurage
0
180
Featured
See All Featured
Why Our Code Smells
bkeepers
PRO
340
58k
Technical Leadership for Architectural Decision Making
baasie
3
610
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Rebuilding a faster, lazier Slack
samanthasiow
85
9.7k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
610
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
1k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
20k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.7k
AI Search: Where Are We & What Can We Do About It?
aleyda
0
8.1k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
810
Building the Perfect Custom Keyboard
takai
2
910
How to make the Groovebox
asonas
2
2.5k
Transcript
FECONF 2026 조합이 폭발하는 디자인 시스템, 이걸 눈으로도 테스트하라고요? 유길종
| Frontend Platform Engineer Viva Republica (Toss)
수많은 서비스가 디자인 시스템에 직접 의존해요 TDS 서비스 A 서비스
B 서비스 C 서비스 D
시간이 흐르면서 컴포넌트 간의 의존 관계도 매우 복잡해졌어요 컴포넌트
컴포넌트 하나만 건드려도 엄청 많은 컴포넌트에 영향이 가요
넓게 전파되는 시각적 변화를 잘 감지하고 핸들링할 수 없을까?
Visual Regression Test ( 시각 회귀 테스트 )
시각 회귀 테스트는 코드 변경 전과 후의 화면 스크린샷을 비교하여
의도하지 않은 UI 디자인 변경이나 오류를 감지하는 테스트
시각 회귀 테스트는 코드 변경 전과 후의 화면 스크린샷을 비교하여
의도하지 않은 UI 디자인 변경이나 오류를 감지하는 테스트
코드를 바꿨을 때 어떤 시각적 변경이 일어나는지 바로 알 수
있어요 의도한 변경이라면 베이스라인을 업데이트하여 새로운 기준으로 만들어요 코드 수정으로 인해 UI의 의도치 않은 변화가 생기는 회귀 문제를 차단해요
여기까진 참 좋은 것 같은데..
느려요 테스트를 위해 실제 웹브라우저가 필요해요 스냅샷마다 격리된 환경을 제공하기
위한 환경 설정 비용이 발생해요 화면이 안정화 될 때까지 기다렸다가 캡쳐해야 오탐이 안 생겨요 잘깨져요 사용자의 코드가 비결정적이면 매번 실행 결과가 달라져요 똑같은 코드도 실행 환경에 따라 미묘하게 결과물이 다르게 나와요 CDN 등의 외부 환경의 변화나 네트워크 환경에도 영향을 많이 받아요
느린걸 잡으면 잘 깨져요 잘 깨지는걸 잡으면 느려져요
느린것도 문제지만 잘 깨지는 건 더 큰 문제에요
보통 업계에서는.. 01 02 렌더링 03 안정화 대기 스냅샷 캡쳐
Document의 폰트 로딩을 기다려요
Dom Tree의 변경을 옵저빙해요
네트워크 요청이 잠잠해질 때 까지 기다려요
Math.random , new Date() 같은 함수의 반환값을 고정해요
+약간의 휴리스틱 네트워크 요청이 N 초 동안 발생하지 않았다면 잠잠한건가?
DOM의 변경이 N 초 동안 없으면 안정화된건가? 어느정도의 휴리스틱이 필요할 수 밖에 없어요
신뢰가능한 실행 환경을 만드는것도 중요해요
None
수평 확장이 가능하면서 일관된 실행 환경을 보장해야 해요
구현은 어떻게하지?
None
vitest를 쓰면 샤딩, 병렬 워커 설정등이 따라와요 Storybook을 쓰면 추가
코드 작성 없이 스냅샷 대상을 얻을 수 있어요
GitHub Actions를 테스트 환경의 SSOT로 삼아요
명령어를 입력하면 깃허브액션 워크플로우를 트리거해요
CI를 통해 스냅샷이 깨진 상태로는 병합할 수 없게 해요
HAPPY END..?
였으면 좋았을텐데요
이런 일이 생기기 시작했어요 A B 개발자 A 엇 이거
왜 시각 테스트에서 안 잡혔을까요? 개발자 B 이건 시각 테스트에서 검사하는 목록에 없는 케이스여서 안 잡힌 것 같아요
“Program testing can be used to show the presence of
bugs, but never to show their absence!” 프로그램 테스트는 버그가 존재함을 보여줄 수는 있지만, 버그가 없음을 보여줄 수는 없다.
놓치는 시각 조합이 있는게 문제라면 가능한 시각 조합을 다 만들면
되는 거 아니에요?
None
Pseudo State Base Hover Active Focus
Color Scheme Dark Light
그 외에도.. 등등등 Slot Size variant · disabled · loading
· … Color
모든 축의 값을 곱하면 Pseudo State ColorScheme color variant size
4 2 7 3 3 startIcon endIcon fullWidth disabled loading 2 2 2 2 2 가능한 조합 4×2×7×3×3×2×2×2×2×2 16,128
게다가 우리는 컴포넌트 하나만 책임지는게 아니죠
MUI만 보더라도 지원하는 컴포넌트가.. 60개
가능한 경우의 수가 곱셈으로 늘어나게되면 금새 감당할 수 없는 정도의
숫자가 됩니다
페어와이즈 테스트 하면 되는거 아니에요? 소프트웨어의 결함은 대부분 1개 혹은
2개의 매개변수의 상호작용에서 발생한다고 봐요 모든 두요소의 조합을 한번씩만 테스트해도 90% 이상의 결함을 발견할 수 있다. 조합하는 매개변수를 늘린 3-way, 4-way test 도 있어요
상태를 2개씩 가지는 매개변수 3개가 있다고 가정해봐요 전체 경우의수는 2*2*2
로 8이에요
페어와이즈 기법을 적용하면 총 조합이 4로 줄어들어요 그러면서도 임의의 두
속성에서 가능한 모든 값의 조합이 한번씩 등장하죠
전체 조합과 페어와이즈 전체 조합 2 16 페어 와이즈면 =
65,536 = 총 조합이 늘어날 수록 페어 와이즈의 효과도 기하급수적으로 커져요 8
페어와이즈 테스트 하면 되는거 아니에요? 변인 하나만 추가 되어도 모든
스냅샷이 재생성 되어 변경점을 알기 어려워요 시각적 변경이 중요한 축들의 전체 커버리지가 보장되는 게 더 중요했어요 중요한 시각적 변경을 담는 Props를 큐레이션 하는 작업은 여전히 중요했어요
조합 폭발을 막으려면 곱셈 자체를 줄여야 해요
자원이 한정되어 있다면 무엇을 테스트할지를 결정하는 것도 중요해요
곱셈을 어떻게 줄일 수 있을까?
Structure / Layout Visual / Appearance
Visual / Appearance의 변경은 Structure / Layout에 영향을 주지 않는다.
None
이정도면 해볼만한데..?
곱셈을 쪼갤 축만 잘 선언해주면 테스트케이스는 알아서 생성해줄 수 있을
것이다 축 선언 조합 생성 테스트 화면
가능한 조합을 모두 곱하는 대신 관심 있는 축끼리만 곱할 수
있으면 어떨까? 개발자가 관심 있는 축만 잘 선언하면 시각 테스트용 화면이 알아서 생성되면 어떨까?
오버레이되는 컴포넌트들은 어떻게 찍지..?
화면 중앙에 뜨는 스펙의 컴포넌트들은 한 화면에 여러개를 띄우면 겹쳐져버려요
내부적으로 fixed한 컴포넌트들도 각 컴포넌트마다 relative한 컨테이너를 제공해주면 어떨까? 한
스냅샷에서 여러 컴포넌트를 한번에 찍을 수 있지 않을까?
None
Select 같이 Trigger를 기준으로 오버레이되는 컴포넌트들은 Trigger 기준으로 너비나 높이를
배치해버리면 겹쳐져요
오버레이되는 컴포넌트들의 너비, 높이를 고려해야하는 경우엔 너비, 높이에 대한 안전
마진을 줄 수 있는 인터페이스를 열어주었어요
None
TDS는 지금도 매일 5,000장 이 넘는 스냅샷을 검증하고 있어요
일단은.. HAPPY END..!
마치며 모든 선택에는 트레이드 오프가 있다. 테스트는 버그가 없음을 보여줄
수는 없다. 무엇을 원하는지 모르면 좋은 테스트를 작성할 수 없다.
감사합니다