# [[Storybook Component Testing]] ## ๐Ÿ“Œ Brief ์‹œ Summary Storybook ์ปดํฌ๋„ŒํŠธ ํ…Œ์ŠคํŠธ๋Š” ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋…๋ฆฝ์ ์ธ ํ™˜๊ฒฝ์—์„œ ๊ตฌ์ถ•ํ•˜๊ณ  ์‹œ๊ฐ์  ํšŒ๊ท€(Visual Regression) ๋ฐ ์ ‘๊ทผ์„ฑ(Accessibility)์„ ์ž๋™ํ™”ํ•˜์—ฌ ๊ฒ€์ฆํ•˜๋Š” ๋ฐฉ๋ฒ•๋ก ์ž…๋‹ˆ๋‹ค [1-3]. ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ ๋ Œ๋”๋ง๋œ ์ปดํฌ๋„ŒํŠธ์˜ ์Šค๋ƒ…์ƒท์„ ์บก์ฒ˜ํ•˜์—ฌ ๊ธฐ์กด์˜ '์ •์ƒ' ๊ธฐ์ค€์„ (baseline)๊ณผ ๋น„๊ตํ•จ์œผ๋กœ์จ, ์˜๋„์น˜ ์•Š์€ UI ๋ณ€๊ฒฝ์ด๋‚˜ ์ ‘๊ทผ์„ฑ ์œ„๋ฐ˜์„ Pull Request(PR) ๋‹จ๊ณ„์—์„œ ์ฆ‰๊ฐ์ ์œผ๋กœ ์žก์•„๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [2-5]. ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•˜์ง€ ์•Š์•„๋„ ์Šคํ† ๋ฆฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‹œ๊ฐ์  ํ”ฝ์…€ ๋ณ€๊ฒฝ์„ ๊ฒ€์ฆํ•˜๋ฏ€๋กœ, ์ฝ”๋“œ ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ๋ฆฌ๋ทฐ ํšจ์œจ์„ฑ์„ ํฌ๊ฒŒ ๋†’์—ฌ์ค๋‹ˆ๋‹ค [3]. ## ๐Ÿ“– Core Content * **์ปดํฌ๋„ŒํŠธ ๊ฒฉ๋ฆฌ ๋ฐ ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ(Visual Testing):** Storybook์€ ๊ฐœ๋ฐœ์ž๊ฐ€ UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋…๋ฆฝ์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค [1]. ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ๋Š” Storybook์˜ ๊ฐ ์Šคํ† ๋ฆฌ๋ฅผ ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €(Chrome, Safari, Firefox ๋“ฑ)์—์„œ ๋ Œ๋”๋งํ•œ ํ›„ ํ”ฝ์…€ ๋‹จ์œ„๋กœ ์บก์ฒ˜ํ•˜์—ฌ ๊ธฐ์กด ๊ธฐ์ค€์„ ๊ณผ ๋น„๊ตํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค [2, 3]. HTML ๋งˆํฌ์—… ๋ธ”๋กญ(blob)์„ ๋น„๊ตํ•˜๋Š” ๊ธฐ์กด์˜ ์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ(Snapshot testing)์™€ ๋‹ฌ๋ฆฌ, ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ๋กœ ๊ฒฝํ—˜ํ•˜๋Š” ํ”ฝ์…€์„ ํ…Œ์ŠคํŠธํ•˜๋ฏ€๋กœ ๊ฑฐ์ง“ ์–‘์„ฑ(false positive)์„ ์ค„์ด๊ณ  ๋ณด๋‹ค ์ •ํ™•ํ•œ ๊ฒ€์ฆ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค [6]. * **์ธํ„ฐ๋ž™์…˜ ํ…Œ์ŠคํŠธ(Interaction Testing)์™€์˜ ๊ฒฐํ•ฉ:** ์ธํ„ฐ๋ž™์…˜ ํ…Œ์ŠคํŠธ๋Š” ์ด๋ฒคํŠธ, ์ƒํƒœ, ์ ‘๊ทผ์„ฑ ๋“ฑ ์ปดํฌ๋„ŒํŠธ์˜ ๋™์ž‘(behavior)์„ ๊ฒ€์ฆํ•˜๋Š” ๋ฐ˜๋ฉด, ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ๋Š” ๋ ˆ์ด์•„์›ƒ, ์ƒ‰์ƒ, ํƒ€์ดํฌ๊ทธ๋ž˜ํ”ผ ๋“ฑ์˜ ์™ธ๊ด€(appearance)์„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค [7]. ์ธํ„ฐ๋ž™์…˜ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ๋กœ๋”ฉ, ์—๋Ÿฌ, ํ˜ธ๋ฒ„ ๋“ฑ์˜ ๋‹ค์–‘ํ•œ UI ์ƒํƒœ๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•œ ํ›„, ๊ฐ ์ƒํƒœ์— ๋Œ€ํ•ด ์‹œ๊ฐ์  ์Šค๋ƒ…์ƒท์„ ์ดฌ์˜ํ•จ์œผ๋กœ์จ ๋™์ž‘๊ณผ ์‹œ๊ฐ์  ๊ฒ€์ฆ์„ ํ•˜๋‚˜์˜ ์›Œํฌํ”Œ๋กœ์šฐ๋กœ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 9]. * **์ ‘๊ทผ์„ฑ(Accessibility) ํšŒ๊ท€ ํ…Œ์ŠคํŠธ:** ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์ถ”๊ฐ€์ ์ธ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ ์—†์ด ์ ‘๊ทผ์„ฑ ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๋ฅผ ํ•จ๊ป˜ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์‹œ๊ฐ์  ๋ณ€๊ฒฝ ์‚ฌํ•ญ๊ณผ ํ•จ๊ป˜ ์ƒˆ๋กœ์šด ์ ‘๊ทผ์„ฑ ์œ„๋ฐ˜ ์‚ฌํ•ญ์„ ๋™์‹œ์— ํฌ์ฐฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [8, 9]. * **ํ”Œ๋žซํผ ๋ฐ ๋„๊ตฌ ์ƒํƒœ๊ณ„:** Storybook์€ Chromatic(Storybook ๋ฉ”์ธํ…Œ์ด๋„ˆ๊ฐ€ ๋งŒ๋“  ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค)์ด๋‚˜ Happo์™€ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ํ†ตํ•ด ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค [2, 3]. ์ด๋“ค ๋„๊ตฌ๋Š” ๋ณ‘๋ ฌ ํ…Œ์ŠคํŠธ, ๋‹ค์–‘ํ•œ ๋ทฐํฌํŠธ ํฌ๊ธฐ ์ง€์›, ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ œ๊ฑฐ ๋ฐ ๋น„๋™๊ธฐ ์—์…‹ ๋Œ€๊ธฐ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ๋ฅผ ์•ˆ์ •์ ์œผ๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค [2, 4]. ## โš–๏ธ Trade-offs & Caveats * **ํ…Œ์ŠคํŠธ์˜ ๋ถˆ์•ˆ์ •์„ฑ(Flakiness) ๋ฐ ๋…ธ์ด์ฆˆ:** ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ๋Š” ๋ Œ๋”๋ง๋œ ํ”ฝ์…€์„ ๋น„๊ตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฏธ์ง€ ์••์ถ•, ์•ˆํ‹ฐ์•จ๋ฆฌ์–ด์‹ฑ(anti-aliasing), ์• ๋‹ˆ๋ฉ”์ด์…˜, ๋น„๋™๊ธฐ ํฐํŠธ ๋ฐ ์—์…‹ ๋กœ๋”ฉ ๋“ฑ์œผ๋กœ ์ธํ•ด ๋ฏธ์„ธํ•œ ํ”ฝ์…€ ์ฐจ์ด๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค [4, 10]. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ๋„๊ตฌ ์ž์ฒด์—์„œ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์Œ์†Œ๊ฑฐ(silence)ํ•˜๊ฑฐ๋‚˜, ์‹œ๊ฐ์  ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ '์ƒ‰์ƒ-๋ธํƒ€ ํ—ˆ์šฉ ์˜ค์ฐจ(color-delta tolerance)'๋ฅผ ์„ค์ •ํ•˜์—ฌ ์‚ฌ์†Œํ•œ ์ฐจ์ด๋ฅผ ๋ฌด์‹œํ•˜๋„๋ก ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๋Š” ์ œ์•ฝ์ด ์žˆ์Šต๋‹ˆ๋‹ค [4, 9, 10]. * **ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค ์˜์กด๋„:** Chromatic์ด๋‚˜ Happo์™€ ๊ฐ™์€ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ๋„๊ตฌ๋Š” ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์—์„œ ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๊ตฌ๋™ํ•˜์—ฌ ์บก์ฒ˜๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฏ€๋กœ, ์ด๋ฅผ ์ž๋™ํ™” ์›Œํฌํ”Œ๋กœ์šฐ(CI/CD)์— ์—ฐ๋™ํ•˜๊ณ  ์ตœ์ ์˜ ์„ฑ๋Šฅ์„ ์–ป๊ธฐ ์œ„ํ•ด ์™ธ๋ถ€ ์„œ๋น„์Šค ๊ฐ€์ž… ๋ฐ ์ธ์ฆ ํ† ํฐ(Environment variables) ๊ด€๋ฆฌ๊ฐ€ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค [5, 11]. ## ๐Ÿ”— Knowledge Connections ### Related Concepts #### [ํ…Œ์ŠคํŠธ ์œ ํ˜• ๋ฐ ๋ฐฉ๋ฒ•๋ก  (Testing Types & Methodologies)] - [[Visual Regression Testing]] - ์—ฐ๊ฒฐ ์ด์œ : Storybook ์ปดํฌ๋„ŒํŠธ ํ…Œ์ŠคํŠธ์˜ ํ•ต์‹ฌ ์›๋ฆฌ๋กœ, ์ฝ”๋“œ ๋ณ€๊ฒฝ ์ „ํ›„์˜ UI ํ”ฝ์…€ ๋ Œ๋”๋ง ๊ฒฐ๊ณผ๋ฅผ ๋น„๊ตํ•˜๋Š” ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค [2, 6]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: HTML ๋งˆํฌ์—…๋งŒ ๋น„๊ตํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ํ•œ๊ณ„์ ์„ ๊ทน๋ณตํ•˜๊ณ , ์‹ค์ œ ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๋Š” ํ™”๋ฉด์˜ ๊ฒฐํ•จ์„ ์–ด๋–ป๊ฒŒ ์ถ”์ ํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - [[Snapshot Testing]] - ์—ฐ๊ฒฐ ์ด์œ : ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ์™€ ์ž์ฃผ ๋น„๊ต๋˜๋Š” ํ…Œ์ŠคํŠธ ๋ฐฉ์‹์œผ๋กœ, ์ฃผ๋กœ ๋ Œ๋”๋ง๋œ ๋งˆํฌ์—…(HTML ๋ธ”๋กญ)์„ ์ €์žฅํ•˜๊ณ  ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค [6]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์‹œ๊ฐ์ ์œผ๋กœ๋Š” ๋ณ€๊ฒฝ์ด ์—†์ง€๋งŒ ์ฝ”๋“œ ๊ตฌ์กฐ๊ฐ€ ๋ฐ”๋€Œ์—ˆ์„ ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๊ฑฐ์ง“ ์–‘์„ฑ(false positive) ์˜ค๋ฅ˜์˜ ์›์ธ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - [[Interaction Testing]] - ์—ฐ๊ฒฐ ์ด์œ : Storybook ๋‚ด์—์„œ ์ปดํฌ๋„ŒํŠธ์˜ ํŠน์ • ์ด๋ฒคํŠธ๋‚˜ ์ƒํƒœ(์˜ˆ: ํด๋ฆญ, ์ž…๋ ฅ, ํ˜ธ๋ฒ„ ๋“ฑ)๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜๋Š” ํ…Œ์ŠคํŠธ์ž…๋‹ˆ๋‹ค [7, 8]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ปดํฌ๋„ŒํŠธ์˜ ๋ณต์žกํ•œ ๋™์ž‘ ์ƒํƒœ๋ฅผ ๋จผ์ € ๊ตฌํ˜„ํ•œ ๋’ค ๊ทธ ๊ฒฐ๊ด๊ฐ’์— ๋Œ€ํ•œ ์‹œ๊ฐ์  ์Šค๋ƒ…์ƒท์„ ์ฐ๋Š” ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. #### [ํ…Œ์ŠคํŠธ ๋ฐ ๋ฐฐํฌ ๋„๊ตฌ (Tools & Infrastructure)] - [[Chromatic]] / [[Happo]] - ์—ฐ๊ฒฐ ์ด์œ : Storybook์˜ ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ ๋ฐ ์ ‘๊ทผ์„ฑ ๊ฒ€์ฆ์„ ์‹ค์ œ ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ ์ž๋™ํ™”ํ•ด ์ฃผ๋Š” ๋Œ€ํ‘œ์ ์ธ ์„œ๋น„์Šค ๋ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ์ž…๋‹ˆ๋‹ค [2, 3]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ—ˆ์šฉ ์˜ค์ฐจ(tolerance) ์„ค์ •, ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ œ์–ด ๋“ฑ ํ…Œ์ŠคํŠธ ๋…ธ์ด์ฆˆ๋ฅผ ์ค„์ด๋Š” ์‹ค๋ฌด์ ์ธ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋ฐฐ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. - [[CI/CD Integration]] - ์—ฐ๊ฒฐ ์ด์œ : Storybook ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ๋Š” GitHub, GitLab, CircleCI ๋“ฑ์˜ CI ํŒŒ์ดํ”„๋ผ์ธ์— ํ†ตํ•ฉ๋˜์–ด PR ๋‹จ๊ณ„์—์„œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๊ฒ€์ฆํ•ฉ๋‹ˆ๋‹ค [4, 5]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ํ”„๋ก ํŠธ์—”๋“œ ํŒ€์ด ์ฝ”๋“œ๋ฅผ ๋ณ‘ํ•ฉํ•˜๊ธฐ ์ „ UI ๋ฒ„๊ทธ๋ฅผ ์ฐจ๋‹จํ•˜๋Š” ์ž๋™ํ™”๋œ ๊ฒŒ์ดํŠธ์›จ์ด ์‹œ์Šคํ…œ์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ### Deeper Research Questions - Storybook์˜ ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ(Visual tests)์™€ ๋งˆํฌ์—… ๊ธฐ๋ฐ˜์˜ ์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ(Snapshot tests) ๊ฐ„์˜ ๊ตฌ์ฒด์ ์ธ ์„ฑ๋Šฅ ๋ฐ ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ธ๊ฐ€? - Chromatic์ด๋‚˜ Happo ๊ฐ™์€ ๋„๊ตฌ๋Š” ๋™์ ์ธ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด๋‚˜ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ๋กœ๋”ฉ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ํ…Œ์ŠคํŠธ ์‹คํŒจ(Flaky tests)๋ฅผ ๊ธฐ์ˆ ์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ๋ฐฉ์ง€ํ•˜๋Š”๊ฐ€? - ์ƒํ˜ธ์ž‘์šฉ ํ…Œ์ŠคํŠธ(Interaction testing)๋ฅผ ํ†ตํ•ด ๋„์ถœ๋œ ์—ฌ๋Ÿฌ UI ์ƒํƒœ๋ฅผ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ์™€ ์—ฐ๋™ํ•  ๋•Œ, ํ…Œ์ŠคํŠธ ์ปค๋ฒ„๋ฆฌ์ง€ ์ธก๋ฉด์—์„œ ์–ด๋–ค ํ•œ๊ณ„์ ์ด ์กด์žฌํ•˜๋Š”๊ฐ€? - ๋‹ค์ˆ˜์˜ ๋ทฐํฌํŠธ ํฌ๊ธฐ์™€ ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ € ํ™˜๊ฒฝ์—์„œ Visual Regression Testing์„ ์‹คํ–‰ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” CI ํŒŒ์ดํ”„๋ผ์ธ์˜ ๋ณ‘๋ชฉ ํ˜„์ƒ์€ ์–ด๋–ป๊ฒŒ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? - ์ ‘๊ทผ์„ฑ ํšŒ๊ท€ ํ…Œ์ŠคํŠธ(Accessibility regression testing)๊ฐ€ ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ ์›Œํฌํ”Œ๋กœ์šฐ์— ํ†ตํ•ฉ๋  ๋•Œ, ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ์ ‘๊ทผ์„ฑ ์œ„๋ฐ˜(์˜ˆ: ๋ช…๋„ ๋Œ€๋น„, ARIA ์†์„ฑ ๋“ฑ)์„ ์บก์ฒ˜ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? ### Practical Application Contexts - **Implementation:** React ๋“ฑ UI ์ปดํฌ๋„ŒํŠธ ๊ฐœ๋ฐœ ์‹œ, ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋กœ Storybook ์Šคํ† ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  `@chromatic-com/storybook` ๋˜๋Š” Happo ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•˜์—ฌ `chromatic.config.json` ์„ค์ •์„ ํ†ตํ•ด ํ”„๋กœ์ ํŠธ์— ์ ์šฉํ•ฉ๋‹ˆ๋‹ค [2, 11, 12]. - **System Design:** ํ”„๋ก ํŠธ์—”๋“œ ํŒ€์˜ ํ˜‘์—… ์•„ํ‚คํ…์ฒ˜์— ์‹œ๊ฐ์  ๋ฆฌ๋ทฐ ์‹œ์Šคํ…œ์„ ๋„์ž…ํ•˜์—ฌ, ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ๋งŒ์ด ์•„๋‹Œ ํด๋ผ์šฐ๋“œ ๋ธŒ๋ผ์šฐ์ €(ํฌ๋กฌ, ์‚ฌํŒŒ๋ฆฌ ๋“ฑ) ๋ Œ๋”๋ง ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋””์ž์ธ ์‹œ์Šคํ…œ์˜ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๋„๋ก ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค [2, 5]. - **Operation / Maintenance:** CI ํŒŒ์ดํ”„๋ผ์ธ์—์„œ PR์ด ์ƒ์„ฑ๋  ๋•Œ๋งˆ๋‹ค ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ์„ ์‹œ ๐ŸŸก(๋…ธ๋ž€์ƒ‰)์œผ๋กœ ํ‘œ์‹œ๋˜๋Š” ํ”ฝ์…€ ์ฐจ์ด๋ฅผ ๋‹ด๋‹น์ž๊ฐ€ ํ™•์ธ ํ›„ โœ…(์Šน์ธ) ์ฒ˜๋ฆฌํ•˜์—ฌ ์ƒˆ๋กœ์šด Baseline์„ ๊ฐฑ์‹ ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์šด์˜ํ•ฉ๋‹ˆ๋‹ค [13, 14]. - **Learning Path:** ๊ธฐ์ดˆ์ ์ธ Storybook ์ปดํฌ๋„ŒํŠธ ๋ Œ๋”๋ง ์ž‘์„ฑ๋ฒ• ์Šต๋“ โ†’ Interaction Testing์„ ํ†ตํ•œ ์ƒํƒœ ์ œ์–ด ํ•™์Šต โ†’ Chromatic/Happo ๋“ฑ์„ ์—ฐ๋™ํ•œ ์ž๋™ํ™” Visual Testing ๋ฐ CI ํ™˜๊ฒฝ ๊ตฌ์ถ• ์ˆœ์œผ๋กœ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค. - **My Project Relevance:** ํƒ€์ธ์ด ์ž‘์„ฑํ•œ ๋ ˆ๊ฑฐ์‹œ React ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜๊ฑฐ๋‚˜(TS ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜, Hooks ๋ณ€ํ™˜, ํŒจํ‚ค์ง€ ์—…๋ฐ์ดํŠธ ๋“ฑ), CSS ๋ฐฉ์‹(Tailwind, CSS Modules ๋“ฑ)์„ ํ‘œ์ค€ํ™”ํ•  ๋•Œ ๊ธฐ์กด UI๊ฐ€ ์˜๋„์น˜ ์•Š๊ฒŒ ๊นจ์ง€๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๋Š” ์•ˆ์ „๋ง(UI test suite)์œผ๋กœ ๋ฐ˜๋“œ์‹œ ํ™œ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค [1, 15]. ### Adjacent Topics - [[Component-Driven UI]] - ํ™•์žฅ ๋ฐฉํ–ฅ: ํŽ˜์ด์ง€๋‚˜ ํ™”๋ฉด ์ „์ฒด๊ฐ€ ์•„๋‹Œ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž‘์€ ์ปดํฌ๋„ŒํŠธ ๋‹จ์œ„๋ถ€ํ„ฐ ์ƒํ–ฅ์‹(Bottom-up)์œผ๋กœ ๊ฐœ๋ฐœํ•˜๋Š” ๊ฐœ๋…์œผ๋กœ, Storybook์˜ ์กด์žฌ ์ด์œ ์™€ ๋งž๋‹ฟ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. - [[Pull Request (PR) Code Review]] - ํ™•์žฅ ๋ฐฉํ–ฅ: ๋กœ์ง ์ฝ”๋“œ ๋ฆฌ๋ทฐ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, CI์™€ ์—ฐ๋™๋œ ์‹œ๊ฐ์  ๋””ํ”„(diff) ๋„๊ตฌ๋ฅผ ํ†ตํ•ด UI ๋ฐ ๋””์ž์ธ ๋ณ€๊ฒฝ์„ ํŒ€์›๋“ค๊ณผ ํšจ๊ณผ์ ์œผ๋กœ ์‹œ๊ฐ์ ์œผ๋กœ ๋ฆฌ๋ทฐํ•˜๋Š” ๋ฌธํ™”๋กœ ํ™•์žฅ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. --- *Last updated: 2026-04-30*