ML/MLOps Engineer
MLOps 01: Data testing, why, what and how

์›๋ฌธ: https://medium.com/@ongxuanhong/mlops-01-data-testing-why-what-and-how-59cd8005637c
ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์„ ๊ผญ ํ•ด์•ผ ํ•˜๋Š”์ง€, ๋ฐ์ดํ„ฐ์—์„œ ๋ฌด์—‡์„ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•˜๋Š”์ง€, ํšจ๊ณผ์ ์ธ ํ…Œ์ŠคํŠธ ๋ฐฉ๋ฒ•๋ก ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๋Š” ๊ธ€์„ ์ฝ๊ณ  ๋‚ด์šฉ์„ ์ •๋ฆฌํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์™œ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ• ๊นŒ?

์ƒˆ๋กœ์šด ํŒ€์› ์˜จ๋ณด๋”ฉ

ํ”„๋กœ์ ํŠธ์— ์ƒˆ๋กœ์šด ํŒ€์›์ด ํ•ฉ๋ฅ˜ํ•˜์˜€์„ ๋•Œ ์ ์ ˆํ•œ ํ…Œ์ŠคํŠธ๊ฐ€ ์—†๋‹ค๋ฉด, ์ฝ”๋“œ๋ฅผ ํ•œ ์ค„์”ฉ ๋””๋ฒ„๊น… ํ•˜๋ฉฐ ๋ณ€์ˆ˜์˜ ์ƒํƒœ์™€ ๊ธฐ๋Šฅ, ๊ฐ’์ด ์–ด๋–ป๊ฒŒ ํ• ๋‹น๋˜๋Š”์ง€ ํŒŒ์•…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๊ฐ€ ์กด์žฌํ•œ๋‹ค๋ฉด ์•„๋ž˜์˜ ๊ตฌ์กฐ์ ์ธ ๋‹จ๊ณ„๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์—ˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  • PREPARE: ๋ฐ์ดํ„ฐ ์ดํ•ด
  • ACTION: ์ฝ”๋“œ ์‹คํ–‰ ๊ณผ์ • ํŒŒ์•…
  • ASSERT: ์‹คํ–‰ ํ›„ ๊ธฐ๋Œ€ ๊ฒฐ๊ณผ ํ™•์ธ
    ์ ์ ˆํ•œ ๋‹จ์œ„ํ…Œ์ŠคํŠธ๊ฐ€ ์žˆ๋‹ค๋ฉด ์ƒˆ๋กœ์šด ํŒ€์›์€ ํ”„๋กœ์ ํŠธ ๋ฌธ์„œ๋ฅผ 2~3์ฃผ๊ฐ„ ํŒŒ๊ณ ๋“ค ํ•„์š” ์—†์ด ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์‚ดํŽด๋ณด๋Š” ๊ฒƒ ๋งŒ์œผ๋กœ๋„ ๋ช‡ ์ผ ์•ˆ์— ํ”„๋กœ์ ํŠธ์— ์ต์ˆ™ํ•ด์งˆ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.์ฝ”๋“œ ๋ฆฌํŒฉํ„ฐ๋ง์ฝ”๋“œ ๋ฆฌํŒฉํ„ฐ๋ง ํ›„์—๋Š” QA ์ „๋ฌธ๊ฐ€๋“ค์ด ์‹œ์Šคํ…œ์˜ ๊ธฐ๋Šฅ์„ ๊ฒ€์ฆํ•˜๋Š” ๊ฒƒ์ด ์ผ๋ฐ˜์ ์ธ ๊ด€ํ–‰. ์ž๋™ํ™”๋œ ํ…Œ์ŠคํŠธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ํ†ตํ•ด ์žก์„ ์ˆ˜ ์žˆ์—ˆ๋˜ ๋ฒ„๊ทธ๋ฅผ ๋งค๋ฒˆ QA ํŒ€์ด ๋ฐ˜๋ณต์ ์œผ๋กœ ์ ๊ฒ€ํ•ด์•ผ ํ•  ํ•„์š”๊ฐ€ ์—†์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ ์ดˆ๊ธฐ์— ํ…Œ์ŠคํŠธ๋ฅผ ์ ๊ทน์ ์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ์‹์€ ์ž์‹ ์˜ ์‹œ๊ฐ„๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํŒ€๊ณผ ์ „์ฒด ํ”„๋กœ์ ํŠธ์—๋„ ํฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ณ ํ’ˆ์งˆ ์ฝ”๋“œ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๊ธฐ์ˆ  ๋ถ€์ฑ„๊ฐ€ ๊ณ„์† ์Œ“์ด๋ฉด, ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ค์›Œ์ง€๊ณ , ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋  ๋•Œ๋งˆ๋‹ค ๊ธฐ์กด ์‹œ์Šคํ…œ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์ปค์ง‘๋‹ˆ๋‹ค.
    Pull Request ๋ฆฌ๋ทฐ ์‹œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ๋ฌด์‹œํ•˜๋ฉด ๊ธฐ์ˆ  ๋ถ€์ฑ„์˜ ์•…์ˆœํ™˜์ด ์ƒ๊ฒจ๋‚˜๋ฉฐ, ํŒ€์ด ํ˜์‹ ์„ ์ถ”๊ตฌํ•˜๊ณ  ๊ฑด๊ฐ•ํ•œ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์ด ์ €ํ•˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ์„ ํฌํ•จํ•œ ๋ฐ์ดํ„ฐ ์ œํ’ˆ ์‹œ์Šคํ…œ์„ ๊ฐœ๋ฐœํ•  ๋•Œ ์šฐ๋ฆฌ๋Š” ํ•„์—ฐ์ ์œผ๋กœ MLOps, ์ฆ‰ ๋จธ์‹ ๋Ÿฌ๋‹ ์šด์˜์˜ ์˜์—ญ๊ณผ ๋งž๋‹ฅ๋œจ๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. MLOps๋Š” ๋ณธ์งˆ์ ์œผ๋กœ DataOps, ModelOps, DevOps๊ฐ€ ์œตํ•ฉ๋œ ๊ฐœ๋…์œผ๋กœ, DevOps๋Š” CI/CD(์ง€์†์  ํ†ตํ•ฉ/์ง€์†์  ๋ฐฐํฌ) ํ”„๋กœ์„ธ์Šค์˜ ์›ํ™œํ•˜๊ณ  ์ง€์†์ ์ธ ์‹คํ–‰์„ ์ง€์›ํ•˜๋Š” ์ค‘์š”ํ•œ ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ์ด ํ™•์žฅ๋จ์— ๋”ฐ๋ผ ์ƒˆ๋กญ๊ฒŒ ์ถ”๊ฐ€๋œ ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด CI๊ฐ€ ์ •๊ธฐ์ ์œผ๋กœ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๋ฐœ์ „์‹œํ‚ค๊ณ  ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ž์‹ ๊ฐ์„ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.์–ด๋–ป๊ฒŒ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ• ๊นŒ?์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ๊ณผ์ •์—์„œ ์ž์ฃผ ์ ์šฉ๋˜๋Š” ํ…Œ์ŠคํŠธ ์ž‘์„ฑ ๋ฐฉ๋ฒ•์€ FIRST ์›์น™์ด๋ฉฐ, ์ด๋Š” ๋น ๋ฅด๊ณ (Fast), ๋…๋ฆฝ์ ์ด๋ฉฐ(Independent), ๋ฐ˜๋ณต ๊ฐ€๋Šฅํ•˜๊ณ (Repeatable), ์ž์ฒด ๊ฒ€์ฆ(Self-Validating)๋˜๋ฉฐ ์‹œ์˜์ ์ ˆํ•œ(Timely) ํ…Œ์ŠคํŠธ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • ๋น ๋ฅด๊ฒŒ(Fast): ํ…Œ์ŠคํŠธ๊ฐ€ ๋น ๋ฅผ์ˆ˜๋ก ๋” ๋งŽ์€ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ๊ฐ„์ด ์ƒ๊น๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๊ฐ€ ๋Š๋ฆฌ๊ฒŒ ์‹คํ–‰๋˜๋ฉด ํŒ€์€ ์ž์ฃผ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ฒŒ ๋˜๊ณ , ์ด๋กœ ์ธํ•ด ๋ฌธ์ œ๋ฅผ ์กฐ๊ธฐ์— ๋ฐœ๊ฒฌํ•ด ์‰ฝ๊ฒŒ ์ˆ˜์ •ํ•  ๊ธฐํšŒ๋ฅผ ๋†“์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋…๋ฆฝ์ (Independent): ํ…Œ์ŠคํŠธ๋Š” ์„œ๋กœ ์˜์กดํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋Š” ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ๋…๋ฆฝ์ ์œผ๋กœ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ์„œ๋กœ ์˜์กดํ•˜๋ฉด, ์ฒ˜์Œ ์‹คํŒจํ•œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์—๋„ ์˜ค๋ฅ˜๋ฅผ ์œ ๋ฐœํ•ด ๋ฌธ์ œ ์ง„๋‹จ์ด ์–ด๋ ค์›Œ์ง‘๋‹ˆ๋‹ค.
  • ๋ฐ˜๋ณต ๊ฐ€๋Šฅ(Repeatable): ํ…Œ์ŠคํŠธ๋Š” ๋ชจ๋“  ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋กœ์ปฌ ํ™˜๊ฒฝ์—์„œ ์„ฑ๊ณต์ ์œผ๋กœ ์‹คํ–‰๋œ ํ…Œ์ŠคํŠธ๋Š” QA๋‚˜ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ๋„ ๋™์ผํ•˜๊ฒŒ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์ž์ฒด ๊ฒ€์ฆ(Self-Validating): ํ…Œ์ŠคํŠธ๋Š” ์ผ๊ด€๋œ ์„ฑ๊ณต ๋˜๋Š” ์‹คํŒจ ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋Š˜ ์‹คํ–‰ํ•˜๋ฉด ์„ฑ๊ณตํ•˜๊ณ  ๋‚ด์ผ์€ ์‹คํŒจํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ์—†์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ์‹œ์˜์ ์ ˆ(Timely): ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋Š” ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์ด ๊ตฌํ˜„๋˜๋Š” ์‹œ์ ์— ์ž‘์„ฑ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

TDD(Test Driven Development, ํ…Œ์ŠคํŠธ ์ฃผ๋„ ๊ฐœ๋ฐœ)

ํ…Œ์ŠคํŠธ๋ฅผ ๋จผ์ € ์ž‘์„ฑํ•˜๊ณ  ์ดํ›„์— ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•œ ํ›„, ํ…Œ์ŠคํŠธ๊ฐ€ ์‹คํŒจํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ดํ›„ ํ…Œ์ŠคํŠธ๊ฐ€ ์„ฑ๊ณตํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฝ”๋“œ๋ฅผ ๋ฆฌํŒฉํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค. ํ…Œ์ŠคํŠธ๊ฐ€ ์—ฌ์ „ํžˆ ์„ฑ๊ณตํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋ฉด์„œ ์ฝ”๋“œ๋ฅผ ์ตœ์ ํ™”ํ•˜๊ณ , ๋‹ค๋ฅธ ๊ธฐ๋Šฅ๋„ ์ด๋Ÿฌํ•œ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€(code coverage)


๋‹จ์ˆœํžˆ ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€๋ฅผ 99-100%๋กœ ์˜ฌ๋ฆฌ๊ธฐ ์œ„ํ•ด ๋ถˆํ•„์š”ํ•œ ํ…Œ์ŠคํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค๋Š”, ํ•„์š”ํ•œ ๋งŒํผ๋งŒ ์ถฉ๋ถ„ํžˆ ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ์–ผ๋งˆ๋‚˜ ํ…Œ์ŠคํŠธ๋˜๊ณ  ์žˆ๋Š”์ง€ ์ถ”์ ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•˜๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ํŒ€์€ ํ”„๋กœ์ ํŠธ ๋‚ด์—์„œ ์•„์ง ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๊ฐ€ ์ž‘์„ฑ๋˜์ง€ ์•Š์€ ์˜์—ญ์„ ํ‰๊ฐ€ํ•˜๊ณ  ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๋‹จ์ˆœํžˆ ์ปค๋ฒ„๋ฆฌ์ง€ ์ง€์ˆ˜๋ฅผ ์˜ฌ๋ฆฌ๊ธฐ ์œ„ํ•ด ๊ฒ€์ฆ(assertion)์„ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๊ณ  ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ํ•จ์ •์— ๋น ์ง€๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๋ชฉ(mock)์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ๋‹จ์ˆœํžˆ ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ์ง€์ˆ˜๋ฅผ ์˜ฌ๋ฆด ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฐ ๋ฐฉ์‹์€ ๊ฒฐ๊ณผ๋ฅผ ํ‰๊ฐ€ํ•˜๊ฑฐ๋‚˜ ๊ฒ€์ฆํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์ฝ”๋“œ ์‹คํ–‰์—๋งŒ ์‹œ๊ฐ„์„ ์†Œ๋น„ํ•˜๊ฒŒ ๋  ๋ฟ, ์‹ค์ œ ํ…Œ์ŠคํŠธ๋Š” ์ „ํ˜€ ์ด๋ฃจ์–ด์ง€์ง€ ์•Š๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋ฌด์—‡์„ ํ…Œ์ŠคํŠธํ•ด์•ผ ํ• ๊นŒ?

๊ธฐ๋Šฅ ํ…Œ์ŠคํŠธ

์ด ํ…Œ์ŠคํŠธ ๋‹จ๊ณ„๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ๊ณผ์ •๊ณผ ์œ ์‚ฌํ•˜๋ฉฐ ๋ฐ์ดํ„ฐ ํ…Œ์ŠคํŠธ์—์„œ๋„ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ, ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ๋„ค ๋‹จ๊ณ„๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค:

  1. Arrange (์ค€๋น„): ์ฝ”๋“œ์™€ ์ƒ˜ํ”Œ ๋ฐ์ดํ„ฐ๋ฅผ ์„ค์ •
  2. Act (์‹คํ–‰): ํ…Œ์ŠคํŠธํ•  ํ•จ์ˆ˜๋ฅผ ์‹คํ–‰
  3. Assert (๊ฒ€์ฆ): ๋ฐ˜ํ™˜๋œ ๊ฒฐ๊ณผ์— ๋Œ€ํ•ด ๋…ผ๋ฆฌ์  ๊ฒ€์ฆ ์ˆ˜ํ–‰
  4. Cleanup (์ •๋ฆฌ): ํ…Œ์ŠคํŠธ์— ์‚ฌ์šฉ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ํ•ด์ œ

Python์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ…Œ์ŠคํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • pytest: ํ”„๋กœ์ ํŠธ์˜ ๋ชจ๋“  ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. (https://docs.pytest.org/)
  • unittest: ํ…Œ์ŠคํŠธ์˜ ๋ฐ˜ํ™˜ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜๋Š” assertion ํ•จ์ˆ˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. (https://docs.python.org/3/library/unittest.html)
  • coverage: ํ”„๋กœ์ ํŠธ์˜ ์ฝ”๋“œ ์ปค๋ฒ„๋ฆฌ์ง€ ์ง€์ˆ˜๋ฅผ ์ธก์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. (https://coverage.readthedocs.io/)

๋น„๋ก ์‹œ์Šคํ…œ์˜ ๊ธฐ๋Šฅ์€ ์•„๋‹ˆ์ง€๋งŒ, ์ฝ”๋“œ ํฌ๋งท ๋ฐ ๊ตฌ์กฐ๋ฅผ ์ ๊ฒ€ํ•˜๋Š” Lint ํ…Œ์ŠคํŠธ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. black์„ ์‚ฌ์šฉํ•ด ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ํฌ๋งทํ•  ์ˆ˜ ์žˆ๊ณ  (https://github.com/psf/black), flake8์„ ํ†ตํ•ด ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ import, ์„ ์–ธ๋˜์ง€ ์•Š์€ ๋ณ€์ˆ˜๋ช… ์‚ฌ์šฉ, ํ•จ์ˆ˜ ๊ธธ์ด๊ฐ€ ํ—ˆ์šฉ๋œ ์—ด ์ˆ˜๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๊ฒฝ์šฐ์™€ ๊ฐ™์€ ์ฝ”๋“œ ๋ฌธ์ œ๋ฅผ ๊ฒฝ๊ณ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (https://flake8.pycqa.org/en/latest/)
์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ํ…Œ์ŠคํŠธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๊ธฐ๋ฒ•

  • fixture: Arrange ๋‹จ๊ณ„์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ, ๋ณดํ†ต ์„ค์ •, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ปจํ…์ŠคํŠธ ์‹œ์ž‘, Spark์„ ์‚ฌ์šฉํ•œ ๊ณ„์‚ฐ ํ…Œ์ŠคํŠธ ์‹œ SparkSession ๋“ฑ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. (https://docs.pytest.org/en/6.2.x/fixture.html)
  • conftest.py: ์—ฌ๋Ÿฌ fixture๋ฅผ ๋ชจ์•„ ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฝ๊ฒŒ ํ•˜๋ฉฐ, ๋‹ค๋ฅธ ํ…Œ์ŠคํŠธ ๋ชจ๋“ˆ์—์„œ ์ ‘๊ทผํ•˜์—ฌ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • parametrize: fixture์™€ ์œ ์‚ฌํ•˜๊ฒŒ ํ•จ์ˆ˜์˜ ์ธ์ž๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ์„ค์ •์„ ์ค€๋น„ํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค๋‹ˆ๋‹ค. (https://docs.pytest.org/en/6.2.x/parametrize.html)
  • mock: ํ•จ์ˆ˜์˜ ๋™์ž‘์ด๋‚˜ ๋ณ€์ˆ˜ ๊ฐ’์„ ๋ฎ์–ด์“ฐ๋ฉฐ, ํ†ตํ•ฉ ํ…Œ์ŠคํŠธ์—์„œ ์›ํ•˜๋Š” ๋ฐ˜ํ™˜ ๋™์ž‘์„ ๋ชจํ‚นํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. (https://docs.python.org/3/library/unittest.mock.html)

๋ฐ์ดํ„ฐ ํ…Œ์ŠคํŠธ

์ฝ”๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ต์ง€๋งŒ, ๋ฐ์ดํ„ฐ ํ…Œ์ŠคํŠธ๋Š” ๊ทธ ์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅํ•œ ํŠน์„ฑ ๋•Œ๋ฌธ์— ๋” ํฐ ๋„์ „์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋Š” ๋ณ€๊ฒฝ์ด ์žฆ์•„ ๋‹ค์–‘ํ•œ ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ(์ƒˆ๋กœ์šด ์ปฌ๋Ÿผ ์ถ”๊ฐ€, ๊ธฐ์กด ์ปฌ๋Ÿผ ์ด๋ฆ„ ๋ณ€๊ฒฝ, ์ปฌ๋Ÿผ ์‚ญ์ œ ๋“ฑ), ๋ฐ์ดํ„ฐ ํƒ€์ž… ์ˆ˜์ •, ํŠน์ • ๋‚ ์งœ์˜ ๊ฑฐ๋ž˜ ๋ˆ„๋ฝ, ๋ฐ์ดํ„ฐ ์†์ƒ ๋ฐ ์žก์Œ ๋“ฑ์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ๋Š” ์—ฌ๋Ÿฌ ๋‹จ๊ณ„์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•ด ๋ฐ์ดํ„ฐ์˜ ๋ฌด๊ฒฐ์„ฑ๊ณผ ์‹ ๋ขฐ์„ฑ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค.

  1. ์›์‹œ ๋ฐ์ดํ„ฐ ํ…Œ์ŠคํŠธ
  2. ์ค‘๊ฐ„ ๋ฐ ํ•ต์‹ฌ ๋ฐ์ดํ„ฐ ๋ชจ๋ธ ํ…Œ์ŠคํŠธ
  3. ํ…Œ์ด๋ธ” ๋ ˆ๋ฒจ์—์„œ์˜ ํ…Œ์ŠคํŠธ:
    • ํ–‰๊ณผ ์—ด์˜ ์ˆ˜, ๋ฐ˜ํ™˜๋˜๋Š” ์ปฌ๋Ÿผ ์ˆœ์„œ๊ฐ€ ์˜ˆ์ƒ๊ณผ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    • ์Šคํ‚ค๋งˆ๊ฐ€ ๊ธฐ๋Œ€์™€ ์ผ์น˜ํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฐ์ดํ„ฐ์˜ ์‹ ์„ ๋„(Freshness).
  4. ์ปฌ๋Ÿผ ๋ ˆ๋ฒจ์—์„œ์˜ ํ…Œ์ŠคํŠธ:
    • ๊ธฐ๋ณธ ํ‚ค์˜ ๊ณ ์œ ์„ฑ: ์ค‘๋ณต๋œ ํ–‰์ด๋‚˜ ํ‚ค ๊ฐ’์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    • NULL ๊ฐ’์˜ ์กด์žฌ ์—ฌ๋ถ€.
    • ํ—ˆ์šฉ๋œ ๊ฐ’: ๊ฐ’์ด ์˜ˆ์ธก๋œ ๋ฒ”์œ„ ๋‚ด์— ์žˆ๋Š”์ง€, ์ฐธ์กฐ ํ‚ค๊ฐ€ ์ƒ์œ„ ํ…Œ์ด๋ธ”์˜ ๊ธฐ๋ณธ ํ‚ค์— ์กด์žฌํ•˜๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
    • ์ œ์•ฝ ์กฐ๊ฑด: ๊ฐ ์ฒ˜๋ฆฌ ํ•จ์ˆ˜์— ํŠนํ™”๋œ ๋…ผ๋ฆฌ๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜์—ฌ ํ•„ํ„ฐ๋ง๋œ ๊ฐ’ ๋ชฉ๋ก์ด ๋ฐ˜ํ™˜ ๊ฒฐ๊ณผ์— ํฌํ•จ๋˜์ง€ ์•Š๋„๋ก ํ•˜๊ฑฐ๋‚˜, ๊ฐ€๊ฒฉ ํ•„๋“œ๋Š” ์‚ฌ์ „ ์ •์˜๋œ ํ•˜ํ•œ/์ƒํ•œ ๋ฒ”์œ„ ๋‚ด์— ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ์ดํ„ฐ์˜ ACID ํŠน์„ฑ์„ ๋ณด์žฅํ•˜๊ณ  ๋ช‡ ๊ฐ€์ง€ ์ œ์•ฝ ์กฐ๊ฑด์„ ์„ค์ •ํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ์ถฉ๋ถ„ํ•œ๋ฐ, ์™œ ์ด๋Ÿฐ ์ผ์ด ์ด์ „์— ์ด๋ฃจ์–ด์ง€์ง€ ์•Š์€ ์ด์œ ๋Š” ๋น…๋ฐ์ดํ„ฐ์ด๊ธฐ ๋•Œ๋ฌธ. ๋น…๋ฐ์ดํ„ฐ ์‹œ์Šคํ…œ์˜ ๋ชฉํ‘œ๋Š” ๋น ๋ฅธ ์ €์žฅ๊ณผ ๋น ๋ฅธ ์—ฐ์‚ฐ. Apache Hudi, Apache Iceberg, Delta Lake์™€ ๊ฐ™์€ ๋น…๋ฐ์ดํ„ฐ์šฉ RDBMS ์œ ์‚ฌ ์‹œ์Šคํ…œ๋“ค์ด ์žˆ์–ด ๋น…๋ฐ์ดํ„ฐ์˜ ์ €์žฅ ๋ฐ ์—ฐ์‚ฐ ์„ฑ๋Šฅ์„ ๋ณด์žฅํ•˜๋ฉด์„œ๋„ ๋ฐ์ดํ„ฐ์˜ ACID ์†์„ฑ์„ ๊ด€๋ฆฌ ๊ฐ€๋Šฅ. ๋˜ํ•œ ์šด์˜ ์ค‘์—๋Š” ๋ฐ์ดํ„ฐ ๊ณ„์•ฝ(Data Contract), ์Šคํ‚ค๋งˆ ์šด์˜(Schema Ops)๊ณผ ๊ฐ™์€ ์šฉ์–ด๋ฅผ ์‚ฌ์šฉํ•ด ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋ณ€ํ™”๋ฅผ ๊ด€๋ฆฌํ•˜์—ฌ ํ•˜์œ„ ๋ฐ์ดํ„ฐ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์ตœ์†Œํ™”.
๋Œ€๋ถ€๋ถ„์˜ DataOps ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ฐ์ดํ„ฐ ํ…Œ์ŠคํŠธ ๋„๊ตฌ๋ฅผ ๋‚ด์žฅ

  • Dagster: ๋ฐ์ดํ„ฐ ํŒŒ์ดํ”„๋ผ์ธ์— ๋ฏผ์ฒฉํ•œ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์—ฌ Airflow๋ฅผ ๋Šฅ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค (https://docs.dagster.io/concepts/testing).
  • DBT ํ…Œ์ŠคํŠธ: ๋ฐ์ดํ„ฐ ๋ถ„์„์„ ๋”์šฑ ์ •ํ™•ํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค (https://docs.getdbt.com/docs/build/tests).
  • great_expectations: ๋ฐ์ดํ„ฐ ํ”„๋กœํŒŒ์ผ๋ง๊ณผ ๋ฐ์ดํ„ฐ ๊ฒ€์ฆ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์ž…๋ ฅ ๋ฐ์ดํ„ฐ ํ’ˆ์งˆ์„ ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค (https://docs.greatexpectations.io/docs/).

๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋ธ ํ…Œ์ŠคํŠธ

๋ชจ๋ธ์€ ๋ฐ์ดํ„ฐ์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ๋กœ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ๋ชจ๋ธ ํ›ˆ๋ จ ๊ณผ์ •์—์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ํ›ˆ๋ จ ์„ธํŠธ, ๊ฒ€์ฆ ์„ธํŠธ, ํ…Œ์ŠคํŠธ ์„ธํŠธ๋กœ ๋‚˜๋ˆ„์–ด, ๋ชจ๋ธ์˜ ์ผ๋ฐ˜ํ™” ๋Šฅ๋ ฅ์„ ํ–ฅ์ƒ์‹œ์ผœ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‹ค์ œ ํ™˜๊ฒฝ์—์„œ๋„ ์ •ํ™•๋„๋ฅผ ์œ ์ง€ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‹œ๊ฐ„์ด ์ง€๋‚˜๋ฉด์„œ ์‹ค์ œ ๋ฐ์ดํ„ฐ๋Š” ๋ณ€ํ™”ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด์— ๋”ฐ๋ผ ๋‘ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค: ๋ฐ์ดํ„ฐ ๋ถ„ํฌ $(P(X))$๊ฐ€ ๋ณ€ํ•˜๋Š” ๋ฐ์ดํ„ฐ ๋“œ๋ฆฌํ”„ํŠธ์™€ ์กฐ๊ฑด๋ถ€ ๋ถ„ํฌ $(P(Y|X))$๊ฐ€ ๋ณ€ํ•˜๋Š” ์ปจ์…‰ ๋“œ๋ฆฌํ”„ํŠธ์ž…๋‹ˆ๋‹ค.
๋ชจ๋ธ ์žฌํ›ˆ๋ จ์˜ ํ•„์š”์„ฑ์„ ํŒ๋‹จํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ง€์†์ ์œผ๋กœ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ์ง€ํ‘œ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ†ต๊ณ„์  ํ…Œ์ŠคํŠธ ์ง€ํ‘œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ๋ถ„ํฌ์˜ ์ถ”์„ธ๋ฅผ ์ง€์†์ ์œผ๋กœ ๊ด€์ฐฐํ•˜๊ณ  ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค. ์ถ”์  ์ง€ํ‘œ๊ฐ€ ํŠน์ • ์ž„๊ณ„๊ฐ’ ์ดํ•˜๋กœ ๋–จ์–ด์ง€๋ฉด MLOps ํŒ€์ด ์ž๋™์œผ๋กœ ๋ฐ์ดํ„ฐ ์ˆ˜์ง‘, ๋ชจ๋ธ ์žฌํ›ˆ๋ จ, ์„ฑ๋Šฅ ํ‰๊ฐ€, ๋ชจ๋ธ ๋“ฑ๋ก ๋ฐ ํ”„๋กœ๋•์…˜ ๋ฐฐํฌ์™€ ๊ฐ™์€ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์€ ์ด ๋ชฉ์ ์— ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ํ†ต๊ณ„์  ํ…Œ์ŠคํŠธ ์ง€ํ‘œ์ž…๋‹ˆ๋‹ค:

์ด ๋ชจ๋‹ˆํ„ฐ๋ง ์‹œ์Šคํ…œ์„ ์ฒ˜์Œ๋ถ€ํ„ฐ ์ˆ˜๋™์œผ๋กœ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋˜๋Š” Evidently AI์™€ ๊ฐ™์€ ์˜คํ”ˆ ์†Œ์Šค ๋จธ์‹ ๋Ÿฌ๋‹ ๋ชจ๋‹ˆํ„ฐ๋ง ๋„๊ตฌ๋ฅผ ์ฐธ๊ณ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋„๊ตฌ๋Š” ํ…Œ์ŠคํŠธ ์ง€ํ‘œ๋ฅผ ์ž๋™์œผ๋กœ ๊ณ„์‚ฐํ•˜๊ณ , ๋ฆฌํฌํŠธ๋ฅผ ์‹œ๊ฐํ™”ํ•˜๋ฉฐ, Airflow, MLFlow, Metaflow, Grafana์™€ ๊ฐ™์€ ML ํŒŒ์ดํ”„๋ผ์ธ ํ”„๋กœ๊ทธ๋žจ๊ณผ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฐ๋ก 

๊ธฐ์ˆ  ๋ถ€์ฑ„๋Š” ์–ด๋””์—์„œ ๋น„๋กฏ๋ ๊นŒ์š”?
๊ธฐ์ˆ  ๋ถ€์ฑ„๋Š” ์ฃผ๋กœ ์ž„๋ฐ•ํ•œ ๊ธฐํ•œ ์••๋ฐ•์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ํŒ€์€ ์ฝ”๋“œ ๋””์ž์ธ์˜ ๊ธฐ๋ณธ ์›์น™์„ ๋ฌด์‹œํ•˜๊ณ  ํ•„์ˆ˜์ ์ธ ํ…Œ์ŠคํŠธ๋ฅผ ์ƒ๋žตํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธ‰ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๊ฒฐ๊ตญ ์ฝ”๋“œ ๊ฐ€๋…์„ฑ์„ ๋ฐฉํ•ดํ•˜๊ณ  ๊ตฌ์„ฑ ์š”์†Œ ๊ฐ„์˜ ์ƒํ˜ธ ์˜์กด์„ฑ์„ ์•…ํ™”์‹œ์ผœ ํ–ฅํ›„ ์ˆ˜์ • ๋ฐ ์—…๊ทธ๋ ˆ์ด๋“œ๋ฅผ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋˜ํ•œ, ๋น„์ฆˆ๋‹ˆ์Šค ์š”๊ตฌ ์‚ฌํ•ญ์˜ ๋นˆ๋ฒˆํ•œ ๋ณ€ํ™”๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์™„์ „ํžˆ ์žฌ์ž‘์—…ํ•ด์•ผ ํ•  ํ•„์š”์„ฑ์„ ์ดˆ๋ž˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋•Œ ์šฐ๋ฆฌ๋Š” ์ถœ์‹œ ์ผ์ • ์ค€์ˆ˜๋ฅผ ์šฐ์„ ์‹œํ• ์ง€, ์•„๋‹ˆ๋ฉด ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์ฝ”๋“œ ํ’ˆ์งˆ์„ ๊ฒ€ํ† ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์‹œ๊ฐ„์„ ํˆฌ์žํ• ์ง€ ๊ณ ๋ฏผํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๊ธฐ์ˆ  ๋ถ€์ฑ„๋Š” ๊ณ„์† ์Œ“์—ฌ๊ฐ‘๋‹ˆ๋‹ค.
์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ ๋‹จ์œ„ ํ…Œ์ŠคํŠธ(unit testing)๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์—์„œ ์˜ค๋žซ๋™์•ˆ ์‚ฌ์šฉ๋˜์–ด ์˜จ ๊ฒ€์ฆ๋œ ๊ธฐ๋ฒ•์ด๋ฉฐ, ์ด ๊ธ€์—์„œ ์„ค๋ช…ํ•œ ์žฅ์  ๋•๋ถ„์— ๋ฐ์ดํ„ฐ ์ œํ’ˆ ๊ฐœ๋ฐœ ์˜์—ญ์œผ๋กœ๋„ ํ™•์‚ฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐœ๋… ์ฆ๋ช…(PoC) ๋ชจ๋ธ์„ ํ”„๋กœ๋•์…˜์— ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์€ ๋‹จ์ˆœํžˆ ํ•™๊ต ํ”„๋กœ์ ํŠธ์—์„œ ์ž‘์—…ํ•œ ์ž„์‹œ ์ฝ”๋“œ๋‚˜ ์—ฐ๊ตฌ ๋…ผ๋ฌธ์„ ์™„๋ฃŒํ–ˆ์„ ๋•Œ์™€๋Š” ๋‹ฌ๋ฆฌ, ๋งค์šฐ ์–ด๋ ค์šด ์ผ์ž…๋‹ˆ๋‹ค. ๋ชจ๋ธ์„ ์„ฑ๊ณต์ ์œผ๋กœ ๋ฐฐํฌํ•˜๋Š” ๊ฒƒ์ด ์‹œ์ž‘์ผ ๋ฟ, ๊ทธ ์ดํ›„๋„ ๋˜‘๊ฐ™์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ”๋กœ ๋ชจ๋ธ ์„ฑ๋Šฅ์„ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜๋Š” ์ผ์ž…๋‹ˆ๋‹ค. ๋ชจ๋ธ ์žฌํ›ˆ๋ จ ์—ฌ๋ถ€๋Š” ๋ฐ์ดํ„ฐ ๋“œ๋ฆฌํ”„ํŠธ(Data Drift)์™€ ์ปจ์…‰ ๋“œ๋ฆฌํ”„ํŠธ(Concept Drift) ๊ด€๋ จ ์ง€ํ‘œ์— ๋”ฐ๋ผ ๊ฒฐ์ •๋ฉ๋‹ˆ๋‹ค.
๋‹คํ–‰ํžˆ๋„ ์˜ค๋Š˜๋‚  ๋ฐ์ดํ„ฐ ์ปค๋ฎค๋‹ˆํ‹ฐ์—์„œ ํ…Œ์ŠคํŠธ ์ž‘์„ฑ์˜ ์ค‘์š”์„ฑ์— ๋Œ€ํ•œ ๊ด€์‹ฌ์ด ์ปค์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐ๊ณผ, ๋ฐ์ดํ„ฐ ์ „๋ฌธ๊ฐ€๋“ค์„ ์œ„ํ•œ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ์„ ์ „๋ฌธ์œผ๋กœ ํ•˜๋Š” ์—ฌ๋Ÿฌ ํŒ€๋“ค์ด ๋“ฑ์žฅํ•˜์—ฌ Dagster, DBT, great_expectations์™€ ๊ฐ™์€ ์œ ์šฉํ•œ ๋„๊ตฌ๋“ค์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋„๊ตฌ๋“ค์€ ํ”„๋กœ์ ํŠธ์— ๋‹จ์œ„ ํ…Œ์ŠคํŠธ๋ฅผ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค.