์ฝ๋ ์ค๋ฉ์ ๋ฒ๊ทธ๊ฐ ์๋๋๋ค. ๋ฒ๊ทธ๊ฐ ์๋ ํ๋ก๊ทธ๋จ์ ์ถฉ๋ํ๊ฑฐ๋, ์๋ชป๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๊ฑฐ๋, ํ ์คํธ์ ์คํจํฉ๋๋ค. ์ฝ๋ ์ค๋ฉ์ด ์๋ ํ๋ก๊ทธ๋จ์ ์๋ ๋์ ์๋ฒฝํ๊ฒ ์๋ํ ์ ์์ง๋ง, ๋ชจ๋ ๋ณ๊ฒฝ ์์ ์ ํ์ ์ด์์ผ๋ก ๋ง์ ๋น์ฉ์ ์ด๋ํ๊ณ , ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ ๋๋ง๋ค ์์์น ๋ชปํ ์ํ์ด ๋ฐ๋ฅด๋ฉฐ, ๋ฆฌํฉํ ๋ง์ ์๋ํ ๋๋ง๋ค ์๋ฌด๋ ๋ชฐ๋๋ ์์กด์ฑ์ด ๋๋ฌ๋ฉ๋๋ค. ์ฝ๋ ์ค๋ฉ์ ๋ฏธ๋์ ๋ฌธ์ ๋ฅผ ์์ธกํ๋ ์ฝ๋์ ๊ตฌ์กฐ์ ํน์ง์ ๋๋ค. ๋น์ฅ ์ค๋ฅ๋ฅผ ๋ฐ์์ํค์ง๋ ์์ง๋ง, ํฅํ ๋ชจ๋ ๋ณ๊ฒฝ ์์ ์ ํ์ ์ด์์ผ๋ก ์ด๋ ต๊ณ , ๋๋ฆฌ๊ณ , ์ํํ๊ฒ ๋ง๋ญ๋๋ค.
์ด ์ฉ์ด๋ ๋งํด ํ์ธ๋ฌ์ ์ผํธ ๋ฒก์ด ํ์ธ๋ฌ์ ์ ์ ใ๋ฆฌํฉํ ๋ง: ๊ธฐ์กด ์ฝ๋ ์ค๊ณ ๊ฐ์ (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 XL | COBOL, 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, ์ํ๋๊ฐ ๋ฎ์ ์์ญ์ ์คํ์ผ ๋ฐ ๊ตฌ์กฐ์ ๋ฌธ์ ์ . ์์ ์ ์ด๊ณ ๋ณ๊ฒฝ ๋น๋๊ฐ ๋ฎ์ ์ฝ๋์์ ๊ธด ๋ฉ์๋์ ๋งค๊ฐ๋ณ์ ๋ชฉ๋ก์ ์ฃผ๋ณ ์ฝ๋๊ฐ ๋ค๋ฅธ ์ด์ ๋ก ๋ณ๊ฒฝ๋์ด์ผ ํ ๋ ๊ธฐํ์ ์ผ๋ก ํด๊ฒฐํ ์ ์์ผ๋ฉฐ, ์ด๋ ์ฃผ๋ณ์ ๋ฌธ์ ์ ๋ค๋ ๋์์ ๋ฆฌํฉํ ๋งํ ์ ์์ต๋๋ค.
์ฝ๋ ์ค๋ฉ์ ์ฒด๊ณ์ ์ผ๋ก ๊ฐ์ง, ์ธก์ ๋ฐ ํด๊ฒฐํ๋ ๊ฒ์, ์ด๋ฏธ ํ๋ก๋์ ํ๊ฒฝ์์ ์ค๋ฅ๋ฅผ ๋ฐ์์ํจ ํ์์ผ ๋์ํ๋ ๊ฒ์ด ์๋๋ผ, ์์คํ ๊ท๋ชจ๊ฐ ์ปค์ง์ ๋ฐ๋ผ ๊ฐ๋ฐ ์๋๊ฐ ์ ์ฐจ ๋๋ ค์ง๋ ํ๊ณผ ์ง์์ ์ธ ๊ฐ๋ฐ ์๋ ์ ์ง๋ฅผ ๋ณด์ฅํ๋ ํ์ ๊ตฌ๋ถ ์ง๋ ํต์ฌ ์์์ ๋๋ค.