์ฝ”๋“œ ์Šค๋ฉœ: ๋ฌด์—‡์ด๋ฉฐ ๊ธฐ์ˆ  ๋ถ€์ฑ„์™€ ์–ด๋–ค ๊ด€๋ จ์ด ์žˆ์„๊นŒ์š”?

์ฝ”๋“œ ์Šค๋ฉœ: ๋ฌด์—‡์ด๋ฉฐ ๊ธฐ์ˆ  ๋ถ€์ฑ„์™€ ์–ด๋–ค ๊ด€๋ จ์ด ์žˆ์„๊นŒ์š”?

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

์ด ์šฉ์–ด๋Š” ๋งˆํ‹ด ํŒŒ์šธ๋Ÿฌ์™€ ์ผ„ํŠธ ๋ฒก์ด ํŒŒ์šธ๋Ÿฌ์˜ ์ €์„œ ใ€Ž๋ฆฌํŒฉํ† ๋ง: ๊ธฐ์กด ์ฝ”๋“œ ์„ค๊ณ„ ๊ฐœ์„ (Refactoring: Improving the Design of Existing Code )ใ€(1999)์—์„œ ๋„๋ฆฌ ์•Œ๋ ค์กŒ์œผ๋ฉฐ, ์ด ์ฑ…์—์„œ๋Š” 22๊ฐ€์ง€ ์ฝ”๋“œ ์Šค๋ฉœ์„ ๋ถ„๋ฅ˜ํ•˜๊ณ  ๊ฐ๊ฐ์— ํ•ด๋‹นํ•˜๋Š” ๋ฆฌํŒฉํ† ๋ง ๊ธฐ๋ฒ•์„ ์ œ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ชฉ๋ก์€ ํ˜„์žฌ๊นŒ์ง€๋„ ํ‘œ์ค€ ์ฐธ๊ณ  ์ž๋ฃŒ๋กœ ์ž๋ฆฌ ์žก๊ณ  ์žˆ์œผ๋ฉฐ, ํŒŒ์šธ๋Ÿฌ๊ฐ€ ๋ช…๋ช…ํ•œ ์ฝ”๋“œ ์Šค๋ฉœ(์˜ˆ: ๊ธด ๋ฉ”์„œ๋“œ, ๊ฐ“ ํด๋ž˜์Šค, ์ค‘๋ณต ์ฝ”๋“œ, ๊ธฐ๋Šฅ ์„ ์ž…๊ฒฌ, ๋ฐœ์‚ฐ์  ๋ณ€๊ฒฝ, ๋ฌด๋ถ„๋ณ„ํ•œ ์ฝ”๋“œ ์ˆ˜์ •)์€ ์˜ค๋Š˜๋‚  SonarQube ๊ทœ์น™ ์„ธํŠธ, ์ •์  ๋ถ„์„ ๋„๊ตฌ, ๊ทธ๋ฆฌ๊ณ  ์—…๊ณ„ ์ „๋ฐ˜์˜ ์ฝ”๋“œ ๊ฒ€ํ†  ์ฒดํฌ๋ฆฌ์ŠคํŠธ์— ๋“ฑ์žฅํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ ๋ƒ„์ƒˆ ์ •๋ฆฌ

SMART TS XL ๋ณต์žกํ•œ ์‹œ์Šคํ…œ ์ „๋ฐ˜์—์„œ ์ด๋ฅผ ๋งคํ•‘ํ•˜๊ณ  ์ˆ˜์ •ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค.

๋” ๋งŽ์€ ์ •๋ณด

์ฐจ๋ก€

์ฝ”๋“œ ์Šค๋ฉœ์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ์š”?

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

์ฝ”๋“œ ์Šค๋ฉœ์€ ๊ตฌ๋ฌธ ์˜ค๋ฅ˜๋‚˜ ์–ด์„ค์…˜ ์‹คํŒจ์™€ ๊ฐ™์€ ์˜๋ฏธ์˜ ์œ„๋ฐ˜ ์‚ฌํ•ญ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ˆ™๋ จ๋œ ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ๋‹น์žฅ ๋ˆˆ์— ๋„๋Š” ์˜ค๋ฅ˜๊ฐ€ ์—†๋”๋ผ๋„ ์ฝ”๋“œ ์Šค๋ฉœ์„ ๊ฒฝ๊ณ  ์‹ ํ˜ธ๋กœ ์ธ์‹ํ•ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์ด๋Ÿฌํ•œ ์ฝ”๋“œ ์Šค๋ฉœ์ด ๋ˆ„์ ๋œ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. 10,000๋งŒ ์ค„์งœ๋ฆฌ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ๊ธด ๋ฉ”์„œ๋“œ ํ•˜๋‚˜๋Š” ์‚ฌ์†Œํ•œ ๋ถˆํŽธํ•จ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ˆ˜๋ฐฑ ๊ฐœ์˜ ๊ธด ๋ฉ”์„œ๋“œ, ์ˆ˜์‹ญ ๊ฐœ์˜ ๋ชจ๋“ˆ์— ํฉ์–ด์ ธ ์žˆ๋Š” ์ค‘๋ณต๋œ ๋กœ์ง, ๊ทธ๋ฆฌ๊ณ  ์˜์กด์„ฑ ๊ทธ๋ž˜ํ”„์˜ ์ค‘์‹ฌ์— ์ž๋ฆฌ ์žก์€ '๊ฐ“ ํด๋ž˜์Šค(God Class)'๋Š” ์•ˆ์ „ํ•˜๊ฒŒ ๋ณ€๊ฒฝํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์–ด๋ ค์šด ์‹œ์Šคํ…œ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์ฝ”๋“œ ์Šค๋ฉœ vs. ๋ฒ„๊ทธ vs. ๊ธฐ์ˆ  ๋ถ€์ฑ„

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

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

์ฝ”๋“œ ์Šค๋ฉœ์€ ๊ธฐ์ˆ  ๋ถ€์ฑ„๊ฐ€ ์ถ•์ ๋˜๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค. ์ฝ”๋“œ๋ฒ ์ด์Šค์— ์ถ”๊ฐ€๋˜๋Š” ๊ฐ ๊ธด ๋ฉ”์„œ๋“œ๋Š” ๊ธฐ์ˆ  ๋ถ€์ฑ„์˜ ๋‹จ์œ„๊ฐ€ ๋˜๋ฉฐ, ๊ทธ ์ด์ž ๋น„์šฉ์€ ๋ฏธ๋ž˜์˜ ๋ชจ๋“  ๊ฐœ๋ฐœ์ž๊ฐ€ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋ฅผ ์ดํ•ดํ•˜๋Š” ๋ฐ ์ถ”๊ฐ€๋กœ ์†Œ์š”ํ•˜๋Š” ์‹œ๊ฐ„๊ณผ, ํ–ฅํ›„ ๋ชจ๋“  ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ํ•ด๋‹น ๋ฉ”์„œ๋“œ์˜ ๊ทœ๋ชจ๋กœ ์ธํ•œ ๋ถ€์ž‘์šฉ์„ ํ”ผํ•˜๋Š” ๋ฐ ์†Œ์š”ํ•˜๋Š” ์‹œ๊ฐ„์ž…๋‹ˆ๋‹ค.

SonarQube์—์„œ ์ฝ”๋“œ ์Šค๋ฉœ์ด๋ž€ ๋ฌด์—‡์ธ๊ฐ€์š”?

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

๋งˆํ‹ด ํŒŒ์šธ๋Ÿฌ์˜ ์ฝ”๋“œ ์Šค๋ฉœ: ๊ณ ์ „์  ๋ถ„๋ฅ˜ ์ฒด๊ณ„

ํŒŒ์šธ๋Ÿฌ๊ฐ€ ๋ฒ”์ฃผ๋ณ„๋กœ ์ •๋ฆฌํ•œ 22๊ฐ€์ง€ ์ฝ”๋“œ ์Šค๋ฉœ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹ํ‘œ์ค€ ์ฐธ๊ณ  ์ž๋ฃŒ๋กœ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ฃผ์š” ์ •์  ๋ถ„์„ ๋„๊ตฌ์˜ ๊ทœ์น™ ์„ธํŠธ๋Š” ์ด ๋ถ„๋ฅ˜ ์ฒด๊ณ„์—์„œ ํŒŒ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

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

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

๊ฐ€์žฅ ํ”ํ•œ ์ฝ”๋“œ ์Šค๋ฉœ: ๋น ๋ฅธ ์ฐธ์กฐ

์ฝ”๋“œ ์Šค๋ฉœ์–ด๋–ป๊ฒŒ ์ƒ๊ฒผ๋Š”์ง€์ฃผ์š” ์œ„ํ—˜
์ค‘๋ณต ์ฝ”๋“œ๋™์ผํ•œ ๋…ผ๋ฆฌ๊ฐ€ ์—ฌ๋Ÿฌ ๊ณณ์—์„œ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.๋ฒ„๊ทธ ์ˆ˜์ •์€ ๋ชจ๋“  ๊ณณ์— ์ ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‹œ๊ฐ„์ด ์ง€๋‚จ์— ๋”ฐ๋ผ ๋ณต์‚ฌ๋ณธ๋“ค์ด ์„œ๋กœ ๋‹ฌ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
๊ธด ๋ฐฉ๋ฒ•์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ฑ…์ž„์„ ํฌํ•จํ•˜๋Š” 20~30์ค„ ์ด์ƒ์˜ ๋ฉ”์„œ๋“œ์ธ์ง€ ๋ถ€ํ•˜๊ฐ€ โ€‹โ€‹๋†’์•„ ๊ฐœ๋ณ„ ํ–‰๋™์„ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.
๊ฐ“ ํด๋ž˜์Šค / ๋Œ€๊ทœ๋ชจ ํด๋ž˜์Šค๋ชจ๋“  ๊ฒƒ์„ ๋‹ค ํ•˜๋Š” ํ•œ ์ˆ˜์—…๋ชจ๋“  ๊ธฐ๋Šฅ ๋ณ€๊ฒฝ์€ ๋™์ผํ•œ ํด๋ž˜์Šค์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฏ€๋กœ ๋ณ‘ํ•ฉ ์ถฉ๋Œ ๋ฐ ์ทจ์•ฝ์„ฑ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.
๊ธด ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ชฉ๋ก๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ 4๊ฐœ ์ด์ƒ์ธ ๋ฉ”์„œ๋“œ์ž˜๋ชป๋œ ๊ฐ’์„ ์ „๋‹ฌํ•˜๊ธฐ ์‰ฝ๊ณ , ํ˜ธ์ถœ ์ง€์ ์„ ์ฝ๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.
ํ”ผ์ฒ˜ ์—”๋น„๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ž์‹ ์˜ ๋ฐ์ดํ„ฐ๋ณด๋‹ค ๋” ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”์„œ๋“œ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’์•„์„œ ํ•œ ํด๋ž˜์Šค์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค.
๋ฐœ์‚ฐ์  ๋ณ€ํ™”์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ด์œ ๋กœ ์ˆ˜์ •๋œ ํด๋ž˜์Šค๊ฐœ์ธ ์ฑ…์ž„ ์›์น™ ์œ„๋ฐ˜; ์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ถ€์ž‘์šฉ
์‚ฐํƒ„์ด ์ˆ˜์ˆ ํ•˜๋‚˜์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์œผ๋กœ ์ธํ•ด ์—ฌ๋Ÿฌ ํด๋ž˜์Šค์— ๊ฑธ์ณ ์ˆ˜์ •์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.๋ณ€๊ฒฝ ๋น„์šฉ์ด ๋†’๊ณ , ๋ฐœ์ƒ ์‚ฌ๋ก€๋ฅผ ๋†“์น˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.
๋ฐ๋“œ ์ฝ”๋“œํ˜ธ์ถœ๋˜๊ฑฐ๋‚˜ ๋„๋‹ฌ๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๊ฐœ๋ฐœ์ž๋“ค์„ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ฒŒ ํ•˜๊ณ , ์ˆ˜๋…„์— ๊ฑธ์ณ ๋ˆ„์ ๋˜๋ฉฐ, ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
์›์‹œ์  ์ง‘์ฐฉ๋„๋ฉ”์ธ ๊ฐ์ฒด ๋Œ€์‹  ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ์œ ํ˜•(๋ฌธ์ž์—ด, ์ •์ˆ˜) ์‚ฌ์šฉ๊ฒ€์ฆ ์ž๋ฃŒ๊ฐ€ ์—ฌ๊ธฐ์ €๊ธฐ ํฉ์–ด์ ธ ์žˆ๊ณ , ํ‘œํ˜„๋ ฅ์ด ๋ถ€์กฑํ•ฉ๋‹ˆ๋‹ค.
๋ฐ์ดํ„ฐ ๋ฉ์–ด๋ฆฌ๋™์ผํ•œ ํ•„๋“œ ๊ทธ๋ฃน์ด ๋ฐ˜๋ณต์ ์œผ๋กœ ํ•จ๊ป˜ ์ „๋‹ฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.๋„๋ฉ”์ธ ๊ฐ์ฒด์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ถ”์ƒํ™”๊ฐ€ ๋ˆ„๋ฝ๋˜์—ˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.
์ถ”์ธก์  ์ผ๋ฐ˜ํ™”๋ฏธ๋ž˜์˜ ํ•„์š”๋ฅผ ์ƒ์ƒํ•˜์—ฌ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ถˆํ•„์š”ํ•œ ๋ณต์žก์„ฑ์ผ ๋ฟ, ์™œ ํ•„์š”ํ•œ์ง€ ์•„๋ฌด๋„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ๋‹ค.
์ผ๊ด€๋˜์ง€ ์•Š์€ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ์กฐ์šฉํ•œ ์บ์น˜, ๋‹ค์–‘ํ•œ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ ์ „๋žต์˜ค๋ฅ˜๊ฐ€ ๊ฐ์ง€๋˜์ง€ ์•Š๊ณ , ๋””๋ฒ„๊น…์— ํ›จ์”ฌ ๋” ๋งŽ์€ ์‹œ๊ฐ„์ด ์†Œ์š”๋ฉ๋‹ˆ๋‹ค.

์ฝ”๋“œ ์Šค๋ฉœ ์ •์˜ ๋ฐ ์˜ˆ์‹œ

์ค‘๋ณต ์ฝ”๋“œ

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

์ž๋ฐ”

// ServiceA -- discount calculation
double calculateDiscount(double amount) {
    if (amount > 1000) return amount * 0.1;
    return 0;
}

// ServiceB -- same logic, copied and forgotten
double computeDiscount(double value) {
    if (value > 1000) return value * 0.1;
    return 0;
}

๋น„์ฆˆ๋‹ˆ์Šค ๊ทœ์น™์ด ๋ณ€๊ฒฝ๋  ๋•Œ(์ž„๊ณ„๊ฐ’์ด 1500์œผ๋กœ, ๋น„์œจ์ด 12%๋กœ ๋ณ€๊ฒฝ๋  ๋•Œ), ํ•œ ๋ชจ๋“ˆ์€ ์—…๋ฐ์ดํŠธ๋˜์ง€๋งŒ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์€ ์—…๋ฐ์ดํŠธ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋‘ ๋ชจ๋“ˆ์ด ๊ธฐ๋ณธ์ ์ธ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์—์„œ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ’์„ ๊ฐ–๊ฒŒ ๋˜๊ณ , ์ด๋Ÿฌํ•œ ๋ถˆ์ผ์น˜๋Š” ํ…Œ์ŠคํŠธ ๋‹จ๊ณ„๊ฐ€ ์•„๋‹Œ ์šด์˜ ํ™˜๊ฒฝ ๊ฐ์‚ฌ ์ค‘์— ๋“œ๋Ÿฌ๋‚ฉ๋‹ˆ๋‹ค.

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• : ๊ณตํ†ต ๋กœ์ง์„ ํ˜ธ์ถœํ•˜๋Š” ๋‘ ๊ณณ ๋ชจ๋‘ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋Š” ๋‹จ์ผ ํ•จ์ˆ˜, ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค ๋˜๋Š” ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.

๊ธด ๋ฐฉ๋ฒ•

์‹œ๊ฐ„์ด ํ๋ฅด๋ฉด์„œ ๋ณธ๋ž˜์˜ ๋ชฉ์ ์„ ๋„˜์–ด ์ถ”๊ฐ€์ ์ธ ์ฑ…์ž„์„ ๋– ๋งก๊ฒŒ ๋œ ๋ฐฉ๋ฒ•๋ก . 200์ค„์งœ๋ฆฌ ๋ฐฉ๋ฒ•๋ก ์„ ์ฝ๋Š” ์ธ์ง€ ๋ถ€ํ•˜๋Š” 10์ค„์งœ๋ฆฌ ๋ฐฉ๋ฒ•๋ก  20๊ฐœ๋ฅผ ์ฝ๋Š” ๊ฒƒ๊ณผ ์–‘์ ์œผ๋กœ๋งŒ ๋‹ค๋ฅธ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์งˆ์ ์œผ๋กœ๋„ ๋‹ค๋ฅด๋‹ค. ๊ธด ๋ฐฉ๋ฒ•๋ก ์€ ๋„ˆ๋ฌด ๋งŽ์€ ๊ธฐ๋Šฅ์„ ๊ฐœ๋ณ„์ ์œผ๋กœ ๊ฒ€์ฆํ•˜๊ธฐ ์–ด๋ ต๊ธฐ ๋•Œ๋ฌธ์— ๊ฒ€์ฆํ•˜๊ธฐ ์–ด๋ ต๊ณ , ์ฝ๋Š” ์‚ฌ๋žŒ์ด ์ „์ฒด ์‹คํ–‰ ๋งฅ๋ฝ์„ ์ž‘์—… ๊ธฐ์–ต์— ์œ ์ง€ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ์ดํ•ดํ•˜๊ธฐ๋„ ์–ด๋ ต๋‹ค.

ํƒ์ง€ ์ž„๊ณ„๊ฐ’ : 20~30์ค„ ์ด์ƒ์˜ ๋ฉ”์„œ๋“œ๋Š” ๊ฒ€ํ† ๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ, 50์ค„ ์ด์ƒ์ผ ๊ฒฝ์šฐ ๊ฑฐ์˜ ํ•ญ์ƒ ๋ฆฌํŒฉํ† ๋ง์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. COBOL์—์„œ๋Š” 100๊ฐœ ์ด์ƒ์˜ ๋ฌธ์žฅ์œผ๋กœ ๊ตฌ์„ฑ๋œ ๋‹จ๋ฝ์ด ์ด์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค.

ํŒŒ์ด์ฌ

class OrderProcessor:
    def process_order(self, order):
        # Validate order -- 40 lines
        # Calculate discounts -- 30 lines
        # Update inventory -- 25 lines
        # Send notification emails -- 20 lines
        # Generate invoice -- 35 lines
        # 150+ lines total
        pass

์ด ๋ฉ”์„œ๋“œ ๋‚ด์˜ ๊ฐ ์ฑ…์ž„์€ ๋ณ„๋„์˜ ํด๋ž˜์Šค ๋˜๋Š” ํ•จ์ˆ˜๋กœ ๋ถ„๋ฆฌ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•˜๋‚˜๋กœ ๋ฌถ์œผ๋ฉด ํ–ฅํ›„ ์†ก์žฅ ๋ฐœํ–‰, ์žฌ๊ณ  ๊ด€๋ฆฌ ๋˜๋Š” ์•Œ๋ฆผ ๊ธฐ๋Šฅ ์—…๋ฐ์ดํŠธ ์‹œ ์ „์ฒด ์ฃผ๋ฌธ ์ฒ˜๋ฆฌ ํ๋ฆ„์ด ๋ถˆ์•ˆ์ •ํ•ด์งˆ ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ“ ํด๋ž˜์Šค

์—ฌ๋Ÿฌ ์˜์—ญ์— ๊ฑธ์ณ ์ฑ…์ž„์„ ๋ถ„์‚ฐ์‹œ์ผœ ๋‹จ์ผ ์ฑ…์ž„ ์›์น™์„ ์‹ฌ๊ฐํ•˜๊ฒŒ ์œ„๋ฐ˜ํ•˜๋Š” ํด๋ž˜์Šค๋Š” ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ์ค‘์‹ฌ์ด ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ์ด ํด๋ž˜์Šค์— ์˜์กดํ•˜๋ฉฐ, ์ด ํด๋ž˜์Šค์˜ ์–ด๋–ค ๋ถ€๋ถ„์„ ๋ณ€๊ฒฝํ•˜๋”๋ผ๋„ ๊ทธ ํด๋ž˜์Šค์— ๋Œ€ํ•œ ๋ชจ๋“  ๊ฒƒ์„ ์ดํ•ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํƒ์ง€ ์‹ ํ˜ธ : 20~30๊ฐœ ์ด์ƒ์˜ ๊ณต๊ฐœ ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง„ ํด๋ž˜์Šค์ด๊ฑฐ๋‚˜, ์ด๋ฆ„์— "Manager", "Processor", "Handler", "Utils" ๋˜๋Š” "Helper"๋ผ๋Š” ๋‹จ์–ด๊ฐ€ ์—ฌ๋Ÿฌ ๊ด€๋ จ ์—†๋Š” ๋„๋ฉ”์ธ์— ์ ์šฉ๋œ ํด๋ž˜์Šค.

๋ฐœ์‚ฐ์  ๋ณ€ํ™”

์ด ํด๋ž˜์Šค๋Š” ์„œ๋กœ ๊ด€๋ จ ์—†๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ด์œ ๋กœ ์ˆ˜์ •๋ฉ๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์Šคํ‚ค๋งˆ๊ฐ€ ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค, ๊ฐ€๊ฒฉ ์ฑ…์ • ๊ทœ์น™์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค, ์•Œ๋ฆผ ํ˜•์‹์ด ๋ณ€๊ฒฝ๋  ๋•Œ๋งˆ๋‹ค ์ด ํด๋ž˜์Šค๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ํด๋ž˜์Šค๋Š” ๋„ˆ๋ฌด ๋งŽ์€ ์ฑ…์ž„์„ ์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ ๋ถ„๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ •์˜ : ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์ด์œ ๋กœ ๋Š์ž„์—†์ด ๋ณ€ํ™”ํ•˜๋Š” ํด๋ž˜์Šค. ์ƒท๊ฑด ์ˆ˜์ˆ ์˜ ๋ฐ˜๋Œ€ ๊ฐœ๋….

์‚ฐํƒ„์ด ์ˆ˜์ˆ 

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

SQL

-- Tax logic duplicated across queries
SELECT amount * 0.05 FROM invoices;
SELECT amount * 0.05 FROM payments;
SELECT amount * 0.05 FROM reports;

0.05๋ฅผ 0.07๋กœ ๋ณ€๊ฒฝํ•˜๋ ค๋ฉด ์ด์ œ SQL ํŒŒ์ผ, ์ €์žฅ ํ”„๋กœ์‹œ์ € ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ ์ „์ฒด์—์„œ ํ•ด๋‹น ๊ฐ’์„ ๋ชจ๋‘ ์ฐพ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ”ผ์ฒ˜ ์—”๋น„

๋ฉ”์„œ๋“œ ์‹คํ–‰ ์‹œ๊ฐ„์ด ์ž์‹ ์˜ ํด๋ž˜์Šค๋ณด๋‹ค ๋‹ค๋ฅธ ํด๋ž˜์Šค์˜ ๋ฐ์ดํ„ฐ์™€ ๋ฉ”์„œ๋“œ๋ฅผ ๋” ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ํ•ด๋‹น ๋™์ž‘์€ ๋‹ค๋ฅธ ํด๋ž˜์Šค์— ์†ํ•ด์•ผ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค.

์ž๋ฐ”

// In ReportGenerator -- envious of Customer's data
double calculateCustomerRating(Customer customer) {
    return customer.getOrderCount() * customer.getAverageOrderValue()
           / customer.getDaysSinceRegistration();
}
// This logic belongs in Customer, not ReportGenerator

๋ฐ๋“œ ์ฝ”๋“œ

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

Detection System์ •์  ๋ถ„์„ ๋„๊ตฌ์—๋Š” SonarQube, Knip(TypeScript/JavaScript์šฉ) ๋“ฑ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. SMART TS XL ์ฝ”๋“œ๋ฒ ์ด์Šค ์ „์ฒด์—์„œ ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ํ•จ์ˆ˜, ํ˜ธ์ถœ๋˜์ง€ ์•Š์€ ๋ฉ”์„œ๋“œ ๋ฐ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๋ณ€์ˆ˜๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค.

DRY ์›์น™ ์œ„๋ฐ˜

DRY(Don't Repeat Yourself) ์›์น™์€ ์‹œ์Šคํ…œ ๋‚ด ๋ชจ๋“  ์ •๋ณด๋Š” ๋ช…ํ™•ํ•˜๊ณ  ๋ชจํ˜ธํ•˜์ง€ ์•Š์€ ๋‹จ์ผํ•œ ํ‘œํ˜„์œผ๋กœ ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. DRY ์›์น™ ์œ„๋ฐ˜์€ ์ค‘๋ณต ์ฝ”๋“œ, ๋ฐ์ดํ„ฐ ๋ฉ์–ด๋ฆฌ, ๊ทธ๋ฆฌ๊ณ  ๋ฌด๋ถ„๋ณ„ํ•œ ์ฝ”๋“œ ์ˆ˜์ •(Shotgun Surgery)๊ณผ ๊ฐ™์€ ๋ฌธ์ œ์˜ ๊ทผ๋ณธ ์›์ธ์ž…๋‹ˆ๋‹ค. ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์—ฌ๋Ÿฌ ๊ณณ์— ํ‘œํ˜„๋˜๋ฉด ํ•„์—ฐ์ ์œผ๋กœ ํ‘œํ˜„ ๋ฐฉ์‹์ด ์„œ๋กœ ๋‹ฌ๋ผ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. DRY๋Š” ์›์น™์ด๊ณ , ์ค‘๋ณต ์ฝ”๋“œ๋Š” DRY ์›์น™ ์œ„๋ฐ˜์„ ๋‚˜ํƒ€๋‚ด๋Š” '๋ƒ„์ƒˆ'์ž…๋‹ˆ๋‹ค.

ํŒŒ์ด์ฌ

# DRY violation: same validation logic in three places
def validate_email_in_registration(email):
    return "@" in email and "." in email

def validate_email_in_profile_update(email):
    return "@" in email and "." in email

def validate_email_in_checkout(email):
    return "@" in email and "." in email

# DRY-compliant: one function, three callers
def is_valid_email(email):
    return "@" in email and "." in email

์ฝ”๋“œ ์Šค๋ฉœ ํƒ์ง€ ์ž„๊ณ„๊ฐ’: ์ฝ”๋“œ๊ฐ€ ์–ธ์ œ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š”๊ฐ€?

์ฝ”๋“œ ์Šค๋ฉœ ๊ฐ์ง€์—๋Š” ์ธก์ • ๊ฐ€๋Šฅํ•œ ์ž„๊ณ„๊ฐ’์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์ธก์ • ์ง€ํ‘œ์™€ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•œ ์ฝ”๋“œ ์Šค๋ฉœ์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ’์ž…๋‹ˆ๋‹ค.

๋ฉ”ํŠธ๋ฆญ๋ฌด์—‡์„ ์ธก์ •ํ•˜๋Š”๊ฐ€๊ฒฝ๊ณ  ์ž„๊ณ„๊ฐ’์ค‘์š” ์ž„๊ณ„๊ฐ’
์ˆœํ™˜์  ๋ณต์žก์„ฑ๋ฉ”์„œ๋“œ์˜ ๊ฒฐ์ • ๋ถ„๊ธฐ ์ˆ˜10 ์œ„20 ์œ„
๋ฉ”์„œ๋“œ ๊ธธ์ด(์ค„ ์ˆ˜)๋ฉ”์„œ๋“œ/ํ•จ์ˆ˜์˜ ์ค„ ์ˆ˜20 ์œ„50 ์œ„
๋งค๊ฐœ๋ณ€์ˆ˜ ์ˆ˜๋ฉ”์„œ๋“œ๊ฐ€ ํ—ˆ์šฉํ•˜๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜์˜ ๊ฐœ์ˆ˜4 ์œ„7 ์œ„
์ˆ˜์—… ๊ธธ์ดํด๋ž˜์Šค์˜ ์ค„ ์ˆ˜200 ์œ„500 ์œ„
์ค‘๋ณต๋ฅ ์ค‘๋ณต๋œ ์ฝ”๋“œ์˜ ๋น„์œจ3 % ์ด์ƒ10 % ์ด์ƒ
์ธ์ง€์  ๋ณต์žก์„ฑ์ฝ”๋“œ๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์–ผ๋งˆ๋‚˜ ์–ด๋ ค์šด๊ฐ€15 ์œ„25 ์œ„
๊ตฌ์‹ฌ์„ฑ ์—ฐ๊ฒฐ(Ca)์ด ํด๋ž˜์Šค์— ์˜์กดํ•˜๋Š” ํด๋ž˜์Šค์˜ ์ˆ˜15 ์œ„30 ์œ„
์›์‹ฌ ๊ฒฐํ•ฉ(Ce)์ด ์ˆ˜์—…์ด ์˜์กดํ•˜๋Š” ์ˆ˜์—…์˜ ์ˆ˜15 ์œ„30 ์œ„

์ด๋Ÿฌํ•œ ์ž„๊ณ„๊ฐ’์€ SonarQube์—์„œ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋Œ€๋ถ€๋ถ„์˜ ์ •์  ๋ถ„์„ ํ”Œ๋žซํผ์€ ์ด๋Ÿฌํ•œ ์ง€ํ‘œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์‚ฌ์šฉ์ž ์ง€์ • ๊ทœ์น™์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ž„๊ณ„๊ฐ’์ด ๋†’์€ ํด๋ž˜์Šค์™€ ๋ฉ”์„œ๋“œ๋Š” ์ตœ์šฐ์„  ์ˆœ์œ„ ๋ฆฌํŒฉํ† ๋ง ๋Œ€์ƒ์ž…๋‹ˆ๋‹ค. ์ด๋“ค์€ ํ–ฅํ›„ ๊ฒฐํ•จ ๋ฐœ์ƒ ๊ฐ€๋Šฅ์„ฑ์ด ๊ฐ€์žฅ ๋†’๊ณ  ์œ ์ง€ ๊ด€๋ฆฌ ๋น„์šฉ์ด ๊ฐ€์žฅ ๋งŽ์ด ๋“œ๋Š” ๊ตฌ์„ฑ ์š”์†Œ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ฝ”๋“œ ์Šค๋ฉœ ํƒ์ง€ ๋„๊ตฌ

์ž๋™ํ™”๋œ ํƒ์ง€๋Š” ๋Œ€๊ทœ๋ชจ ์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์ฝ”๋“œ ์Šค๋ฉœ์„ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ์žˆ์–ด ์œ ์ผํ•˜๊ฒŒ ํ™•์žฅ ๊ฐ€๋Šฅํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ˆ˜๋™ ๊ฒ€ํ† ๋Š” ์ž๋™ํ™” ๋„๊ตฌ๊ฐ€ ์ฐพ์•„๋‚ด๋Š” ๊ฒƒ์˜ ๊ทนํžˆ ์ผ๋ถ€๋งŒ์„ ์žก์•„๋‚ผ ๋ฟ์ด๋ฉฐ, ์ˆ˜๋ฐฑ๋งŒ ์ค„์— ๋‹ฌํ•˜๋Š” ๋ ˆ๊ฑฐ์‹œ ์‹œ์Šคํ…œ์—๋Š” ์ ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ˆ˜๋‹จ๊ธฐ๋ณธ ์–ธ์–ด๋ฌด์—‡์„ ๊ฐ์ง€ํ•˜๋Š”๊ฐ€
์†Œ๋‚˜ํ๋ธŒ / ์†Œ๋‚˜ํด๋ผ์šฐ๋“œ์ž๋ฐ”, ํŒŒ์ด์ฌ, ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ/ํ…์ŠคํŠธ ํŽธ์ง‘, C# ๋“ฑํ’€ ํŒŒ์šธ๋Ÿฌ ๋ƒ„์ƒˆ ๋ถ„๋ฅ˜ ์ฒด๊ณ„, ๋ณด์•ˆ ์ทจ์•ฝ์ , ์ค‘๋ณต
์ฒดํฌ์Šคํƒ€์ผ + PMD์ž๋ฐ”์Šคํƒ€์ผ ์œ„๋ฐ˜, ์ค‘๋ณต, ๋ณต์žก์„ฑ ์ง€ํ‘œ
ESLint + typescript-eslint์ž๋ฐ” ์Šคํฌ๋ฆฝํŠธ, TypeScript๊ธด ํ•จ์ˆ˜, ๋ณต์žกํ•œ ์ฝ”๋“œ, ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ
ํŒŒ์ผ๋ฆฐํŠธ + ๋ผ๋ˆPython๋ณต์žก์„ฑ, ์Šคํƒ€์ผ, ์œ ์ง€๋ณด์ˆ˜์„ฑ ์ง€์ˆ˜
๋ฆฌ์ƒคํผ / ๋ผ์ด๋”C#์ค‘๋ณต ์ฝ”๋“œ, ๊ธด ๋ฉ”์„œ๋“œ, ๊ฒฐํ•ฉ ๋ฌธ์ œ
ํด๋ฆฌ ํ”ผ๋…นRust์—์„œ ํ”ํžˆ ๋‚˜ํƒ€๋‚˜๋Š” ๊ด€์šฉ์  ๊ทœ์น™ ์œ„๋ฐ˜, ์ฆ‰ ์ฝ”๋“œ ์Šค๋ฉœ(code smell)๋กœ ๊ฐ„์ฃผ๋˜๋Š” ์ผ๋ฐ˜์ ์ธ ํŒจํ„ด
์ฝ”๋“œ๊ธฐํ›„๋‹ค๊ตญ์–ด๋ณต์žก์„ฑ, ์ค‘๋ณต, ์œ ์ง€๋ณด์ˆ˜์„ฑ ์ ์ˆ˜
SMART TS XLCOBOL, JCL, Java, Python, RPG, SQL, .NET์–ธ์–ด ๊ฐ„ ์ฝ”๋“œ ์ค‘๋ณต, ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ, ๊ฒฐํ•ฉ๋„, ์˜์กด์„ฑ ๋ณ€ํ™”

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

์ฝ”๋“œ ์Šค๋ฉœ๊ณผ ๊ธฐ์ˆ  ๋ถ€์ฑ„: ์—ฐ๊ด€์„ฑ

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

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

์ฝ”๋“œ ์Šค๋ฉœ(code smell)์„ ์˜ˆ๋กœ ๋“ค์–ด ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค . ์ฝ”๋“œ๋ฒ ์ด์Šค์— 40%์˜ ์ค‘๋ณต์ด ์žˆ๋‹ค๋ฉด, ๋ฒ„๊ทธ ์ˆ˜์ • ๋น„์šฉ์€ ํ•„์š” ์ด์ƒ์œผ๋กœ 1.4๋ฐฐ ์ฆ๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ์˜์กดํ•˜๋Š” ํ•ต์‹ฌ ์ฒ˜๋ฆฌ ํด๋ž˜์Šค๊ฐ€ '๊ฐ“ ํด๋ž˜์Šค(God Class)'๋ผ๋ฉด, ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๋•Œ๋งˆ๋‹ค ํ•ด๋‹น ํด๋ž˜์Šค ์ „์ฒด๋ฅผ ์ดํ•ดํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๊ฐ€ ์ผ๊ด€์„ฑ์ด ์—†๋‹ค๋ฉด, ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“  ์žฅ์• ์— ๋Œ€ํ•ด ๋” ๋งŽ์€ ์กฐ์‚ฌ ์‹œ๊ฐ„์ด ์†Œ์š”๋ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜ ์‹ ํ˜ธ๊ฐ€ ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ธฐ์ˆ  ๋ถ€์ฑ„๋Š” ์ถ”์ƒ์ ์ธ ๊ฐœ๋…์ด ์•„๋‹ˆ๋ผ, ์ด๋Ÿฌํ•œ ๋น„ํšจ์œจ์„ฑ์ด ๋ˆ„์ ๋˜์–ด ๋‚˜ํƒ€๋‚˜๋Š” ์ดํ•ฉ์ž…๋‹ˆ๋‹ค.

CISQ ์—ฐ๊ตฌ์— ๋”ฐ๋ฅด๋ฉด ๊ฐœ๋ฐœ์ž๋“ค์€ ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๊ตฌ์ถ•ํ•˜๋Š” ๋Œ€์‹  ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ 30~40%์˜ ์‹œ๊ฐ„์„ ์†Œ๋น„ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ผ๊ด€๋˜๊ฒŒ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ ์Šค๋ฉœ ๋ฐ€๋„๋Š” ๋ˆ„์ ๋œ ๊ธฐ์ˆ  ๋ถ€์ฑ„์˜ ์–‘์„ ์ธก์ •ํ•˜๋Š” ๊ฐ€์žฅ ์ง์ ‘์ ์ธ ์ง€ํ‘œ์ž…๋‹ˆ๋‹ค.

๋ฐฉ๋ฒ• SMART TS XL ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ๊ทœ๋ชจ์—์„œ ์ฝ”๋“œ ์Šค๋ฉœ์„ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค.

SonarQube๋‚˜ Clippy ๊ฐ™์€ ๊ฐœ๋ณ„ ๋„๊ตฌ๋Š” ๋‹จ์ผ ์–ธ์–ด ๋‚ด์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. COBOL ํ”„๋กœ๊ทธ๋žจ์ด Java ์„œ๋น„์Šค์—์„œ ์ฝ๋Š” ๋ฐ์ดํ„ฐ ์„ธํŠธ์— ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๊ณ , JCL ์ž‘์—… ์ŠคํŠธ๋ฆผ์ด ์—ฌ๋Ÿฌ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ํ”„๋กœ๊ทธ๋žจ์„ ํ˜ธ์ถœํ•˜๋ฉฐ, ๋™์ผํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์„œ๋กœ ๋‹ค๋ฅธ ์‹œ๋Œ€์— ์ž‘์„ฑ๋œ ์„ธ ๊ฐ€์ง€ ์‹œ์Šคํ…œ์— ๋…๋ฆฝ์ ์œผ๋กœ ๋ณต์ œ๋˜์–ด ์žˆ๋Š” ์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ์—์„œ๋Š” ๋‹จ์ผ ์–ธ์–ด ๋„๊ตฌ๋กœ๋Š” ์ „์ฒด์ ์ธ ์ƒํ™ฉ์„ ํŒŒ์•…ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

SMART TS XL์˜ ์ •์  ์ฝ”๋“œ ๋ถ„์„ ์ด ๋„๊ตฌ๋Š” ํ™˜๊ฒฝ ๋‚ด ๋ชจ๋“  ์–ธ์–ด์—์„œ ๋™์‹œ์— ์ฝ”๋“œ ์Šค๋ฉœ์„ ๊ฐ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด COBOL ์ฝ”๋“œ๋ถ๊ณผ Java ์œ ํ‹ธ๋ฆฌํ‹ฐ ํด๋ž˜์Šค ๊ฐ„์˜ ์ค‘๋ณต ๋กœ์ง, JCL ์ž‘์—…์—์„œ ํ˜ธ์ถœ๋˜์ง€ ์•Š๋Š” RPG ํ”„๋กœ๊ทธ๋žจ์˜ ๋ฐ๋“œ ์ฝ”๋“œ, ๋‹จ์ผ ๋‹จ๋ฝ์ด 50๊ฐœ ๋‹จ๋ฝ์˜ ์—ญํ• ์„ ํ•˜๋Š” COBOL ํ”„๋กœ๊ทธ๋žจ์˜ ๊ฐ“ ํด๋ž˜์Šค ํŒจํ„ด, ๊ทธ๋ฆฌ๊ณ  ์–ธ์–ด ๊ฐ„ ๊ฒฝ๊ณ„์—์„œ ์ผ๊ด€์„ฑ์ด ์—†๋Š” ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ํŒจํ„ด ๋“ฑ์„ ์ฐพ์•„๋ƒ…๋‹ˆ๋‹ค.

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

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

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

์ฝ”๋“œ ์Šค๋ฉœ ํ•ด๊ฒฐ: ์šฐ์„ ์ˆœ์œ„ ํ”„๋ ˆ์ž„์›Œํฌ

๋ชจ๋“  ์ฝ”๋“œ ์Šค๋ฉœ์ด ์ฆ‰๊ฐ์ ์ธ ๋ฆฌํŒฉํ† ๋ง์„ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์€ ์œ„ํ—˜ ๊ธฐ๋ฐ˜ ์šฐ์„ ์ˆœ์œ„ ์„ค์ •์ž…๋‹ˆ๋‹ค.

์ตœ์šฐ์„  ์ˆœ์œ„: ๋ณ€๊ฒฝ ๋นˆ๋„๊ฐ€ ๋†’์€ ๊ตฌ์„ฑ ์š”์†Œ์˜ ์ฝ”๋“œ ์Šค๋ฉœ. ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๊ณ  ๋ณต์žก์„ฑ์ด๋‚˜ ๊ฒฐํ•ฉ๋„๊ฐ€ ๋†’์€ ์ฝ”๋“œ๋Š” ๊ฐ€์žฅ ๋งŽ์€ ๊ฒฐํ•จ์„ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋Š” ๋ณ€๊ฒฝ๋‹น ๋น„์šฉ์ด ๊ฐ€์žฅ ๋งŽ์ด ๋“ค๊ณ  ์šด์˜ ํ™˜๊ฒฝ์—์„œ ๊ฐ€์žฅ ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ์•ผ๊ธฐํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋Ÿฌํ•œ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋จผ์ € ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

์šฐ์„ ์ˆœ์œ„ 3, ์‹œ์Šคํ…œ ๊ฒฝ๊ณ„๋ฅผ ๋„˜๋‚˜๋“œ๋Š” ์ค‘๋ณต ์ฝ”๋“œ. ๋™์ผํ•œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์ด ์—ฌ๋Ÿฌ ์‹œ์Šคํ…œ์— ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ, ๋ชจ๋“  ์‹œ์Šคํ…œ์— ๊ฑธ์ณ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ๋™์‹œ์— ์กฐ์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ค‘๋ณต์„ ํ†ตํ•ฉํ•˜๋ฉด ์กฐ์ • ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ค„์ด๊ณ  ์ฝ”๋“œ ๋ถˆ์ผ์น˜๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ์„ ์ˆœ์œ„ 4, ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ ์ œ๊ฑฐ. ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ฝ”๋“œ๋Š” ๊ฐ€์žฅ ์•ˆ์ „ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์ฃผ์ž…๋‹ˆ๋‹ค. ์ œ๊ฑฐํ•ด๋„ ๋™์ž‘์ด ๊นจ์ง€์ง€ ์•Š๊ณ , ๋‹จ์ง€ ์ด์ „์— ์ˆจ๊ฒจ์ ธ ์žˆ๋˜ ์˜์กด์„ฑ๋งŒ ๋“œ๋Ÿฌ๋‚ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์ด๋‚˜ ๋ณ€ํ™˜ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ์ œ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ถœ๋˜์ง€ ์•Š์„ ์ฝ”๋“œ๋ฅผ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ ๋ถˆํ•„์š”ํ•œ ๋…ธ๋ ฅ์„ ๋‚ญ๋น„ํ•˜์ง€ ์•Š๋„๋ก ํ•˜๊ธฐ ์œ„ํ•จ์ž…๋‹ˆ๋‹ค.

์šฐ์„ ์ˆœ์œ„ 5, ์œ„ํ—˜๋„๊ฐ€ ๋‚ฎ์€ ์˜์—ญ์˜ ์Šคํƒ€์ผ ๋ฐ ๊ตฌ์กฐ์  ๋ฌธ์ œ์ . ์•ˆ์ •์ ์ด๊ณ  ๋ณ€๊ฒฝ ๋นˆ๋„๊ฐ€ ๋‚ฎ์€ ์ฝ”๋“œ์—์„œ ๊ธด ๋ฉ”์„œ๋“œ์™€ ๋งค๊ฐœ๋ณ€์ˆ˜ ๋ชฉ๋ก์€ ์ฃผ๋ณ€ ์ฝ”๋“œ๊ฐ€ ๋‹ค๋ฅธ ์ด์œ ๋กœ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•  ๋•Œ ๊ธฐํšŒ์ ์œผ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋•Œ ์ฃผ๋ณ€์˜ ๋ฌธ์ œ์ ๋“ค๋„ ๋™์‹œ์— ๋ฆฌํŒฉํ† ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ”๋“œ ์Šค๋ฉœ์„ ์ฒด๊ณ„์ ์œผ๋กœ ๊ฐ์ง€, ์ธก์ • ๋ฐ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์€, ์ด๋ฏธ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ ํ›„์—์•ผ ๋Œ€์‘ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, ์‹œ์Šคํ…œ ๊ทœ๋ชจ๊ฐ€ ์ปค์ง์— ๋”ฐ๋ผ ๊ฐœ๋ฐœ ์†๋„๊ฐ€ ์ ์ฐจ ๋А๋ ค์ง€๋Š” ํŒ€๊ณผ ์ง€์†์ ์ธ ๊ฐœ๋ฐœ ์†๋„ ์œ ์ง€๋ฅผ ๋ณด์žฅํ•˜๋Š” ํŒ€์„ ๊ตฌ๋ถ„ ์ง“๋Š” ํ•ต์‹ฌ ์š”์†Œ์ž…๋‹ˆ๋‹ค.