[Book] Clean Code: 11 ์์คํ
ํด๋ฆฐ ์ฝ๋
์ ์์ผ ์ํํธ์จ์ด ์ฅ์ธ ์ ์
์ ์: ๋ก๋ฒํธ C. ๋งํด
11. ์์คํ
โ๋ณต์ก์ฑ์ ์ฃฝ์์ด๋ค. ๊ฐ๋ฐ์์๊ฒ์ ์๊ธฐ๋ฅผ ์์๊ฐ๋ฉฐ, ์ ํ์ ๊ณํํ๊ณ ์ ์ํ๊ณ ํ ์คํธํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ ๋ค.โ
- Ray Ozzie, MS CTO
๋์๋ฅผ ์ธ์ด๋ค๋ฉด?
๋์๊ฐ ๋์๊ฐ๋ ์ด์ ์ค ํ๋๋ ์ ์ ํ ์ถ์ํ์ ๋ชจ๋ํ ๋๋ฌธ์ด๋ค. ๊ทธ๋์ ํฐ ๊ทธ๋ฆผ์ ์ดํดํ์ง ๋ชปํ ์ง๋ผ๋ ๊ฐ์ธ๊ณผ ๊ฐ์ธ์ด ๊ด๋ฆฌํ๋ โ๊ตฌ์ฑ์์โ๋ ํจ์จ์ ์ผ๋ก ๋์๊ฐ๋ค.
ํํ ์ํํธ์จ์ด ํ๋ ๋์์ฒ๋ผ ๊ตฌ์ฑํ๋ค. ๊ทธ๋ฐ๋ฐ ๋ง์ ํ์ด ์ ์ํ๋ ์์คํ ์ ๋น์ทํ ์์ค์ผ๋ก ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํ๊ฑฐ๋ ์ถ์ํ๋ฅผ ์ด๋ค๋ด์ง ๋ชปํ๋ค. ๊นจ๋ํ ์ฝ๋๋ฅผ ๊ตฌํํ๋ฉด ๋ฎ์ ์ถ์ํ ์์ค์์ ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํ๊ธฐ ์ฌ์์ง๋ค. ์ด ์ฅ์์๋ ๋์ ์ถ์ํ ์์ค, ์ฆ ์์คํ ์์ค์์๋ ๊นจ๋ํจ์ ์ ์งํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณธ๋ค.
์์คํ ์ ์๊ณผ ์์คํ ์ฌ์ฉ์ ๋ถ๋ฆฌํ๋ผ
์ ์construction
๊ณผ ์ฌ์ฉuse
๋ ์์ฃผ ๋ค๋ฅด๋ค.
์ํํธ์จ์ด ์์คํ
์ (์ ํ๋ฆฌ์ผ์ด์
๊ฐ์ฒด๋ฅผ ์ ์ํ๊ณ ์์กด์ฑ์ ์๋ก โ์ฐ๊ฒฐโํ๋) ์ค๋น ๊ณผ์ ๊ณผ (์ค๋น ๊ณผ์ ์ดํ์ ์ด์ด์ง๋) ๋ฐํ์ ๋ก์ง์ ๋ถ๋ฆฌํด์ผ ํ๋ค.
์์ ๋จ๊ณ๋ ๋ชจ๋ ์ ํ๋ฆฌ์ผ์ด์
์ด ํ์ด์ผ ํ ๊ด์ฌ์ฌconcern
๋ค. ์ด๊ฒ์ด ์ด ์ฅ์์ ์ฐ๋ฆฌ๊ฐ ๋งจ ์ฒ์ ์ดํด๋ณผ ๊ด์ฌ์ฌ๋ค.
๊ด์ฌ์ฌ ๋ถ๋ฆฌ๋ ์ฐ๋ฆฌ ๋ถ์ผ์์ ๊ฐ์ฅ ์ค๋๋๊ณ ๊ฐ์ฅ ์ค์ํ ์ค๊ณ ๊ธฐ๋ฒ ์ค ํ๋๋ค.
๋ถํํ๋ ๋๋ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ ๋จ๊ณ๋ผ๋ ๊ด์ฌ์ฌ๋ฅผ ๋ถ๋ฆฌํ์ง ์๋๋ค.
์ฒด๊ณ์ ์ด๊ณ ํํํ ์์คํ ์ ๋ง๋ค๊ณ ์ถ๋ค๋ฉด ํํ ์ฐ๋ ์ข์ค๋ฝ๊ณ ์์ฌ์ด ๊ธฐ๋ฒ์ผ๋ก ๋ชจ๋์ฑ์ ๊นจ์๋ ์ ๋๋ก ์๋๋ค.
Main ๋ถ๋ฆฌ
์์คํ ์์ฑ๊ณผ ์ฌ์ฉ์ ๋ถ๋ฆฌํ๋ ํ ๊ฐ์ง ๋ฐฉ๋ฒ ์์ฑ๊ณผ ๊ด๋ จํ ์ฝ๋๋ ๋ชจ๋ main์ด๋ main์ด ํธ์ถํ๋ ๋ชจ๋๋ก ์ฎ๊ธฐ๊ณ , ๋๋จธ์ง ์์คํ ์ ๋ชจ๋ ๊ฐ์ฒด๊ฐ ์์ฑ๋์๊ณ ๋ชจ๋ ์์กด์ฑ์ด ์ฐ๊ฒฐ๋์๋ค๊ณ ๊ฐ์ ํ๋ค.
ํฉํ ๋ฆฌ
๋๋ก๋ ๊ฐ์ฒด๊ฐ ์์ฑ๋๋ ์์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๊ฒฐ์ ํ ํ์๋ ์๊ธด๋ค.
์์กด์ฑ ์ฃผ์
์ฌ์ฉ๊ณผ ์ ์์ ๋ถ๋ฆฌํ๋ ๊ฐ๋ ฅํ ๋ฉ์ปค๋์ฆ ํ๋๊ฐ ์์กด์ฑ ์ฃผ์
Dependency Injection
์ด๋ค. ์์กด์ฑ ์ฃผ์
์ ์ ์ด ์ญ์ Inversion of Control
๊ธฐ๋ฒ์ ์์กด์ฑ ๊ด๋ฆฌ์ ์ ์ฉํ ๋ฉ์ปค๋์ฆ์ด๋ค.
ํ์ฅ
์ฒ์๋ถํฐ ์ฌ๋ฐ๋ฅด๊ฒ ์์คํ
์ ๋ง๋ค ์ ์๋ค๋ ๋ฏฟ์์ ๋ฏธ์ ์ด๋ค. ๋์ ์ ์ฐ๋ฆฌ๋ ์ค๋ ์ฃผ์ด์ง ์ฌ์ฉ์ ์คํ ๋ฆฌ์ ๋ง์ถฐ ์์คํ
์ ๊ตฌํํด์ผ ํ๋ค. ๋ด์ผ์ ์๋ก์ด ์คํ ๋ฆฌ์ ๋ง์ถฐ ์์คํ
์ ์กฐ์ ํ๊ณ ํ์ฅํ๋ฉด ๋๋ค. ์ด๊ฒ์ด ๋ฐ๋ณต์ ์ด๊ณ ์ ์ง์ ์ธ ์ ์์ผ ๋ฐฉ์์ ํต์ฌ์ด๋ค. ํ
์คํธ ์ฃผ๋ ๊ฐ๋ฐ, ๋ฆฌํฉํฐ๋ง, ๊นจ๋ํ ์ฝ๋๋ ์ฝ๋ ์์ค์์ ์์คํ
์ ์กฐ์ ํ๊ณ ํ์ฅํ๊ธฐ ์ฝ๊ฒ ๋ง๋ ๋ค.
์ํํธ์จ์ด ์์คํ
์ ๋ฌผ๋ฆฌ์ ์ธ ์์คํ
๊ณผ ๋ค๋ฅด๋ค. ๊ด์ฌ์ฌ๋ฅผ ์ ์ ํ ๋ถ๋ฆฌํด ๊ด๋ฆฌ ํ๋ค๋ฉด ์ํํธ์จ์ด ์ํคํ
์ฒ๋ ์ ์ง์ ์ผ๋ก ๋ฐ์ ํ ์ ์๋ค.
ํก๋จ(cross-cutting) ๊ด์ฌ์ฌ
์๋ฐ ํ๋ก์
์์ ์๋ฐ AOP ํ๋ ์์ํฌ
AspectJ ๊ด์
ํ ์คํธ ์ฃผ๋ ์์คํ ์ํคํ ์ฒ ๊ตฌ์ถ
์์ฌ ๊ฒฐ์ ์ ์ต์ ํํ๋ผ
๋ช ๋ฐฑํ ๊ฐ์น๊ฐ ์์ ๋ ํ์ค์ ํ๋ช ํ๊ฒ ์ฌ์ฉํ๋ผ
ํ์ค์ ์ฌ์ฉํ๋ฉด ์์ด๋์ด์ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฌ์ฉํ๊ธฐ ์ฝ๊ณ , ์ ์ ํ ๊ฒฝํ์ ๊ฐ์ง ์ฌ๋์ ๊ตฌํ๊ธฐ ์ฌ์ฐ๋ฉฐ, ์ข์ ์์ด๋์ด๋ฅผ ์บก์ํํ๊ธฐ ์ฝ๊ณ , ์ปดํฌ๋ํธ๋ฅผ ์ฎ๊ธฐ ์ฝ๋ค. ํ์ง๋ง ๋๋ก๋ ํ์ค์ ๋ง๋๋ ์๊ฐ์ด ๋๋ฌด ์ค๋ ๊ฑธ๋ ค ์ ๊ณ๊ฐ ๊ธฐ๋ค๋ฆฌ์ง ๋ชปํ๋ค. ์ด๋ค ํ์ค์ ์๋ ํ์ค์ ์ ์ ํ ๋ชฉ์ ์ ์์ด๋ฒ๋ฆฌ๊ธฐ๋ ํ๋ค.
์์คํ ์ ๋๋ฉ์ธ ํนํ ์ธ์ด๊ฐ ํ์ํ๋ค
๋๋ฉ์ธ ํนํ ์ธ์ด(Domain-Specific Language, DSL)๋ฅผ ์ฌ์ฉํ๋ฉด ๊ณ ์ฐจ์ ์ ์ฑ
์์ ์ ์ฐจ์ ์ธ๋ถ์ฌํญ์ ์ด๋ฅด๊ธฐ๊น์ง ๋ชจ๋ ์ถ์ํ ์์ค๊ณผ ๋ชจ๋ ๋๋ฉ์ธ์ POJOPlain Old Java Object
๋ก ํํํ ์ ์๋ค.
๊ฒฐ๋ก
๊นจ๋ํ์ง ๋ชปํ ์ํคํ ์ฒ๋ ๋๋ฉ์ธ ๋ ผ๋ฆฌ๋ฅผ ํ๋ฆฌ๋ฉฐ ๊ธฐ๋ฏผ์ฑ์ ๋จ์ด๋จ๋ฆฐ๋ค. ๋๋ฉ์ธ ๋ ผ๋ฆฌ๊ฐ ํ๋ ค์ง๋ฉด ์ ํ ํ์ง์ด ๋จ์ด์ง๋ค. ์์คํ ์ ์ค๊ณํ๋ ๊ฐ๋ณ ๋ชจ๋์ ์ค๊ณํ๋ , ์ค์ ๋ก ๋์๊ฐ๋ ๊ฐ์ฅ ๋จ์ํ ์๋จ์ ์ฌ์ฉํด์ผ ํ๋ค๋ ์ฌ์ค์ ๋ช ์ฌํ์.