๋ ๊ฑฐ์ ์ฝ๋ ๋ฆฌํฉํ ๋ง์ ๋ํ ์ค์ฉ ๊ฐ์ด๋. ์ฝ๋ ์๋ณ, ์ฐ์ ์์ ์ง์ , ๊ธฐ๋ฒ, ํ๋ํ ๋ฐ ์ ์ง๋ณด์์ฑ์ ์ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ค๋ฃน๋๋ค.
์ผ์ ๊ธธ๋ค์ด๊ธฐ: ๋ ๊ฑฐ์ ์ฝ๋ ๋ฆฌํฉํ ๋ง ์ ๋ต
๋ ๊ฑฐ์ ์ฝ๋. ์ด ์ฉ์ด ์์ฒด๋ ์ข ์ข ๋ฌด๋ถ๋ณํ๊ฒ ํ์ฅ๋๊ณ ๋ฌธ์ํ๋์ง ์์ ์์คํ , ๊นจ์ง๊ธฐ ์ฌ์ด ์์กด์ฑ, ๊ทธ๋ฆฌ๊ณ ์๋์ ์ธ ๋๋ ค์์ ์ฐ์์ํต๋๋ค. ์ ์ธ๊ณ์ ๋ง์ ๊ฐ๋ฐ์๋ค์ด ๋น์ฆ๋์ค ์ด์์ ๋งค์ฐ ์ค์ํ ์ด๋ฌํ ์์คํ ์ ์ ์งํ๊ณ ๋ฐ์ ์์ผ์ผ ํ๋ ๊ณผ์ ์ ์ง๋ฉดํด ์์ต๋๋ค. ์ด ํฌ๊ด์ ์ธ ๊ฐ์ด๋๋ ๋ ๊ฑฐ์ ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํ๊ธฐ ์ํ ์ค์ฉ์ ์ธ ์ ๋ต์ ์ ๊ณตํ์ฌ, ์ข์ ์ ์์ธ์ ํ๋ํ์ ๊ฐ์ ์ ๊ธฐํ๋ก ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ์ ์ ์ํฉ๋๋ค.
๋ ๊ฑฐ์ ์ฝ๋๋ ๋ฌด์์ธ๊ฐ?
๋ฆฌํฉํ ๋ง ๊ธฐ๋ฒ์ ๋ํด ์์๋ณด๊ธฐ ์ ์ "๋ ๊ฑฐ์ ์ฝ๋"๊ฐ ๋ฌด์์ ์๋ฏธํ๋์ง ์ ์ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ด ์ฉ์ด๋ ๋จ์ํ ์ค๋๋ ์ฝ๋๋ฅผ ์ง์นญํ ์๋ ์์ง๋ง, ๋ ๋ฏธ๋ฌํ ์ ์๋ ์ ์ง๋ณด์์ฑ์ ์ด์ ์ ๋ง์ถฅ๋๋ค. ๋ง์ดํด ํ๋์ค(Michael Feathers)๋ ๊ทธ์ ์ ์ "๋ ๊ฑฐ์ ์ฝ๋ ํ์ฉ ์ ๋ต(Working Effectively with Legacy Code)"์์ ๋ ๊ฑฐ์ ์ฝ๋๋ฅผ ํ ์คํธ๊ฐ ์๋ ์ฝ๋๋ก ์ ์ํฉ๋๋ค. ์ด๋ฌํ ํ ์คํธ์ ๋ถ์ฌ๋ ํ๊ท(regression)๋ฅผ ์ ๋ฐํ์ง ์๊ณ ์์ ํ๊ฒ ์ฝ๋๋ฅผ ์์ ํ๋ ๊ฒ์ ์ด๋ ต๊ฒ ๋ง๋ญ๋๋ค. ๊ทธ๋ฌ๋ ๋ ๊ฑฐ์ ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ ๋ค๋ฅธ ํน์ง๋ค๋ ๋ณด์ผ ์ ์์ต๋๋ค:
- ๋ฌธ์ ๋ถ์กฑ: ์ต์ด ๊ฐ๋ฐ์๋ค์ด ์์คํ ์ ์ํคํ ์ฒ, ์ค๊ณ ๊ฒฐ์ , ์ฌ์ง์ด ๊ธฐ๋ณธ์ ์ธ ๊ธฐ๋ฅ์ ๋ํ ์ค๋ช ์ ๊ฑฐ์ ๋๋ ์ ํ ๋จ๊ธฐ์ง ์๊ณ ๋ ๋ฌ์ ์ ์์ต๋๋ค.
- ๋ณต์กํ ์์กด์ฑ: ์ฝ๋๊ฐ ๊ธด๋ฐํ๊ฒ ๊ฒฐํฉ(tightly coupled)๋์ด ์์ด, ์์คํ ์ ๋ค๋ฅธ ๋ถ๋ถ์ ์ํฅ์ ์ฃผ์ง ์๊ณ ๊ฐ๋ณ ๊ตฌ์ฑ ์์๋ฅผ ๋ถ๋ฆฌํ๊ณ ์์ ํ๊ธฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
- ์ค๋๋ ๊ธฐ์ : ์ฝ๋๊ฐ ๋ ์ด์ ์ ๊ทน์ ์ผ๋ก ์ง์๋์ง ์๋ ์ค๋๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด, ํ๋ ์์ํฌ ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์์ฑ๋์์ ์ ์์ผ๋ฉฐ, ์ด๋ ๋ณด์ ์ํ์ ์ด๋ํ๊ณ ์ต์ ๋๊ตฌ์ ๋ํ ์ ๊ทผ์ ์ ํํฉ๋๋ค.
- ๋ฎ์ ์ฝ๋ ํ์ง: ์ฝ๋๊ฐ ์ค๋ณต๋ ์ฝ๋, ๊ธด ๋ฉ์๋ ๋ฐ ๊ธฐํ ์ฝ๋ ์ค๋ฉ(code smells)์ ํฌํจํ์ฌ ์ดํดํ๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
- ์ทจ์ฝํ ์ค๊ณ: ์ฌ์ํด ๋ณด์ด๋ ๋ณ๊ฒฝ์ด ์์์น ๋ชปํ ๊ด๋ฒ์ํ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค.
๋ ๊ฑฐ์ ์ฝ๋๊ฐ ๋ณธ์ง์ ์ผ๋ก ๋์ ๊ฒ์ ์๋๋ผ๋ ์ ์ ์ ์ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๊ทธ๊ฒ์ ์ข ์ข ์๋นํ ํฌ์๋ฅผ ๋ํํ๋ฉฐ ๊ท์คํ ๋๋ฉ์ธ ์ง์์ ๋ด๊ณ ์์ต๋๋ค. ๋ฆฌํฉํ ๋ง์ ๋ชฉํ๋ ์ฝ๋์ ์ ์ง๋ณด์์ฑ, ์ ๋ขฐ์ฑ ๋ฐ ์ฑ๋ฅ์ ๊ฐ์ ํ๋ฉด์ ์ด ๊ฐ์น๋ฅผ ๋ณด์กดํ๋ ๊ฒ์ ๋๋ค.
์ ๋ ๊ฑฐ์ ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํด์ผ ํ๋๊ฐ?
๋ ๊ฑฐ์ ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํ๋ ๊ฒ์ ๋ฒ ์ฐฌ ์์ ์ผ ์ ์์ง๋ง, ๊ทธ ์ด์ ์ ์ข ์ข ์ด๋ ค์์ ๋ฅ๊ฐํฉ๋๋ค. ๋ค์์ ๋ฆฌํฉํ ๋ง์ ํฌ์ํด์ผ ํ๋ ๋ช ๊ฐ์ง ์ฃผ์ ์ด์ ์ ๋๋ค:
- ์ ์ง๋ณด์์ฑ ํฅ์: ๋ฆฌํฉํ ๋ง์ ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ์ดํดํ๊ณ , ์์ ํ๊ณ , ๋๋ฒ๊น ํ ์ ์๊ฒ ๋ง๋ค์ด ์ง์์ ์ธ ์ ์ง๋ณด์์ ํ์ํ ๋น์ฉ๊ณผ ๋ ธ๋ ฅ์ ์ค์ฌ์ค๋๋ค. ๊ธ๋ก๋ฒ ํ์ ๊ฒฝ์ฐ, ํน์ ๊ฐ์ธ์ ๋ํ ์์กด๋๋ฅผ ์ค์ด๊ณ ์ง์ ๊ณต์ ๋ฅผ ์ด์งํ๋ฏ๋ก ํนํ ์ค์ํฉ๋๋ค.
- ๊ธฐ์ ๋ถ์ฑ ๊ฐ์: ๊ธฐ์ ๋ถ์ฑ๋ ๋ ์ค๋ ๊ฑธ๋ฆฌ๋ ๋ ๋์ ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ ๋์ ์ง๊ธ ๋น์ฅ ์ฌ์ด ํด๊ฒฐ์ฑ ์ ์ ํํจ์ผ๋ก์จ ๋ฐ์ํ๋ ์๋ฌต์ ์ธ ์ฌ์์ ๋น์ฉ์ ์๋ฏธํฉ๋๋ค. ๋ฆฌํฉํ ๋ง์ ์ด ๋ถ์ฑ๋ฅผ ๊ฐ์ ์ฝ๋๋ฒ ์ด์ค์ ์ ๋ฐ์ ์ธ ๊ฑด์ ์ฑ์ ๊ฐ์ ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ์ ๋ขฐ์ฑ ํฅ์: ์ฝ๋ ์ค๋ฉ์ ํด๊ฒฐํ๊ณ ์ฝ๋ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ ํจ์ผ๋ก์จ ๋ฆฌํฉํ ๋ง์ ๋ฒ๊ทธ์ ์ํ์ ์ค์ด๊ณ ์์คํ ์ ์ ๋ฐ์ ์ธ ์ ๋ขฐ์ฑ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- ์ฑ๋ฅ ํฅ์: ๋ฆฌํฉํ ๋ง์ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์๋ณํ๊ณ ํด๊ฒฐํ์ฌ ์คํ ์๊ฐ์ ๋จ์ถํ๊ณ ์๋ต์ฑ์ ๊ฐ์ ํ ์ ์์ต๋๋ค.
- ๋ ์ฌ์ด ํตํฉ: ๋ฆฌํฉํ ๋ง์ ๋ ๊ฑฐ์ ์์คํ ์ ์๋ก์ด ์์คํ ๋ฐ ๊ธฐ์ ๊ณผ ๋ ์ฝ๊ฒ ํตํฉํ ์ ์๊ฒ ํ์ฌ ํ์ ๊ณผ ํ๋ํ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ ๋ฝ์ ํ ์ ์์๊ฑฐ๋ ํ๋ซํผ์ ๋ค๋ฅธ API๋ฅผ ์ฌ์ฉํ๋ ์๋ก์ด ๊ฒฐ์ ๊ฒ์ดํธ์จ์ด์ ํตํฉํด์ผ ํ ์ ์์ต๋๋ค.
- ๊ฐ๋ฐ์ ์ฌ๊ธฐ ํฅ์: ๊นจ๋ํ๊ณ ์ ๊ตฌ์กฐํ๋ ์ฝ๋๋ก ์์ ํ๋ ๊ฒ์ ๊ฐ๋ฐ์์๊ฒ ๋ ์ฆ๊ฒ๊ณ ์์ฐ์ ์ ๋๋ค. ๋ฆฌํฉํ ๋ง์ ์ฌ๊ธฐ๋ฅผ ์ง์์ํค๊ณ ์ธ์ฌ๋ฅผ ์ ์นํ ์ ์์ต๋๋ค.
๋ฆฌํฉํ ๋ง ๋์ ์๋ณํ๊ธฐ
๋ชจ๋ ๋ ๊ฑฐ์ ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํ ํ์๋ ์์ต๋๋ค. ๋ค์ ์์๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๋ฆฌํฉํ ๋ง ๋ ธ๋ ฅ์ ์ฐ์ ์์๋ฅผ ์ ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค:
- ๋ณ๊ฒฝ ๋น๋: ์์ฃผ ์์ ๋๋ ์ฝ๋๋ ๋ฆฌํฉํ ๋ง์ ์ฃผ์ ๋์์ ๋๋ค. ์ ์ง๋ณด์์ฑ์ด ํฅ์๋๋ฉด ๊ฐ๋ฐ ์์ฐ์ฑ์ ์๋นํ ์ํฅ์ ๋ฏธ์น๊ธฐ ๋๋ฌธ์ ๋๋ค.
- ๋ณต์ก์ฑ: ๋ณต์กํ๊ณ ์ดํดํ๊ธฐ ์ด๋ ค์ด ์ฝ๋๋ ๋ฒ๊ทธ๋ฅผ ํฌํจํ ๊ฐ๋ฅ์ฑ์ด ๋ ๋๊ณ ์์ ํ๊ฒ ์์ ํ๊ธฐ๊ฐ ๋ ์ด๋ ต์ต๋๋ค.
- ๋ฒ๊ทธ์ ์ํฅ: ๋น์ฆ๋์ค ์ด์์ ์ค์ํ๊ฑฐ๋ ๋น์ฉ์ด ๋ง์ด ๋๋ ์ค๋ฅ๋ฅผ ์ ๋ฐํ ์ํ์ด ๋์ ์ฝ๋๋ ๋ฆฌํฉํ ๋ง์ ์ฐ์ ์์๊ฐ ๋์ด์ผ ํฉ๋๋ค.
- ์ฑ๋ฅ ๋ณ๋ชฉ ํ์: ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ผ๋ก ์๋ณ๋ ์ฝ๋๋ ์ฑ๋ฅ ๊ฐ์ ์ ์ํด ๋ฆฌํฉํ ๋ง๋์ด์ผ ํฉ๋๋ค.
- ์ฝ๋ ์ค๋ฉ: ๊ธด ๋ฉ์๋, ๊ฑฐ๋ํ ํด๋์ค, ์ค๋ณต ์ฝ๋, ๊ธฐ๋ฅ ํธ์ (feature envy)์ ๊ฐ์ ์ผ๋ฐ์ ์ธ ์ฝ๋ ์ค๋ฉ์ ์ฃผ์ ๊น๊ฒ ์ดํด๋ณด์ธ์. ์ด๋ ๋ฆฌํฉํ ๋ง์ ํตํด ์ด์ ์ ์ป์ ์ ์๋ ์์ญ์ ์งํ์ ๋๋ค.
์์: ๊ธ๋ก๋ฒ ๋ฌผ๋ฅ ํ์ฌ์ ๋ฐฐ์ก์ ๊ด๋ฆฌํ๋ ๋ ๊ฑฐ์ ์์คํ ์ด ์๋ค๊ณ ์์ํด ๋ณด์ญ์์ค. ๋ฐฐ์ก ๋น์ฉ์ ๊ณ์ฐํ๋ ๋ชจ๋์ ๋ณ๊ฒฝ๋๋ ๊ท์ ๊ณผ ์ ๊ฐ๋ก ์ธํด ์์ฃผ ์ ๋ฐ์ดํธ๋ฉ๋๋ค. ์ด ๋ชจ๋์ ๋ฆฌํฉํ ๋ง์ ์ฃผ์ ๋์์ ๋๋ค.
๋ฆฌํฉํ ๋ง ๊ธฐ๋ฒ
์ฌ์ฉ ๊ฐ๋ฅํ ๋ฆฌํฉํ ๋ง ๊ธฐ๋ฒ์ ์์์ด ๋ง์ผ๋ฉฐ, ๊ฐ๊ฐ์ ํน์ ์ฝ๋ ์ค๋ฉ์ ํด๊ฒฐํ๊ฑฐ๋ ์ฝ๋์ ํน์ ์ธก๋ฉด์ ๊ฐ์ ํ๋๋ก ์ค๊ณ๋์์ต๋๋ค. ๋ค์์ ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋๋ ๋ช ๊ฐ์ง ๊ธฐ๋ฒ์ ๋๋ค:
๋ฉ์๋ ๊ตฌ์ฑํ๊ธฐ
์ด ๊ธฐ๋ฒ๋ค์ ํฌ๊ณ ๋ณต์กํ ๋ฉ์๋๋ฅผ ๋ ์๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ๋ฉ์๋๋ก ๋๋๋ ๋ฐ ์ค์ ์ ๋ก๋๋ค. ์ด๋ ๊ฐ๋ ์ฑ์ ํฅ์์ํค๊ณ , ์ค๋ณต์ ์ค์ด๋ฉฐ, ์ฝ๋๋ฅผ ํ ์คํธํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
- ๋ฉ์๋ ์ถ์ถ(Extract Method): ํน์ ์์ ์ ์ํํ๋ ์ฝ๋ ๋ธ๋ก์ ์๋ณํ์ฌ ์ ๋ฉ์๋๋ก ์ฎ๊ธฐ๋ ๊ฒ์ ํฌํจํฉ๋๋ค.
- ๋ฉ์๋ ์ธ๋ผ์ธ(Inline Method): ๋ฉ์๋ ํธ์ถ์ ๋ฉ์๋์ ๋ณธ๋ฌธ์ผ๋ก ๋์ฒดํ๋ ๊ฒ์ ๋๋ค. ๋ฉ์๋์ ์ด๋ฆ์ด ๋ณธ๋ฌธ๋งํผ ๋ช ํํ๊ฑฐ๋, ๋ฉ์๋ ์ถ์ถ์ ์ฌ์ฉํ๋ ค๋๋ฐ ๊ธฐ์กด ๋ฉ์๋๊ฐ ๋๋ฌด ์งง์ ๋ ์ฌ์ฉํฉ๋๋ค.
- ์์ ๋ณ์๋ฅผ ์ง์๋ก ๋ฐ๊พธ๊ธฐ(Replace Temp with Query): ์์ ๋ณ์๋ฅผ ํ์ํ ๋๋ง๋ค ๋ณ์ ๊ฐ์ ๊ณ์ฐํ๋ ๋ฉ์๋ ํธ์ถ๋ก ๋์ฒดํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค.
- ์ค๋ช ๋ณ์ ๋์ (Introduce Explaining Variable): ํํ์์ ๊ฒฐ๊ณผ๋ฅผ ์ค๋ช ์ ์ธ ์ด๋ฆ์ ๋ณ์์ ํ ๋นํ์ฌ ๊ทธ ๋ชฉ์ ์ ๋ช ํํ ํ ๋ ์ฌ์ฉํฉ๋๋ค.
๊ฐ์ฒด ๊ฐ ๊ธฐ๋ฅ ์ด๋
์ด ๊ธฐ๋ฒ๋ค์ ์ฑ ์์ ์ ์ ํ ์์น๋ก ์ด๋์์ผ ํด๋์ค์ ๊ฐ์ฒด์ ์ค๊ณ๋ฅผ ๊ฐ์ ํ๋ ๋ฐ ์ค์ ์ ๋ก๋๋ค.
- ๋ฉ์๋ ์ด๋(Move Method): ๋ฉ์๋๋ฅผ ํ ํด๋์ค์์ ๋ ผ๋ฆฌ์ ์ผ๋ก ์ํ๋ ๋ค๋ฅธ ํด๋์ค๋ก ์ฎ๊ธฐ๋ ๊ฒ์ ํฌํจํฉ๋๋ค.
- ํ๋ ์ด๋(Move Field): ํ๋๋ฅผ ํ ํด๋์ค์์ ๋ ผ๋ฆฌ์ ์ผ๋ก ์ํ๋ ๋ค๋ฅธ ํด๋์ค๋ก ์ฎ๊ธฐ๋ ๊ฒ์ ํฌํจํฉ๋๋ค.
- ํด๋์ค ์ถ์ถ(Extract Class): ๊ธฐ์กด ํด๋์ค์์ ์ถ์ถ๋ ์์ง๋ ฅ ์๋ ์ฑ ์ ์งํฉ์ผ๋ก๋ถํฐ ์ ํด๋์ค๋ฅผ ๋ง๋๋ ๊ฒ์ ํฌํจํฉ๋๋ค.
- ํด๋์ค ์ธ๋ผ์ธ(Inline Class): ํด๋์ค๊ฐ ๋ ์ด์ ๊ทธ ์กด์ฌ๋ฅผ ์ ๋นํํ ๋งํผ ์ถฉ๋ถํ ์ญํ ์ ํ์ง ์์ ๋ ๋ค๋ฅธ ํด๋์ค๋ก ํฉ์น ๋ ์ฌ์ฉํฉ๋๋ค.
- ๋๋ฆฌ์ ์จ๊ธฐ๊ธฐ(Hide Delegate): ํด๋ผ์ด์ธํธ์ ๋๋ฆฌ์ ๊ฐ์ ๊ฒฐํฉ์ ์ค์ด๊ธฐ ์ํด ์๋ฒ์ ๋ฉ์๋๋ฅผ ๋ง๋ค์ด ํด๋ผ์ด์ธํธ๋ก๋ถํฐ ์์ ๋ก์ง์ ์จ๊ธฐ๋ ๊ฒ์ ํฌํจํฉ๋๋ค.
- ์ค๊ฐ์ ์ ๊ฑฐ(Remove Middle Man): ํด๋์ค๊ฐ ๊ฑฐ์ ๋ชจ๋ ์์ ์ ์์ํ๊ณ ์๋ค๋ฉด ์ด ๊ธฐ๋ฒ์ ์ค๊ฐ์๋ฅผ ์ ๊ฑฐํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
- ์ธ๋ ๋ฉ์๋ ๋์ (Introduce Foreign Method): ์๋ฒ ํด๋์ค์์ ์ค์ ๋ก ํ์ํ์ง๋ง ์ ๊ทผ ๊ถํ์ด ์๊ฑฐ๋ ์๋ฒ ํด๋์ค์ ๋ณ๊ฒฝ์ด ์์ ๋์ด ์์ด ์์ ํ ์ ์๋ ๊ธฐ๋ฅ์ ํด๋ผ์ด์ธํธ์ ์ ๊ณตํ๊ธฐ ์ํด ํด๋ผ์ด์ธํธ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ถ๊ฐํฉ๋๋ค.
- ๋ก์ปฌ ํ์ฅ ๋์ (Introduce Local Extension): ์ ๋ฉ์๋๋ฅผ ํฌํจํ๋ ์ ํด๋์ค๋ฅผ ๋ง๋ญ๋๋ค. ํด๋์ค์ ์์ค ์ฝ๋๋ฅผ ์ ์ดํ ์ ์์ด ์ง์ ๋์์ ์ถ๊ฐํ ์ ์์ ๋ ์ ์ฉํฉ๋๋ค.
๋ฐ์ดํฐ ์กฐ์งํ
์ด ๊ธฐ๋ฒ๋ค์ ๋ฐ์ดํฐ๊ฐ ์ ์ฅ๋๊ณ ์ ๊ทผ๋๋ ๋ฐฉ์์ ๊ฐ์ ํ์ฌ ์ดํดํ๊ณ ์์ ํ๊ธฐ ์ฝ๊ฒ ๋ง๋๋ ๋ฐ ์ค์ ์ ๋ก๋๋ค.
- ๋ฐ์ดํฐ ๊ฐ์ ๊ฐ์ฒด๋ก ๋ฐ๊พธ๊ธฐ(Replace Data Value with Object): ๊ฐ๋จํ ๋ฐ์ดํฐ ๊ฐ์ ๊ด๋ จ๋ ๋ฐ์ดํฐ์ ๋์์ ์บก์ํํ๋ ๊ฐ์ฒด๋ก ๋ฐ๊พธ๋ ๊ฒ์ ํฌํจํฉ๋๋ค.
- ๊ฐ์ ์ฐธ์กฐ๋ก ๋ฐ๊พธ๊ธฐ(Change Value to Reference): ์ฌ๋ฌ ๊ฐ์ฒด๊ฐ ๋์ผํ ๊ฐ์ ๊ณต์ ํ ๋ ๊ฐ ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐ ๊ฐ์ฒด๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค.
- ๋จ๋ฐฉํฅ ์ฐ๊ฒฐ์ ์๋ฐฉํฅ์ผ๋ก ๋ฐ๊พธ๊ธฐ(Change Unidirectional Association to Bidirectional): ํ ๋ฐฉํฅ ์ฐ๊ฒฐ๋ง ์กด์ฌํ๋ ๋ ํด๋์ค ๊ฐ์ ์๋ฐฉํฅ ๋งํฌ๋ฅผ ์์ฑํฉ๋๋ค.
- ์๋ฐฉํฅ ์ฐ๊ฒฐ์ ๋จ๋ฐฉํฅ์ผ๋ก ๋ฐ๊พธ๊ธฐ(Change Bidirectional Association to Unidirectional): ์๋ฐฉํฅ ๊ด๊ณ๋ฅผ ๋จ๋ฐฉํฅ์ผ๋ก ๋ง๋ค์ด ์ฐ๊ฒฐ์ ๋จ์ํํฉ๋๋ค.
- ๋งค์ง ๋๋ฒ๋ฅผ ์์๋ก ๋ฐ๊พธ๊ธฐ(Replace Magic Number with Symbolic Constant): ๋ฆฌํฐ๋ด ๊ฐ์ ์ด๋ฆ ์๋ ์์๋ก ๋ฐ๊พธ์ด ์ฝ๋๋ฅผ ๋ ์ฝ๊ฒ ์ดํดํ๊ณ ์ ์ง ๊ด๋ฆฌํ ์ ์๊ฒ ๋ง๋๋ ๊ฒ์ ํฌํจํฉ๋๋ค.
- ํ๋ ์บก์ํ(Encapsulate Field): ํ๋์ ์ ๊ทผํ๊ธฐ ์ํ ๊ฒํฐ(getter)์ ์ธํฐ(setter) ๋ฉ์๋๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์ปฌ๋ ์ ์บก์ํ(Encapsulate Collection): ์ปฌ๋ ์ ์ ๋ํ ๋ชจ๋ ๋ณ๊ฒฝ์ด ์์ ์ ํด๋์ค์ ์ ์คํ๊ฒ ์ ์ด๋ ๋ฉ์๋๋ฅผ ํตํด์๋ง ๋ฐ์ํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
- ๋ ์ฝ๋๋ฅผ ๋ฐ์ดํฐ ํด๋์ค๋ก ๋ฐ๊พธ๊ธฐ(Replace Record with Data Class): ๋ ์ฝ๋์ ๊ตฌ์กฐ์ ์ ๊ทผ์ ๋ฉ์๋์ ์ผ์นํ๋ ํ๋๋ฅผ ๊ฐ์ง ์ ํด๋์ค๋ฅผ ๋ง๋ญ๋๋ค.
- ํ์ ์ฝ๋๋ฅผ ํด๋์ค๋ก ๋ฐ๊พธ๊ธฐ(Replace Type Code with Class): ํ์ ์ฝ๋์ ์ ํ์ ์ด๊ณ ์๋ ค์ง ๊ฐ ์งํฉ์ด ์์ ๋ ์ ํด๋์ค๋ฅผ ๋ง๋ญ๋๋ค.
- ํ์ ์ฝ๋๋ฅผ ํ์ ํด๋์ค๋ก ๋ฐ๊พธ๊ธฐ(Replace Type Code with Subclasses): ํ์ ์ฝ๋ ๊ฐ์ด ํด๋์ค์ ๋์์ ์ํฅ์ ๋ฏธ์น ๋ ์ฌ์ฉํฉ๋๋ค.
- ํ์ ์ฝ๋๋ฅผ ์ํ/์ ๋ต์ผ๋ก ๋ฐ๊พธ๊ธฐ(Replace Type Code with State/Strategy): ํ์ ์ฝ๋ ๊ฐ์ด ํด๋์ค์ ๋์์ ์ํฅ์ ๋ฏธ์น์ง๋ง ํ์ ํด๋์คํ๊ฐ ์ ์ ํ์ง ์์ ๋ ์ฌ์ฉํฉ๋๋ค.
- ํ์ ํด๋์ค๋ฅผ ํ๋๋ก ๋ฐ๊พธ๊ธฐ(Replace Subclass with Fields): ํ์ ํด๋์ค๋ฅผ ์ ๊ฑฐํ๊ณ ํ์ ํด๋์ค์ ๊ณ ์ ํ ์์ฑ์ ๋ํ๋ด๋ ํ๋๋ฅผ ์์ ํด๋์ค์ ์ถ๊ฐํฉ๋๋ค.
์กฐ๊ฑด ํํ์ ๋จ์ํ
์กฐ๊ฑด ๋ ผ๋ฆฌ๋ ๊ธ๋ฐฉ ๋ณต์กํด์ง ์ ์์ต๋๋ค. ์ด ๊ธฐ๋ฒ๋ค์ ์ด๋ฅผ ๋ช ํํ๊ณ ๋จ์ํ๊ฒ ๋ง๋๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค.
- ์กฐ๊ฑด๋ฌธ ๋ถํด(Decompose Conditional): ๋ณต์กํ ์กฐ๊ฑด๋ฌธ์ ๋ ์๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ์กฐ๊ฐ์ผ๋ก ๋๋๋ ๊ฒ์ ํฌํจํฉ๋๋ค.
- ์กฐ๊ฑด์ ํตํฉ(Consolidate Conditional Expression): ์ฌ๋ฌ ์กฐ๊ฑด๋ฌธ์ ํ๋์ ๋ ๊ฐ๊ฒฐํ ๋ฌธ์ผ๋ก ๊ฒฐํฉํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค.
- ์ค๋ณต ์กฐ๊ฑด๋ถ ์กฐ๊ฐ ํตํฉ(Consolidate Duplicate Conditional Fragments): ์กฐ๊ฑด๋ฌธ์ ์ฌ๋ฌ ๋ถ๊ธฐ์์ ์ค๋ณต๋๋ ์ฝ๋๋ฅผ ์กฐ๊ฑด๋ฌธ ๋ฐ์ผ๋ก ์ฎ๊ธฐ๋ ๊ฒ์ ํฌํจํฉ๋๋ค.
- ์ ์ด ํ๋๊ทธ ์ ๊ฑฐ(Remove Control Flag): ๋ก์ง์ ํ๋ฆ์ ์ ์ดํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋ถ๋ฆฌ์ธ ๋ณ์๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
- ์ค์ฒฉ ์กฐ๊ฑด๋ฌธ์ ๋ณดํธ ๊ตฌ๋ฌธ์ผ๋ก ๋ฐ๊พธ๊ธฐ(Replace Nested Conditional with Guard Clauses): ๋ชจ๋ ํน๋ณํ ๊ฒฝ์ฐ๋ฅผ ๋งจ ์์ ๋ฐฐ์นํ๊ณ ๊ทธ ์ค ํ๋๋ผ๋ ์ฐธ์ด๋ฉด ์ฒ๋ฆฌ๋ฅผ ์ค๋จํ์ฌ ์ฝ๋๋ฅผ ๋ ์ฝ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
- ์กฐ๊ฑด๋ฌธ์ ๋คํ์ฑ์ผ๋ก ๋ฐ๊พธ๊ธฐ(Replace Conditional with Polymorphism): ์กฐ๊ฑด ๋ ผ๋ฆฌ๋ฅผ ๋คํ์ฑ์ผ๋ก ๋์ฒดํ์ฌ ๋ค๋ฅธ ๊ฐ์ฒด๊ฐ ๋ค๋ฅธ ๊ฒฝ์ฐ๋ฅผ ์ฒ๋ฆฌํ๋๋ก ํ์ฉํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค.
- ๋ ๊ฐ์ฒด ๋์ (Introduce Null Object): null ๊ฐ์ ํ์ธํ๋ ๋์ ๊ธฐ๋ณธ ๋์์ ์ ๊ณตํ๋ ๊ธฐ๋ณธ ๊ฐ์ฒด๋ฅผ ๋ง๋ญ๋๋ค.
- ๋จ์ธ ๋์ (Introduce Assertion): ์์์ ํ์ธํ๋ ํ ์คํธ๋ฅผ ๋ง๋ค์ด ๋ช ์์ ์ผ๋ก ๊ธฐ๋๋ฅผ ๋ฌธ์ํํฉ๋๋ค.
๋ฉ์๋ ํธ์ถ ๋จ์ํ
- ๋ฉ์๋ ์ด๋ฆ ๋ฐ๊พธ๊ธฐ(Rename Method): ๋ช ๋ฐฑํด ๋ณด์ด์ง๋ง ์ฝ๋๋ฅผ ๋ช ํํ๊ฒ ๋ง๋๋ ๋ฐ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
- ๋งค๊ฐ๋ณ์ ์ถ๊ฐ(Add Parameter): ๋ฉ์๋ ์๊ทธ๋์ฒ์ ์ ๋ณด๋ฅผ ์ถ๊ฐํ๋ฉด ๋ฉ์๋๊ฐ ๋ ์ ์ฐํ๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํด์ง๋๋ค.
- ๋งค๊ฐ๋ณ์ ์ ๊ฑฐ(Remove Parameter): ๋งค๊ฐ๋ณ์๊ฐ ์ฌ์ฉ๋์ง ์์ผ๋ฉด ์ธํฐํ์ด์ค๋ฅผ ๋จ์ํํ๊ธฐ ์ํด ์ ๊ฑฐํฉ๋๋ค.
- ์ฟผ๋ฆฌ์ ์์ ์ ๋ถ๋ฆฌ(Separate Query from Modifier): ๋ฉ์๋๊ฐ ๊ฐ์ ๋ณ๊ฒฝํ๊ณ ๋ฐํํ๋ ๊ฒฝ์ฐ, ๋ ๊ฐ์ ๋ณ๋ ๋ฉ์๋๋ก ๋ถ๋ฆฌํฉ๋๋ค.
- ๋ฉ์๋ ๋งค๊ฐ๋ณ์ํ(Parameterize Method): ์ ์ฌํ ๋ฉ์๋๋ค์ ๋์์ ๋ณํ์ํค๋ ๋งค๊ฐ๋ณ์๋ฅผ ๊ฐ์ง ๋จ์ผ ๋ฉ์๋๋ก ํตํฉํ ๋ ์ฌ์ฉํฉ๋๋ค.
- ๋งค๊ฐ๋ณ์๋ฅผ ๋ช ์์ ๋ฉ์๋๋ก ๋ฐ๊พธ๊ธฐ(Replace Parameter with Explicit Methods): ๋งค๊ฐ๋ณ์ํ์ ๋ฐ๋ - ๋จ์ผ ๋ฉ์๋๋ฅผ ๋งค๊ฐ๋ณ์์ ํน์ ๊ฐ์ ๋ํ๋ด๋ ์ฌ๋ฌ ๋ฉ์๋๋ก ๋ถํ ํฉ๋๋ค.
- ๊ฐ์ฒด ํต์งธ๋ก ๋ณด์กด(Preserve Whole Object): ๋ช ๊ฐ์ง ํน์ ๋ฐ์ดํฐ ํญ๋ชฉ์ ๋ฉ์๋์ ์ ๋ฌํ๋ ๋์ , ์ ์ฒด ๊ฐ์ฒด๋ฅผ ์ ๋ฌํ์ฌ ๋ฉ์๋๊ฐ ๋ชจ๋ ๋ฐ์ดํฐ์ ์ ๊ทผํ ์ ์๋๋ก ํฉ๋๋ค.
- ๋งค๊ฐ๋ณ์๋ฅผ ๋ฉ์๋๋ก ๋ฐ๊พธ๊ธฐ(Replace Parameter with Method): ๋ฉ์๋๊ฐ ํญ์ ํ๋์์ ํ์๋ ๋์ผํ ๊ฐ์ผ๋ก ํธ์ถ๋๋ค๋ฉด, ๋ฉ์๋ ๋ด๋ถ์์ ๋งค๊ฐ๋ณ์ ๊ฐ์ ํ์์ํค๋ ๊ฒ์ ๊ณ ๋ คํฉ๋๋ค.
- ๋งค๊ฐ๋ณ์ ๊ฐ์ฒด ๋์ (Introduce Parameter Object): ์ฌ๋ฌ ๋งค๊ฐ๋ณ์๊ฐ ์์ฐ์ค๋ฝ๊ฒ ํจ๊ป ์ํ ๋ ๊ฐ์ฒด๋ก ๊ทธ๋ฃนํํฉ๋๋ค.
- ์ค์ ๋ฉ์๋ ์ ๊ฑฐ(Remove Setting Method): ํ๋๊ฐ ์์ฑ ์์๋ง ์ด๊ธฐํ๋๊ณ ์์ ๋์ด์๋ ์ ๋๋ ๊ฒฝ์ฐ ์ธํฐ(setter)๋ฅผ ํผํฉ๋๋ค.
- ๋ฉ์๋ ์จ๊ธฐ๊ธฐ(Hide Method): ๋ฉ์๋๊ฐ ๋จ์ผ ํด๋์ค ๋ด์์๋ง ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ ๊ฐ์์ฑ์ ์ค์ ๋๋ค.
- ์์ฑ์๋ฅผ ํฉํ ๋ฆฌ ๋ฉ์๋๋ก ๋ฐ๊พธ๊ธฐ(Replace Constructor with Factory Method): ์์ฑ์๋ณด๋ค ๋ ์ค๋ช ์ ์ธ ๋์์ ๋๋ค.
- ์์ธ๋ฅผ ํ ์คํธ๋ก ๋ฐ๊พธ๊ธฐ(Replace Exception with Test): ์์ธ๊ฐ ํ๋ฆ ์ ์ด๋ก ์ฌ์ฉ๋๊ณ ์๋ค๋ฉด ์ฑ๋ฅ ํฅ์์ ์ํด ์กฐ๊ฑด ๋ ผ๋ฆฌ๋ก ๋์ฒดํฉ๋๋ค.
์ผ๋ฐํ ๋ค๋ฃจ๊ธฐ
- ํ๋ ์ฌ๋ฆฌ๊ธฐ(Pull Up Field): ํ๋๋ฅผ ํ์ ํด๋์ค์์ ์์ ํด๋์ค๋ก ์ด๋ํฉ๋๋ค.
- ๋ฉ์๋ ์ฌ๋ฆฌ๊ธฐ(Pull Up Method): ๋ฉ์๋๋ฅผ ํ์ ํด๋์ค์์ ์์ ํด๋์ค๋ก ์ด๋ํฉ๋๋ค.
- ์์ฑ์ ๋ณธ๋ฌธ ์ฌ๋ฆฌ๊ธฐ(Pull Up Constructor Body): ์์ฑ์ ๋ณธ๋ฌธ์ ํ์ ํด๋์ค์์ ์์ ํด๋์ค๋ก ์ด๋ํฉ๋๋ค.
- ๋ฉ์๋ ๋ด๋ฆฌ๊ธฐ(Push Down Method): ๋ฉ์๋๋ฅผ ์์ ํด๋์ค์์ ํ์ ํด๋์ค๋ก ์ด๋ํฉ๋๋ค.
- ํ๋ ๋ด๋ฆฌ๊ธฐ(Push Down Field): ํ๋๋ฅผ ์์ ํด๋์ค์์ ํ์ ํด๋์ค๋ก ์ด๋ํฉ๋๋ค.
- ์ธํฐํ์ด์ค ์ถ์ถ(Extract Interface): ํด๋์ค์ public ๋ฉ์๋๋ก๋ถํฐ ์ธํฐํ์ด์ค๋ฅผ ์์ฑํฉ๋๋ค.
- ์์ ํด๋์ค ์ถ์ถ(Extract Superclass): ๋ ํด๋์ค์ ๊ณตํต ๊ธฐ๋ฅ์ ์๋ก์ด ์์ ํด๋์ค๋ก ์ด๋ํฉ๋๋ค.
- ๊ณ์ธต ๊ตฌ์กฐ ์ถ์(Collapse Hierarchy): ์์ ํด๋์ค์ ํ์ ํด๋์ค๋ฅผ ๋จ์ผ ํด๋์ค๋ก ๊ฒฐํฉํฉ๋๋ค.
- ํ ํ๋ฆฟ ๋ฉ์๋ ํ์ฑ(Form Template Method): ์๊ณ ๋ฆฌ์ฆ์ ๋จ๊ณ๋ฅผ ์ ์ํ๋ ํ ํ๋ฆฟ ๋ฉ์๋๋ฅผ ์์ ํด๋์ค์ ์์ฑํ์ฌ ํ์ ํด๋์ค๊ฐ ํน์ ๋จ๊ณ๋ฅผ ์ฌ์ ์ํ ์ ์๋๋ก ํฉ๋๋ค.
- ์์์ ์์์ผ๋ก ๋ฐ๊พธ๊ธฐ(Replace Inheritance with Delegation): ๊ธฐ๋ฅ์ ์์ํ๋ ๋์ , ํด๋น ๊ธฐ๋ฅ์ ์ฐธ์กฐํ๋ ํ๋๋ฅผ ํด๋์ค์ ์์ฑํฉ๋๋ค.
- ์์์ ์์์ผ๋ก ๋ฐ๊พธ๊ธฐ(Replace Delegation with Inheritance): ์์์ด ๋๋ฌด ๋ณต์กํ ๋ ์์์ผ๋ก ์ ํํฉ๋๋ค.
์ด๊ฒ๋ค์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ง์ ๋ฆฌํฉํ ๋ง ๊ธฐ๋ฒ ์ค ๋ช ๊ฐ์ง ์์ ๋ถ๊ณผํฉ๋๋ค. ์ด๋ค ๊ธฐ๋ฒ์ ์ฌ์ฉํ ์ง๋ ํน์ ์ฝ๋ ์ค๋ฉ๊ณผ ์ํ๋ ๊ฒฐ๊ณผ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
์์: ๊ธ๋ก๋ฒ ์ํ์์ ์ฌ์ฉํ๋ Java ์ ํ๋ฆฌ์ผ์ด์ ์ ๋๊ท๋ชจ ๋ฉ์๋๊ฐ ์ด์์จ์ ๊ณ์ฐํฉ๋๋ค. ๋ฉ์๋ ์ถ์ถ(Extract Method)์ ์ ์ฉํ์ฌ ๋ ์๊ณ ์ง์ค๋ ๋ฉ์๋๋ฅผ ๋ง๋ค๋ฉด ๊ฐ๋ ์ฑ์ด ํฅ์๋๊ณ ๋ฉ์๋์ ๋ค๋ฅธ ๋ถ๋ถ์ ์ํฅ์ ์ฃผ์ง ์๊ณ ์ด์์จ ๊ณ์ฐ ๋ก์ง์ ๋ ์ฝ๊ฒ ์ ๋ฐ์ดํธํ ์ ์์ต๋๋ค.
๋ฆฌํฉํ ๋ง ๊ณผ์
๋ฆฌํฉํ ๋ง์ ์ํ์ ์ต์ํํ๊ณ ์ฑ๊ณต ๊ฐ๋ฅ์ฑ์ ๊ทน๋ํํ๊ธฐ ์ํด ์ฒด๊ณ์ ์ผ๋ก ์ ๊ทผํด์ผ ํฉ๋๋ค. ๋ค์์ ๊ถ์ฅ๋๋ ๊ณผ์ ์ ๋๋ค:
- ๋ฆฌํฉํ ๋ง ๋์ ์๋ณ: ์์์ ์ธ๊ธํ ๊ธฐ์ค์ ์ฌ์ฉํ์ฌ ๋ฆฌํฉํ ๋ง์ผ๋ก ๊ฐ์ฅ ํฐ ์ด์ ์ ์ป์ ์ ์๋ ์ฝ๋ ์์ญ์ ์๋ณํฉ๋๋ค.
- ํ ์คํธ ์์ฑ: ๋ณ๊ฒฝ์ ํ๊ธฐ ์ ์ ์ฝ๋์ ๊ธฐ์กด ๋์์ ๊ฒ์ฆํ๊ธฐ ์ํด ์๋ํ๋ ํ ์คํธ๋ฅผ ์์ฑํฉ๋๋ค. ์ด๋ ๋ฆฌํฉํ ๋ง์ด ํ๊ท๋ฅผ ์ ๋ฐํ์ง ์๋๋ก ๋ณด์ฅํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. JUnit(Java), pytest(Python) ๋๋ Jest(JavaScript)์ ๊ฐ์ ๋๊ตฌ๋ฅผ ๋จ์ ํ ์คํธ ์์ฑ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์ ์ง์ ์ผ๋ก ๋ฆฌํฉํ ๋ง: ์๊ณ ์ ์ง์ ์ธ ๋ณ๊ฒฝ์ ํ๊ณ ๊ฐ ๋ณ๊ฒฝ ํ ํ ์คํธ๋ฅผ ์คํํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ฐ์ํ๋ ๋ชจ๋ ์ค๋ฅ๋ฅผ ๋ ์ฝ๊ฒ ์๋ณํ๊ณ ์์ ํ ์ ์์ต๋๋ค.
- ์์ฃผ ์ปค๋ฐ: ๋ณ๊ฒฝ ์ฌํญ์ ๋ฒ์ ๊ด๋ฆฌ์ ์์ฃผ ์ปค๋ฐํฉ๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ ๋ ์ด์ ๋ฒ์ ์ผ๋ก ์ฝ๊ฒ ๋๋๋ฆด ์ ์์ต๋๋ค.
- ์ฝ๋ ๋ฆฌ๋ทฐ: ๋ค๋ฅธ ๊ฐ๋ฐ์์๊ฒ ์ฝ๋๋ฅผ ๋ฆฌ๋ทฐ ๋ฐ์ต๋๋ค. ์ด๋ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ์๋ณํ๊ณ ๋ฆฌํฉํ ๋ง์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ํ๋์๋์ง ํ์ธํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ์ฑ๋ฅ ๋ชจ๋ํฐ๋ง: ๋ฆฌํฉํ ๋ง ํ ์์คํ ์ ์ฑ๋ฅ์ ๋ชจ๋ํฐ๋งํ์ฌ ๋ณ๊ฒฝ ์ฌํญ์ด ์ฑ๋ฅ ํ๊ท๋ฅผ ์ ๋ฐํ์ง ์์๋์ง ํ์ธํฉ๋๋ค.
์์: ๊ธ๋ก๋ฒ ์ ์์๊ฑฐ๋ ํ๋ซํผ์ Python ๋ชจ๋์ ๋ฆฌํฉํ ๋งํ๋ ํ์ `pytest`๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ์กด ๊ธฐ๋ฅ์ ๋ํ ๋จ์ ํ ์คํธ๋ฅผ ๋ง๋ญ๋๋ค. ๊ทธ๋ฐ ๋ค์ ํด๋์ค ์ถ์ถ(Extract Class) ๋ฆฌํฉํ ๋ง์ ์ ์ฉํ์ฌ ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํ๊ณ ๋ชจ๋์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ ํฉ๋๋ค. ๊ฐ ์์ ๋ณ๊ฒฝ ํ, ๊ทธ๋ค์ ๊ธฐ๋ฅ์ด ๋ณ๊ฒฝ๋์ง ์์์์ ํ์ธํ๊ธฐ ์ํด ํ ์คํธ๋ฅผ ์คํํฉ๋๋ค.
๋ ๊ฑฐ์ ์ฝ๋์ ํ ์คํธ๋ฅผ ๋์ ํ๋ ์ ๋ต
๋ง์ดํด ํ๋์ค๊ฐ ์ ์ ํ ์ธ๊ธํ๋ฏ์ด, ๋ ๊ฑฐ์ ์ฝ๋๋ ํ ์คํธ๊ฐ ์๋ ์ฝ๋์ ๋๋ค. ๊ธฐ์กด ์ฝ๋๋ฒ ์ด์ค์ ํ ์คํธ๋ฅผ ๋์ ํ๋ ๊ฒ์ ๊ฑฐ๋ํ ์์ ์ฒ๋ผ ๋๊ปด์ง ์ ์์ง๋ง, ์์ ํ ๋ฆฌํฉํ ๋ง์ ์ํด ํ์์ ์ ๋๋ค. ์ด ์์ ์ ์ ๊ทผํ๋ ๋ช ๊ฐ์ง ์ ๋ต์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
ํน์ฑ ํ ์คํธ (์ผ๋ช ๊ณจ๋ ๋ง์คํฐ ํ ์คํธ)
์ดํดํ๊ธฐ ์ด๋ ค์ด ์ฝ๋๋ฅผ ๋ค๋ฃฐ ๋, ํน์ฑ ํ ์คํธ๋ ๋ณ๊ฒฝ์ ์์ํ๊ธฐ ์ ์ ๊ธฐ์กด ๋์์ ํฌ์ฐฉํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ์์ด๋์ด๋ ์ฃผ์ด์ง ์ ๋ ฅ ์งํฉ์ ๋ํ ์ฝ๋์ ํ์ฌ ์ถ๋ ฅ์ ๋จ์ธํ๋ ํ ์คํธ๋ฅผ ์์ฑํ๋ ๊ฒ์ ๋๋ค. ์ด ํ ์คํธ๋ค์ ๋ฐ๋์ ์ ํ์ฑ์ ๊ฒ์ฆํ๋ ๊ฒ์ด ์๋๋ผ, ์ฝ๋๊ฐ *ํ์ฌ* ๋ฌด์์ ํ๋์ง๋ฅผ ๋ฌธ์ํํ๋ ๊ฒ์ ๋๋ค.
๋จ๊ณ:
- ํน์ฑํํ๋ ค๋ ์ฝ๋ ๋จ์(์: ํจ์ ๋๋ ๋ฉ์๋)๋ฅผ ์๋ณํฉ๋๋ค.
- ์ผ๋ฐ์ ์ธ ์๋๋ฆฌ์ค์ ์ฃ์ง ์ผ์ด์ค ์๋๋ฆฌ์ค์ ๋ฒ์๋ฅผ ๋ํ๋ด๋ ์ ๋ ฅ ๊ฐ ์งํฉ์ ๋ง๋ญ๋๋ค.
- ํด๋น ์ ๋ ฅ์ผ๋ก ์ฝ๋๋ฅผ ์คํํ๊ณ ๊ฒฐ๊ณผ ์ถ๋ ฅ์ ์บก์ฒํฉ๋๋ค.
- ์ฝ๋๊ฐ ํด๋น ์ ๋ ฅ์ ๋ํด ์ ํํ ๊ทธ ์ถ๋ ฅ์ ์์ฑํ๋์ง ๋จ์ธํ๋ ํ ์คํธ๋ฅผ ์์ฑํฉ๋๋ค.
์ฃผ์: ํน์ฑ ํ ์คํธ๋ ๊ธฐ๋ณธ ๋ก์ง์ด ๋ณต์กํ๊ฑฐ๋ ๋ฐ์ดํฐ์ ์์กด์ ์ธ ๊ฒฝ์ฐ ๊นจ์ง๊ธฐ ์ฌ์ธ ์ ์์ต๋๋ค. ๋์ค์ ์ฝ๋์ ๋์์ ๋ณ๊ฒฝํด์ผ ํ ๊ฒฝ์ฐ ์ด๋ฅผ ์ ๋ฐ์ดํธํ ์ค๋น๋ฅผ ํด์ผ ํฉ๋๋ค.
์คํ๋ผ์ฐํธ ๋ฉ์๋์ ์คํ๋ผ์ฐํธ ํด๋์ค
๋ง์ดํด ํ๋์ค๊ฐ ์ค๋ช ํ ์ด ๊ธฐ๋ฒ๋ค์ ๊ธฐ์กด ์ฝ๋๋ฅผ ๊นจ๋จ๋ฆด ์ํ์ ์ต์ํํ๋ฉด์ ๋ ๊ฑฐ์ ์์คํ ์ ์๋ก์ด ๊ธฐ๋ฅ์ ๋์ ํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค.
์คํ๋ผ์ฐํธ ๋ฉ์๋(Sprout Method): ๊ธฐ์กด ๋ฉ์๋๋ฅผ ์์ ํด์ผ ํ๋ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํด์ผ ํ ๋, ์๋ก์ด ๋ก์ง์ ํฌํจํ๋ ์ ๋ฉ์๋๋ฅผ ๋ง๋ญ๋๋ค. ๊ทธ๋ฐ ๋ค์ ๊ธฐ์กด ๋ฉ์๋์์ ์ด ์ ๋ฉ์๋๋ฅผ ํธ์ถํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ ์ฝ๋๋ฅผ ๊ฒฉ๋ฆฌํ๊ณ ๋ ๋ฆฝ์ ์ผ๋ก ํ ์คํธํ ์ ์์ต๋๋ค.
์คํ๋ผ์ฐํธ ํด๋์ค(Sprout Class): ์คํ๋ผ์ฐํธ ๋ฉ์๋์ ์ ์ฌํ์ง๋ง ํด๋์ค์ ๋ํ ๊ฒ์ ๋๋ค. ์๋ก์ด ๊ธฐ๋ฅ์ ๊ตฌํํ๋ ์ ํด๋์ค๋ฅผ ๋ง๋ ๋ค์ ๊ธฐ์กด ์์คํ ์ ํตํฉํฉ๋๋ค.
์๋๋ฐ์ฑ
์๋๋ฐ์ฑ์ ๋ ๊ฑฐ์ ์ฝ๋๋ฅผ ์์คํ ์ ๋๋จธ์ง ๋ถ๋ถ๊ณผ ๊ฒฉ๋ฆฌํ์ฌ ์ ์ด๋ ํ๊ฒฝ์์ ํ ์คํธํ ์ ์๋๋ก ํ๋ ๊ฒ์ ๋๋ค. ์ด๋ ์์กด์ฑ์ ๋ํ ๋ชจ์(mock) ๊ฐ์ฒด๋ ์คํ (stub)์ ๋ง๋ค๊ฑฐ๋ ๊ฐ์ ๋จธ์ ์์ ์ฝ๋๋ฅผ ์คํํ์ฌ ์ํํ ์ ์์ต๋๋ค.
๋ฏธ์นด๋ ๋ฉ์๋
๋ฏธ์นด๋ ๋ฉ์๋๋ ๋ณต์กํ ๋ฆฌํฉํ ๋ง ์์ ์ ํด๊ฒฐํ๊ธฐ ์ํ ์๊ฐ์ ๋ฌธ์ ํด๊ฒฐ ์ ๊ทผ๋ฒ์ ๋๋ค. ์ด๋ ์ฝ๋์ ๋ค๋ฅธ ๋ถ๋ถ ๊ฐ์ ์์กด์ฑ์ ๋ํ๋ด๋ ๋ค์ด์ด๊ทธ๋จ์ ๋ง๋ ๋ค์ ์์คํ ์ ๋ค๋ฅธ ๋ถ๋ถ์ ๋ฏธ์น๋ ์ํฅ์ ์ต์ํํ๋ ๋ฐฉ์์ผ๋ก ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ํต์ฌ ์์น์ ๋ณ๊ฒฝ์ "์๋"ํ๊ณ ๋ฌด์์ด ๊นจ์ง๋์ง ๋ณด๋ ๊ฒ์ ๋๋ค. ๊นจ์ง๋ฉด ๋ง์ง๋ง์ผ๋ก ์๋ํ๋ ์ํ๋ก ๋๋๋ฆฌ๊ณ ๋ฌธ์ ๋ฅผ ๊ธฐ๋กํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์๋ ๋ณ๊ฒฝ์ ๋ค์ ์๋ํ๊ธฐ ์ ์ ํด๋น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค.
๋ฆฌํฉํ ๋ง์ ์ํ ๋๊ตฌ
๋ฐ๋ณต์ ์ธ ์์ ์ ์๋ํํ๊ณ ๋ชจ๋ฒ ์ฌ๋ก์ ๋ํ ์ง์นจ์ ์ ๊ณตํ๋ ์ฌ๋ฌ ๋๊ตฌ๊ฐ ๋ฆฌํฉํ ๋ง์ ์ง์ํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋๊ตฌ๋ ์ข ์ข ํตํฉ ๊ฐ๋ฐ ํ๊ฒฝ(IDE)์ ํตํฉ๋ฉ๋๋ค:
- IDE (์: IntelliJ IDEA, Eclipse, Visual Studio): IDE๋ ๋ณ์ ์ด๋ฆ ๋ฐ๊พธ๊ธฐ, ๋ฉ์๋ ์ถ์ถ, ํด๋์ค ์ด๋๊ณผ ๊ฐ์ ์์ ์ ์๋์ผ๋ก ์ํํ ์ ์๋ ๋ด์ฅ ๋ฆฌํฉํ ๋ง ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ์ ์ ๋ถ์ ๋๊ตฌ (์: SonarQube, Checkstyle, PMD): ์ด ๋๊ตฌ๋ค์ ์ฝ๋ ์ค๋ฉ, ์ ์ฌ์ ๋ฒ๊ทธ ๋ฐ ๋ณด์ ์ทจ์ฝ์ ์ ์ํด ์ฝ๋๋ฅผ ๋ถ์ํฉ๋๋ค. ๋ฆฌํฉํ ๋ง์ผ๋ก ์ด์ ์ ์ป์ ์ ์๋ ์ฝ๋ ์์ญ์ ์๋ณํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ์ฝ๋ ์ปค๋ฒ๋ฆฌ์ง ๋๊ตฌ (์: JaCoCo, Cobertura): ์ด ๋๊ตฌ๋ค์ ํ ์คํธ๋ก ์ปค๋ฒ๋๋ ์ฝ๋์ ๋ฐฑ๋ถ์จ์ ์ธก์ ํฉ๋๋ค. ์ ์ ํ๊ฒ ํ ์คํธ๋์ง ์์ ์ฝ๋ ์์ญ์ ์๋ณํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ๋ฆฌํฉํ ๋ง ๋ธ๋ผ์ฐ์ (์: Smalltalk Refactoring Browser): ๋ ํฐ ๊ตฌ์กฐ ์กฐ์ ํ๋์ ์ง์ํ๋ ํน์ ๋๊ตฌ์ ๋๋ค.
์์: ๊ธ๋ก๋ฒ ๋ณดํ ํ์ฌ๋ฅผ ์ํ C# ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๋ ํ์ Visual Studio์ ๋ด์ฅ ๋ฆฌํฉํ ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ณ์ ์ด๋ฆ์ ์๋์ผ๋ก ๋ฐ๊พธ๊ณ ๋ฉ์๋๋ฅผ ์ถ์ถํฉ๋๋ค. ๋ํ SonarQube๋ฅผ ์ฌ์ฉํ์ฌ ์ฝ๋ ์ค๋ฉ๊ณผ ์ ์ฌ์ ์ทจ์ฝ์ ์ ์๋ณํฉ๋๋ค.
๋์ ๊ณผ์ ์ ์ํ
๋ ๊ฑฐ์ ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํ๋ ๊ฒ์ ๋์ ๊ณผ์ ์ ์ํ์ด ์๋ ๊ฒ์ด ์๋๋๋ค:
- ํ๊ท ๋์ : ๊ฐ์ฅ ํฐ ์ํ์ ๋ฆฌํฉํ ๋ง ๊ณผ์ ์์ ๋ฒ๊ทธ๋ฅผ ๋์ ํ๋ ๊ฒ์ ๋๋ค. ์ด๋ ํฌ๊ด์ ์ธ ํ ์คํธ๋ฅผ ์์ฑํ๊ณ ์ ์ง์ ์ผ๋ก ๋ฆฌํฉํ ๋งํจ์ผ๋ก์จ ์ํ๋ ์ ์์ต๋๋ค.
- ๋๋ฉ์ธ ์ง์ ๋ถ์กฑ: ์๋ ๊ฐ๋ฐ์๋ค์ด ๋ ๋ฌ๋ค๋ฉด ์ฝ๋์ ๊ทธ ๋ชฉ์ ์ ์ดํดํ๊ธฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ์ด๋ ์๋ชป๋ ๋ฆฌํฉํ ๋ง ๊ฒฐ์ ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
- ๊ฐํ ๊ฒฐํฉ๋: ๊ฐํ๊ฒ ๊ฒฐํฉ๋ ์ฝ๋๋ ๋ฆฌํฉํ ๋งํ๊ธฐ ๋ ์ด๋ ต์ต๋๋ค. ์ฝ๋์ ํ ๋ถ๋ถ์ ๋ํ ๋ณ๊ฒฝ์ด ์ฝ๋์ ๋ค๋ฅธ ๋ถ๋ถ์ ์๋ํ์ง ์์ ๊ฒฐ๊ณผ๋ฅผ ์ด๋ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
- ์๊ฐ ์ ์ฝ: ๋ฆฌํฉํ ๋ง์ ์๊ฐ์ด ๊ฑธ๋ฆด ์ ์์ผ๋ฉฐ, ์๋ก์ด ๊ธฐ๋ฅ ์ ๊ณต์ ์ง์คํ๋ ์ดํด๊ด๊ณ์๋ค์๊ฒ ํฌ์๋ฅผ ์ ๋นํํ๊ธฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค.
- ๋ณํ์ ๋ํ ์ ํญ: ์ผ๋ถ ๊ฐ๋ฐ์๋ ํนํ ๊ด๋ จ๋ ๊ธฐ์ ์ ์ต์ํ์ง ์์ ๊ฒฝ์ฐ ๋ฆฌํฉํ ๋ง์ ์ ํญํ ์ ์์ต๋๋ค.
๋ชจ๋ฒ ์ฌ๋ก
๋ ๊ฑฐ์ ์ฝ๋ ๋ฆฌํฉํ ๋ง๊ณผ ๊ด๋ จ๋ ๋์ ๊ณผ์ ์ ์ํ์ ์ํํ๋ ค๋ฉด ๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด์ญ์์ค:
- ๋์ ์ป๊ธฐ: ์ดํด๊ด๊ณ์๋ค์ด ๋ฆฌํฉํ ๋ง์ ์ด์ ์ ์ดํดํ๊ณ ํ์ํ ์๊ฐ๊ณผ ์์์ ํฌ์ํ ์ํฅ์ด ์๋์ง ํ์ธํ์ญ์์ค.
- ์๊ฒ ์์ํ๊ธฐ: ์๊ณ ๊ฒฉ๋ฆฌ๋ ์ฝ๋ ์กฐ๊ฐ์ ๋ฆฌํฉํ ๋งํ๋ ๊ฒ์ผ๋ก ์์ํ์ญ์์ค. ์ด๋ ์์ ๊ฐ์ ์๊ณ ๋ฆฌํฉํ ๋ง์ ๊ฐ์น๋ฅผ ์ ์ฆํ๋ ๋ฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
- ์ ์ง์ ์ผ๋ก ๋ฆฌํฉํ ๋ง: ์๊ณ ์ ์ง์ ์ธ ๋ณ๊ฒฝ์ ํ๊ณ ์์ฃผ ํ ์คํธํ์ญ์์ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ฐ์ํ๋ ๋ชจ๋ ์ค๋ฅ๋ฅผ ๋ ์ฝ๊ฒ ์๋ณํ๊ณ ์์ ํ ์ ์์ต๋๋ค.
- ํ ์คํธ ์๋ํ: ๋ฆฌํฉํ ๋ง ์ ํ์ ์ฝ๋์ ๋์์ ๊ฒ์ฆํ๊ธฐ ์ํด ํฌ๊ด์ ์ธ ์๋ํ๋ ํ ์คํธ๋ฅผ ์์ฑํ์ญ์์ค.
- ๋ฆฌํฉํ ๋ง ๋๊ตฌ ์ฌ์ฉ: IDE๋ ๋ค๋ฅธ ๋๊ตฌ์์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฆฌํฉํ ๋ง ๋๊ตฌ๋ฅผ ํ์ฉํ์ฌ ๋ฐ๋ณต์ ์ธ ์์ ์ ์๋ํํ๊ณ ๋ชจ๋ฒ ์ฌ๋ก์ ๋ํ ์ง์นจ์ ์ ๊ณต๋ฐ์ผ์ญ์์ค.
- ๋ณ๊ฒฝ ์ฌํญ ๋ฌธ์ํ: ๋ฆฌํฉํ ๋ง ์ค์ ๋ณ๊ฒฝํ ๋ด์ฉ์ ๋ฌธ์ํํ์ญ์์ค. ์ด๋ ๋ค๋ฅธ ๊ฐ๋ฐ์๋ค์ด ์ฝ๋๋ฅผ ์ดํดํ๊ณ ๋ฏธ๋์ ํ๊ท๋ฅผ ๋์ ํ๋ ๊ฒ์ ํผํ๋ ๋ฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
- ์ง์์ ์ธ ๋ฆฌํฉํ ๋ง: ๋ฆฌํฉํ ๋ง์ ์ผํ์ฑ ์ด๋ฒคํธ๊ฐ ์๋ ๊ฐ๋ฐ ๊ณผ์ ์ ์ง์์ ์ธ ๋ถ๋ถ์ผ๋ก ๋ง๋์ญ์์ค. ์ด๋ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๊นจ๋ํ๊ณ ์ ์ง๋ณด์ ๊ฐ๋ฅํ๊ฒ ์ ์งํ๋ ๋ฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
๊ฒฐ๋ก
๋ ๊ฑฐ์ ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํ๋ ๊ฒ์ ๋์ ์ ์ด์ง๋ง ๋ณด๋ ์๋ ๋ ธ๋ ฅ์ ๋๋ค. ์ด ๊ฐ์ด๋์์ ์ค๋ช ํ ์ ๋ต๊ณผ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด ์ผ์๋ฅผ ๊ธธ๋ค์ด๊ณ ๋ ๊ฑฐ์ ์์คํ ์ ์ ์ง๋ณด์ ๊ฐ๋ฅํ๊ณ ์ ๋ขฐํ ์ ์์ผ๋ฉฐ ๊ณ ์ฑ๋ฅ ์์ฐ์ผ๋ก ๋ณํํ ์ ์์ต๋๋ค. ๋ฆฌํฉํ ๋ง์ ์ฒด๊ณ์ ์ผ๋ก ์ ๊ทผํ๊ณ , ์์ฃผ ํ ์คํธํ๋ฉฐ, ํ๊ณผ ํจ๊ณผ์ ์ผ๋ก ์ํตํ๋ ๊ฒ์ ๊ธฐ์ตํ์ญ์์ค. ์ ์คํ ๊ณํ๊ณผ ์คํ์ ํตํด ๋ ๊ฑฐ์ ์ฝ๋ ๋ด์ ์จ๊ฒจ์ง ์ ์ฌ๋ ฅ์ ๋ฐํํ๊ณ ๋ฏธ๋ ํ์ ์ ์ํ ๊ธธ์ ์ด ์ ์์ต๋๋ค.