# [[Visual Regression Testing|Visual Regression Testing]] ## ๐Ÿ“Œ Brief Summary ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ(Visual Regression Testing)๋Š” ์Šคํ† ๋ฆฌ๋ถ(Storybook) ๋“ฑ์˜ ๋„๊ตฌ๋กœ ๋ Œ๋”๋ง๋œ ์ปดํฌ๋„ŒํŠธ์˜ ํ”ฝ์…€ ๋‹จ์œ„ ์Šคํฌ๋ฆฐ์ƒท์„ ์บก์ฒ˜ํ•˜์—ฌ ์ด์ „์— ์•Œ๋ ค์ง„ "์ •์ƒ(baseline)" ์ƒํƒœ์˜ ์Šคํฌ๋ฆฐ์ƒท๊ณผ ์ž๋™์œผ๋กœ ๋น„๊ตํ•˜๋Š” ํ…Œ์ŠคํŠธ ๋ฐฉ์‹์ด๋‹ค [1, 2]. ์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž๋Š” ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(PR) ๊ณผ์ •์—์„œ ์˜๋„์น˜ ์•Š์€ UI ๋ ˆ์ด์•„์›ƒ, ์ƒ‰์ƒ, ํƒ€์ดํฌ๊ทธ๋ž˜ํ”ผ ๋“ฑ์˜ ์‹œ๊ฐ์  ๋ณ€๊ฒฝ์ด๋‚˜ ๊ฒฐํ•จ์„ ์ฐพ์•„๋‚ผ ์ˆ˜ ์žˆ๋‹ค [3-5]. HTML ๋งˆํฌ์—…๋งŒ ๋น„๊ตํ•˜๋Š” ๊ธฐ์กด์˜ ์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ์™€ ๋‹ฌ๋ฆฌ, ์‹ค์ œ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฒฝํ—˜ํ•˜๋Š” ํ™”๋ฉด ํ”ฝ์…€์„ ์ง์ ‘ ๊ฒ€์ฆํ•˜๋ฏ€๋กœ ์ถ”๊ฐ€์ ์ธ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ์ด๋‚˜ ์œ ์ง€๋ณด์ˆ˜ ๋ถ€๋‹ด์„ ์ค„์ด๋ฉด์„œ๋„ ์˜คํƒ(false positive)์„ ์ตœ์†Œํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด ํŠน์ง•์ด๋‹ค [1, 2]. ## ๐Ÿ“– Core Content * **์ž‘๋™ ์›๋ฆฌ ๋ฐ ํ”„๋กœ์„ธ์Šค:** ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๋Š” ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์„ ๋•Œ ๋ชจ๋“  ์Šคํ† ๋ฆฌ(story)๋ฅผ ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ €(Chrome, Firefox, Safari ๋“ฑ) ํ™˜๊ฒฝ์—์„œ ๋ Œ๋”๋งํ•˜๊ณ , ํ•ด๋‹น ํ™”๋ฉด์„ ์บก์ฒ˜ํ•˜์—ฌ ๊ธฐ์กด์˜ ๊ธฐ์ค€์„ (baseline)๊ณผ ๋น„๊ตํ•œ๋‹ค [4, 6]. ๋งŒ์•ฝ ๋ ˆ์ด์•„์›ƒ์ด๋‚˜ ์ƒ‰์ƒ ๋“ฑ์— ์˜๋„์น˜ ์•Š์€ ๋ณ€ํ™”๊ฐ€ ๊ฐ์ง€๋˜๋ฉด ํ•ด๋‹น ์ฐจ์ด์ ์„ ๊ฐ•์กฐํ•˜์—ฌ PR์—์„œ ์ˆ˜๋™ ๊ฒ€ํ† ๋ฅผ ๊ฑฐ์น˜๊ฒŒ ํ•จ์œผ๋กœ์จ ์‹œ๊ฐ์  ๊ฒฐํ•จ์ด ํ”„๋กœ๋•์…˜์œผ๋กœ ๋ฐฐํฌ๋˜๋Š” ๊ฒƒ์„ ์ฐจ๋‹จํ•œ๋‹ค [3, 6, 7]. ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์˜๋„๋œ ๊ฒƒ์ด๋ผ๋ฉด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ƒˆ๋กœ์šด ๊ธฐ์ค€์„ ์œผ๋กœ ์Šน์ธ(accept)ํ•˜์—ฌ ๋กœ์ปฌ ๋ฐ CI ํ™˜๊ฒฝ์— ๋™๊ธฐํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค [7, 8]. * **์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ(Snapshot Testing)์™€์˜ ์ฐจ์ด์ :** ๊ธฐ์กด ์Šค๋ƒ…์ƒท ํ…Œ์ŠคํŠธ๋Š” ๋ Œ๋”๋ง๋œ HTML ๋งˆํฌ์—… ๋ธ”๋ก์„ ๋น„๊ตํ•˜๊ธฐ ๋•Œ๋ฌธ์—, ์ฝ”๋“œ๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ์œผ๋‚˜ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ณด์ด๋Š” ์‹ค์ œ ์‹œ๊ฐ์  ๋ณ€๊ฒฝ์ด ์—†๋Š” ๊ฒฝ์šฐ์—๋„ ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•˜๋Š” ์˜คํƒ(false positive)์ด ๋ฐœ์ƒํ•˜๊ธฐ ์‰ฝ๋‹ค [2]. ๋ฐ˜๋ฉด ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๋Š” ๋ Œ๋”๋ง๋œ ํ”ฝ์…€ ์ž์ฒด๋ฅผ ๋น„๊ตํ•˜๋ฏ€๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ์‹ค์ œ๋กœ ๊ฒฝํ—˜ํ•˜๋Š” UI์˜ ๋ชจ์–‘, ๊ฐ„๊ฒฉ, ๋ฐ˜์‘ํ˜• ๋™์ž‘ ๋“ฑ์„ ํ›จ์”ฌ ๋” ์ •ํ™•ํ•˜๊ณ  ํ’๋ถ€ํ•˜๊ฒŒ ๊ฒ€์ฆํ•  ์ˆ˜ ์žˆ๋‹ค [2, 5]. * **์ธํ„ฐ๋ž™์…˜(Interaction) ๊ธฐ๋ฐ˜ ์ƒํƒœ ๊ฒ€์ฆ:** ์ปดํฌ๋„ŒํŠธ์˜ ๋กœ๋”ฉ, ์—๋Ÿฌ, ํ˜ธ๋ฒ„(hover), ๋ฉ”๋‰ด ์—ด๋ฆผ ๋“ฑ์˜ ๋‹ค์–‘ํ•œ UI ์ƒํƒœ๋ฅผ ๊ฒ€์ฆํ•˜๊ธฐ ์œ„ํ•ด ์Šคํ† ๋ฆฌ๋ถ์˜ ์ธํ„ฐ๋ž™์…˜ ํ…Œ์ŠคํŠธ์™€ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๋ฅผ ๊ฒฐํ•ฉํ•  ์ˆ˜ ์žˆ๋‹ค [9]. ์ธํ„ฐ๋ž™์…˜ ํ…Œ์ŠคํŠธ๋ฅผ ํ†ตํ•ด ์ปดํฌ๋„ŒํŠธ๋ฅผ ํŠน์ • ์ƒํƒœ๋กœ ๋งŒ๋“  ํ›„ ์Šคํฌ๋ฆฐ์ƒท์„ ์ฐ์Œ์œผ๋กœ์จ ๋™์ ์ธ ํ–‰๋™์— ๋Œ€ํ•œ ์‹œ๊ฐ์  ๊ฒฐํ•จ ์œ ๋ฌด๊นŒ์ง€ ํ•˜๋‚˜์˜ ์›Œํฌํ”Œ๋กœ์šฐ ์•ˆ์—์„œ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค [9, 10]. * **CI ํŒŒ์ดํ”„๋ผ์ธ ์ž๋™ํ™”:** ์ด ํ…Œ์ŠคํŠธ๋Š” GitHub Actions, GitLab Pipelines ๋“ฑ CI ํ™˜๊ฒฝ๊ณผ ์›ํ™œํ•˜๊ฒŒ ํ†ตํ•ฉ๋˜์–ด ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(PR)๋งˆ๋‹ค ์ž๋™์œผ๋กœ ์‹คํ–‰๋œ๋‹ค [11, 12]. ํ…Œ์ŠคํŠธ๊ฐ€ ์™„๋ฃŒ๋˜๋ฉด PR์— UI ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ์•Œ๋ฆผ(badge)์„ ์ œ๊ณตํ•˜์—ฌ, ๋ฆฌ๋ทฐ์–ด๊ฐ€ ๋ชจ๋“  ์ƒํƒœ๋ฅผ ์ผ์ผ์ด ํ™•์ธํ•˜๋Š” ๋Œ€์‹  ๋ณ€๊ฒฝ๋œ ๋ถ€๋ถ„(diffs)์—๋งŒ ์ง‘์ค‘ํ•ด์„œ ๋ฆฌ๋ทฐํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š”๋‹ค [6, 12]. ## โš–๏ธ Trade-offs & Caveats * **๋ฏธ์„ธํ•œ ํ”ฝ์…€ ์ฐจ์ด๋กœ ์ธํ•œ ๋…ธ์ด์ฆˆ(Flakiness):** ๋ธŒ๋ผ์šฐ์ €์˜ ์ด๋ฏธ์ง€ ์••์ถ• ๋…ธ์ด์ฆˆ๋‚˜ ์•ˆํ‹ฐ์•จ๋ฆฌ์–ด์‹ฑ(anti-aliasing) ์ฒ˜๋ฆฌ ๋“ฑ ์•„์ฃผ ๋ฏธ์„ธํ•œ ํ”ฝ์…€ ์ฐจ์ด ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ๋Š” ๊ฒฐํ•จ์ด ์•„๋‹˜์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์‹œ๊ฐ์  ๋ณ€๊ฒฝ์œผ๋กœ ๊ฐ์ง€๋˜๋Š” ํ…Œ์ŠคํŠธ ๋ถˆ์•ˆ์ •์„ฑ(Flake)์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค [11, 13]. ์ด๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ ๋„๊ตฌ์—์„œ๋Š” ์ƒ‰์ƒ ์ฐจ์ด ํ—ˆ์šฉ์น˜(color-delta tolerance) ์ž„๊ณ„๊ฐ’์„ ์„ค์ •ํ•˜์—ฌ ํ•ด๋‹น ๋ฒ”์ฃผ ์•„๋ž˜์˜ ์ฐจ์ด๋Š” ๋…ธ์ด์ฆˆ๋กœ ๋ฌด์‹œํ•˜๋Š” ์ตœ์ ํ™” ์ž‘์—…์ด ์š”๊ตฌ๋œ๋‹ค [10, 13]. * **๋น„๋™๊ธฐ ์š”์†Œ ๋ฐ ์• ๋‹ˆ๋ฉ”์ด์…˜ ์ œ์–ด์˜ ํ•„์š”์„ฑ:** ์ปดํฌ๋„ŒํŠธ์— ํฌํ•จ๋œ ์• ๋‹ˆ๋ฉ”์ด์…˜์ด๋‚˜ ๋น„๋™๊ธฐ ์—์…‹, ํฐํŠธ ๋“ฑ์ด ์™„์ „ํžˆ ๋ Œ๋”๋ง๋˜๊ธฐ ์ „์— ์Šคํฌ๋ฆฐ์ƒท์ด ์บก์ฒ˜๋˜๋ฉด ๋งค๋ฒˆ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์™€ ์ผ๊ด€๋œ ํ…Œ์ŠคํŠธ๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•ด์ง„๋‹ค [10, 11]. ๋”ฐ๋ผ์„œ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ๋„๊ตฌ(Happo ๋“ฑ)๋Š” ์บก์ฒ˜ ์ „ ์• ๋‹ˆ๋ฉ”์ด์…˜์„ ์ž๋™์œผ๋กœ ์Œ์†Œ๊ฑฐ(silence) ์ฒ˜๋ฆฌํ•˜๊ฑฐ๋‚˜ ๋น„๋™๊ธฐ ์š”์†Œ์˜ ๋กœ๋”ฉ์„ ๊ฐ•์ œ๋กœ ๊ธฐ๋‹ค๋ ค์•ผ ํ•˜๋Š” ๊ธฐ์ˆ ์  ์ œ์•ฝ๊ณผ ์ถ”๊ฐ€ ์„ค์ •์ด ํ•„์š”ํ•˜๋‹ค [10, 11]. ## ๐Ÿ”— Knowledge Connections ### Related Concepts #### [ํ…Œ์ŠคํŠธ ๋ฐ ๊ฒ€์ฆ ๊ธฐ์ˆ ] - Snapshot Testing - ์—ฐ๊ฒฐ ์ด์œ : ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ์™€ ๋Œ€์กฐ๋˜๋Š” ํ…Œ์ŠคํŠธ ๋ฐฉ์‹์œผ๋กœ, ํ”ฝ์…€์ด ์•„๋‹Œ ๋ Œ๋”๋ง๋œ HTML ๋งˆํฌ์—… ์ฝ”๋“œ ๋ฉ์–ด๋ฆฌ๋ฅผ ๋น„๊ตํ•œ๋‹ค [2]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: HTML ๊ตฌ์กฐ ๋น„๊ต ๋ฐฉ์‹์ด ์™œ ๋นˆ๋ฒˆํ•˜๊ฒŒ ์˜คํƒ(False Positive)์„ ๋ฐœ์ƒ์‹œํ‚ค๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ํ”ฝ์…€ ๊ธฐ๋ฐ˜ ๋น„๊ต๊ฐ€ ์œ ์ง€๋ณด์ˆ˜์— ์™œ ๋” ์œ ๋ฆฌํ•œ์ง€ ๋ช…ํ™•ํ•˜๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค [2]. - Interaction Testing - ์—ฐ๊ฒฐ ์ด์œ : ์‚ฌ์šฉ์ž์˜ ์ƒํ˜ธ์ž‘์šฉ์ด๋‚˜ ์ด๋ฒคํŠธ๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ์˜ ํŠน์ • UI ์ƒํƒœ๋ฅผ ์œ ๋„ํ•˜๋Š” ํ…Œ์ŠคํŠธ ๋ฐฉ์‹์ด๋‹ค [5, 10]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ •์  UI ํ™”๋ฉด๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋กœ๋”ฉ, ์—๋Ÿฌ, ํด๋ฆญ ์‹œ ๋“œ๋กญ๋‹ค์šด ์˜คํ”ˆ ๋“ฑ ๋™์ ์œผ๋กœ ๋ณ€ํ™”ํ•˜๋Š” UI ์ƒํƒœ๋ฅผ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๊ฐ€ ์–ด๋–ป๊ฒŒ ์บก์ฒ˜ํ•˜๊ณ  ๊ฒ€์ฆํ•˜๋Š”์ง€ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค [9, 10]. #### [๊ตฌํ˜„ ๋ฐ ํ™œ์šฉ ๋„๊ตฌ] - [[Storybook|Storybook]] - ์—ฐ๊ฒฐ ์ด์œ : UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ณต์žกํ•œ ๋กœ์ง๊ณผ ๋ถ„๋ฆฌํ•˜์—ฌ ๊ฒฉ๋ฆฌ๋œ ํ™˜๊ฒฝ์—์„œ ์‹œ๊ฐ์ ์œผ๋กœ ๊ฐœ๋ฐœํ•˜๊ณ  ๋ฌธ์„œํ™”ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋„๊ตฌ์ด๋‹ค [3, 6]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๊ฐ€ ์ „์ฒด ํŽ˜์ด์ง€ ๋‹จ์œ„๊ฐ€ ์•„๋‹Œ ๊ฐœ๋ณ„ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ(Story) ๋‹จ์œ„๋กœ ๋ Œ๋”๋ง๋˜๊ณ  ๊ธฐ์ค€์„ ๊ณผ ๋น„๊ต๋˜๋Š” ์•„ํ‚คํ…์ฒ˜์  ๊ธฐ๋ฐ˜์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค [1]. - Chromatic / Happo - ์—ฐ๊ฒฐ ์ด์œ : Storybook๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์‹ค์ œ ๋ธŒ๋ผ์šฐ์ € ๊ธฐ๋ฐ˜์˜ ์Šคํฌ๋ฆฐ์ƒท ์บก์ฒ˜, ๋ฒ ์ด์Šค๋ผ์ธ ํ”ฝ์…€ ๋น„๊ต, CI/CD ์—ฐ๋™ ๋“ฑ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ํด๋ผ์šฐ๋“œ ์„œ๋น„์Šค(๋„๊ตฌ)์ด๋‹ค [1, 3, 4]. - ์ด ๊ฐœ๋…์„ ํ†ตํ•ด ๋” ๊นŠ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๋ถ„: ์ž๋™ํ™”๋œ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ๊ฐ€ ๋ธŒ๋ผ์šฐ์ € ๊ฐ„์˜ ๋ Œ๋”๋ง ์ฐจ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ํ’€ ๋ฆฌํ€˜์ŠคํŠธ(PR) ํ”„๋กœ์„ธ์Šค์™€ ์–ด๋–ป๊ฒŒ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค [4, 12]. ### Deeper Research Questions - Snapshot Testing์—์„œ Visual Regression Testing์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•  ๋•Œ, ๋Œ€๊ทœ๋ชจ ์ปดํฌ๋„ŒํŠธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํ™˜๊ฒฝ์—์„œ ์ดˆ๊ธฐ ๊ธฐ์ค€์„ (baseline) ๊ตฌ์ถ• ๋ฐ ์Šคํ† ๋ฆฌ์ง€ ์œ ์ง€๋ณด์ˆ˜ ๋น„์šฉ์€ ์–ด๋–ป๊ฒŒ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€? - Chromatic์ด๋‚˜ Happo์™€ ๊ฐ™์€ ๋„๊ตฌ๊ฐ€ ํฌ๋กœ์Šค ๋ธŒ๋ผ์šฐ์ €(Chrome, Safari, Firefox ๋“ฑ)์—์„œ ๋™์ผํ•œ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๋ Œ๋”๋งํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” OS/๋ธŒ๋ผ์šฐ์ € ์—”์ง„๋ณ„ ๋ฏธ์„ธํ•œ ๋ Œ๋”๋ง ์ฐจ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋ณด์ •ํ•˜๋Š”๊ฐ€? - ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ํŒŒ์ดํ”„๋ผ์ธ์„ CI/CD์— ํ†ตํ•ฉํ–ˆ์„ ๋•Œ ๋นŒ๋“œ ์‹œ๊ฐ„ ์ง€์—ฐ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•œ ๋ณ‘๋ ฌ ์ฒ˜๋ฆฌ(Parallelization) ๋ฐ ์ตœ์ ํ™” ์ „๋žต์€ ๋ฌด์—‡์ธ๊ฐ€? - ์• ๋‹ˆ๋ฉ”์ด์…˜ ๋ฐ ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ณต์žกํ•œ ์ธํ„ฐ๋ž™ํ‹ฐ๋ธŒ ์ปดํฌ๋„ŒํŠธ์—์„œ ํ…Œ์ŠคํŠธ์˜ ๋ถˆ์•ˆ์ •์„ฑ(Flakiness)์„ ์ฝ”๋“œ ๋ ˆ๋ฒจ์—์„œ ๊ทผ๋ณธ์ ์œผ๋กœ ์ œ๊ฑฐํ•˜๋ ค๋ฉด ์ปดํฌ๋„ŒํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ์„ค๊ณ„ํ•ด์•ผ ํ•˜๋Š”๊ฐ€? - Visual Regression Testing๊ณผ Accessibility Regression Testing์„ ํ•˜๋‚˜์˜ ์›Œํฌํ”Œ๋กœ์šฐ๋กœ ๊ฒฐํ•ฉํ–ˆ์„ ๋•Œ, ์ ‘๊ทผ์„ฑ ์œ„๋ฐ˜ ์‚ฌํ•ญ์ด ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ์‹œ๊ฐ์  ์ง€ํ‘œ์™€ ํ•จ๊ป˜ ๋ฆฌํฌํŠธ๋˜๋ฉฐ PR ๋ฆฌ๋ทฐ ํ”„๋กœ์„ธ์Šค๋Š” ์–ด๋–ป๊ฒŒ ํšจ์œจํ™”๋˜๋Š”๊ฐ€? ### Practical Application Contexts - **Implementation:** Storybook์œผ๋กœ UI ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ฐœ๋ฐœํ•œ ํ›„, Chromatic์ด๋‚˜ Happo ๋“ฑ์˜ ์• ๋“œ์˜จ์„ ์„ค์น˜ํ•˜์—ฌ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‹œ๋งˆ๋‹ค ๊ฐ ์ปดํฌ๋„ŒํŠธ์˜ ์ƒํƒœ๋ณ„ ์Šคํฌ๋ฆฐ์ƒท์„ ์ž๋™์œผ๋กœ ์บก์ฒ˜ํ•˜๊ณ  ๊ธฐ์ค€์„ ๊ณผ ๋น„๊ตํ•˜๋„๋ก ์„ค์ •ํ•œ๋‹ค [4, 14]. - **System Design:** ํ”„๋ก ํŠธ์—”๋“œ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„ ์‹œ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ UI๋ฅผ ์ฒ ์ €ํžˆ ๋ถ„๋ฆฌํ•˜์—ฌ ์ปดํฌ๋„ŒํŠธ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ , ์‹œ๊ฐ์  ๊ฒ€์ฆ ์‹œ์Šคํ…œ์„ ๋„์ž…ํ•˜์—ฌ ๋Œ€๊ทœ๋ชจ ํŒ€์ด ๋™์‹œ์— ๊ฐœ๋ฐœํ•˜๋”๋ผ๋„ ์ผ๊ด€๋œ ๋””์ž์ธ ์‹œ์Šคํ…œ์ด ํ›ผ์†๋˜์ง€ ์•Š๋„๋ก ๋ฐฉ์–ด ์ฒด๊ณ„๋ฅผ ๋งˆ๋ จํ•œ๋‹ค [3, 4]. - **Operation / Maintenance:** CI ํŒŒ์ดํ”„๋ผ์ธ(GitHub Actions ๋“ฑ)์— ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ๋ฅผ ํ•„์ˆ˜ ๋‹จ๊ณ„๋กœ ์ถ”๊ฐ€ํ•˜์—ฌ, ๋ณ€๊ฒฝ๋œ ๋””์ž์ธ ์ฝ”๋“œ๊ฐ€ PR์— ์˜ฌ๋ผ์˜ฌ ๋•Œ๋งˆ๋‹ค ์˜๋„์น˜ ์•Š์€ ๋ ˆ์ด์•„์›ƒ ๊นจ์ง ํ˜„์ƒ์„ ์ž๋™์œผ๋กœ ๊ฐ์ง€ํ•˜๊ณ  ๋ฆฌ๋ทฐ์–ด์—๊ฒŒ ์‹œ๊ฐ์  Diff๋ฅผ ์ œ๊ณตํ•˜์—ฌ ์šด์˜ ์œ ์ง€๋ณด์ˆ˜ ๋ถ€๋‹ด์„ ์ค„์ธ๋‹ค [3, 6, 12]. - **Learning Path:** React ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ UI ์ž‘์„ฑ โ†’ Storybook์„ ํ™œ์šฉํ•œ ์ปดํฌ๋„ŒํŠธ ๋ฌธ์„œํ™” ๋ฐ CDD(Component-Driven Development) โ†’ ์ธํ„ฐ๋ž™์…˜(Interaction) ํ…Œ์ŠคํŠธ ์ž‘์„ฑ โ†’ ์‹œ๊ฐ์  ํšŒ๊ท€ ํ…Œ์ŠคํŠธ ์ž๋™ํ™” ์ˆœ์œผ๋กœ ํ”„๋ก ํŠธ์—”๋“œ ํ’ˆ์งˆ ๊ฒ€์ฆ ํŒŒ์ดํ”„๋ผ์ธ์„ ํ•™์Šตํ•œ๋‹ค [9, 15]. - **My Project Relevance:** ํ”„๋ก ํŠธ์—”๋“œ ๋ ˆ๊ฑฐ์‹œ ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•˜๊ฑฐ๋‚˜ ์ˆ˜๋ฐฑ ๊ฐœ์˜ ํ™”๋ฉด์—์„œ ๊ณต์œ ๋˜๋Š” ์ฝ”์–ด UI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „์„ ์—…๊ทธ๋ ˆ์ด๋“œํ•  ๋•Œ, ๋‹ค๋ฅธ ํŒ€์˜ ์ปดํฌ๋„ŒํŠธ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ์˜๋„์น˜ ์•Š์€ ํŒŒ๊ธ‰ ํšจ๊ณผ(Side Effect) ๋ฐ ์‹œ๊ฐ์  ๊นจ์ง์„ ์•ˆ์ „ํ•˜๊ฒŒ ๊ฐ์ง€ํ•˜๊ณ  ํ™•์‹ ์„ ๊ฐ–๊ณ  ๋ฐฐํฌํ•˜๋Š” ๋ฐ ํ•ต์‹ฌ์ ์ธ ์—ญํ• ์„ ํ•œ๋‹ค [3, 16]. ### Adjacent Topics - Accessibility Regression Testing - ํ™•์žฅ ๋ฐฉํ–ฅ: ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ ์›Œํฌํ”Œ๋กœ์šฐ์™€ ๊ฒฐํ•ฉํ•˜์—ฌ, ์ƒˆ๋กœ์šด ํ…Œ์ŠคํŠธ ์ฝ”๋“œ๋ฅผ ๋ณ„๋„๋กœ ์ž‘์„ฑํ•  ํ•„์š” ์—†์ด ์Šคํฌ๋ฆฐ์ƒท ์‹คํ–‰ ๋‹จ๊ณ„์—์„œ UI์˜ ์ ‘๊ทผ์„ฑ ์œ„๋ฐ˜(๋ช…๋„ ๋Œ€๋น„ ๋ถ€์กฑ, ํ‚ค๋ณด๋“œ ํฌ์ปค์Šค ๋ˆ„๋ฝ ๋“ฑ)๊นŒ์ง€ ๋™์‹œ์— ์ž๋™ ๊ฒ€์ฆํ•˜๋Š” ์˜์—ญ์œผ๋กœ ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋‹ค [9, 10]. - Continuous Integration (CI) Pipelines - ํ™•์žฅ ๋ฐฉํ–ฅ: GitHub Actions, CircleCI ๋“ฑ์˜ CI ๋„๊ตฌ์—์„œ ์‹œ๊ฐ์  ํ…Œ์ŠคํŠธ ์ธํ”„๋ผ๊ฐ€ ์–ด๋–ป๊ฒŒ ์—ฐ๋™๋˜๋ฉฐ, ์ฝ”๋“œ๊ฐ€ ๋ณ‘ํ•ฉ๋˜๊ธฐ ์ „์— PR์˜ ์ƒํƒœ ์ฒดํฌ(Status Check)๋ฅผ ํ•„์ˆ˜๋กœ ์ œ์–ดํ•˜๋Š” ์ž๋™ํ™” ํŒŒ์ดํ”„๋ผ์ธ ๋ฐ DevOps ํ”„๋กœ์„ธ์Šค๋กœ ํ•™์Šต์„ ๋„“ํž ์ˆ˜ ์žˆ๋‹ค [12]. --- *Last updated: 2026-04-30*