Cyclomatic Complexity๋ ์ ์ด ํ๋ฆ์ ๋ถ์ํ์ฌ ํ๋ก๊ทธ๋จ์ ๋ณต์กํ ํน์ฑ์ ์ธก์ ํ๋ ์ค์ํ ์ํํธ์จ์ด ์งํ์ ๋๋ค. ์ด๋ ์ํํธ์จ์ด ์์ง๋์ด๋ง์ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
์ด๋ ์ฝ๋์ ๋ณต์ก์ฑ์ ๋ํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํ๊ณ ์ ์ง ๊ด๋ฆฌ ๋ฐ ํ ์คํธ ์ฉ์ด์ฑ๊ณผ ๊ด๋ จ๋ ์ ์ฌ์ ๋ฌธ์ ๋ฅผ ์๋ณํ๋ ๋ฐ ๋์์ด ๋๋ฏ๋ก ํ๋ก๊ทธ๋๋จธ์๊ฒ ํนํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
CC๋ ๋ณธ์ง์ ์ผ๋ก ํ๋ก๊ทธ๋จ์ ์ ์ด ํ๋ฆ ๊ทธ๋ํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ณ์ฐ๋ฉ๋๋ค. ์ฌ๊ธฐ์ ๋ ธ๋๋ ๊ฐ๋ณ ๋ช ๋ น๋ฌธ์ ๋ํ๋ด๊ณ ์์ง์ ์๋ ๋ช ๋ น๋ฌธ ๊ฐ์ ์ ์ด ํ๋ฆ์ ๋ํ๋ ๋๋ค.
SMART TS XL
์ํ ๋ณต์ก์ฑ์ ๋ง์คํฐํ๊ณ , ์ฑ๋ฅ์ ์ต์ ํํ๊ณ , ์จ๊ฒจ์ง ๋ฒ๊ทธ๋ฅผ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
์์ธํ ์์๋ณด์ธ์โฆ์ํ ๋ณต์ก๋(CC) ์ดํด
์ํ ๋ณต์ก๋(CC)๋ ๋ฌด์์ ๋๊น?
์ํ ๋ณต์ก๋(CC)๋ ํ๋ก๊ทธ๋จ ์ ์ด ํ๋ฆ์ ๋ณต์ก๋๋ฅผ ์ธก์ ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ํํธ์จ์ด ๋ฉํธ๋ฆญ์ ๋๋ค. 1976๋ Thomas J. McCabe๊ฐ ๋์ ํ CC๋ ํจ์๋ ํ๋ก๊ทธ๋จ ๋ด์ ๋ ๋ฆฝ์ ์ธ ์คํ ๊ฒฝ๋ก ์๋ฅผ ์ ๋ํํฉ๋๋ค. ์กฐ๊ฑด๋ฌธ(if, else, switch) ๋ฐ ๋ฃจํ(for, while)์ ๊ฐ์ ๊ฐ ๊ฒฐ์ ์ง์ ์ ์ด ๋ณต์ก๋์ ๊ธฐ์ฌํฉ๋๋ค. ์ด ๋ฉํธ๋ฆญ์ ๊ฐ๋ฐ์๊ฐ ๊ฒฐํจ ๊ฐ๋ฅ์ฑ ๋ฐ ํ ์คํธ ๋ฐ ์ ์ง ๊ด๋ฆฌ์ ํ์ํ ๋ ธ๋ ฅ ์์ค๊ณผ ๊ฐ์ ์ฝ๋ ์กฐ๊ฐ๊ณผ ๊ด๋ จ๋ ์ ์ฌ์ ์ํ์ ์ดํดํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. CC ์ ์๊ฐ ๋์์๋ก ๋ ๋ง์ ํ ์คํธ ์ฌ๋ก๊ฐ ํ์ํ์ฌ ์ฝ๋๋ฅผ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ด๋ ต๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ์ต๋๋ค.
CC๋ฅผ ๊ณ์ฐํ๋ ๊ณต์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์ฌ๊ธฐ์ ๋ ์ ์ด ํ๋ฆ ๊ทธ๋ํ์์ ์์ง ์, ๋ ธ๋ ์, ์ฐ๊ฒฐ๋ ๊ตฌ์ฑ ์์ ์๋ฅผ ๋ํ๋ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก 10 ์ดํ์ CC ๊ฐ์ ๊ด๋ฆฌ ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. ์ด ์๊ณ๊ฐ์ ๋๋ ๊ฐ์ ๊ฐ๋ ์ฑ๊ณผ ํ ์คํธ ์ฉ์ด์ฑ์ ํฅ์์ํค๊ธฐ ์ํ ๋ฆฌํฉํ ๋ง์ด ํ์ํจ์ ์์ฌํฉ๋๋ค.
public void handleRequest(boolean isAdmin, boolean isUser, boolean isGuest) {
if (isAdmin) {
System.out.println("Admin Access Granted");
} else if (isUser) {
System.out.println("User Access Granted");
} else if (isGuest) {
System.out.println("Guest Access Limited");
} else {
System.out.println("Access Denied");
}
}
์ ์ฝ๋์๋ ์ฌ๋ฌ ๊ฐ์ ๊ฒฐ์ ์ง์ ์ด ์์ด ์ํ ๋ณต์ก๋๊ฐ 4๊ฐ ๋ฉ๋๋ค. ์ฆ, ์์ ํ ๊ฒฝ๋ก ๋ฒ์๋ฅผ ๋ณด์ฅํ๋ ค๋ฉด ์ต์ XNUMX๊ฐ์ ํ ์คํธ ์ฌ๋ก๊ฐ ํ์ํฉ๋๋ค.
์ํ ๋ณต์ก๋๊ฐ ์ค์ํ ์ด์
์ํ ๋ณต์ก๋(CC)๋ ์ํํธ์จ์ด ํ์ง, ์ ์ง ๊ด๋ฆฌ์ฑ ๋ฐ ํ ์คํธ ๋ ธ๋ ฅ์ ์ง์ ์ ์ธ ์ํฅ์ ๋ฏธ์น๊ธฐ ๋๋ฌธ์ ์ค์ํฉ๋๋ค. ๋์ CC ๊ฐ์ ์ดํดํ๊ธฐ ์ด๋ ต๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฌ์ฐ๋ฉฐ ์ฒ ์ ํ ํ ์คํธํ๊ธฐ ์ด๋ ค์ด ๋ณต์กํ ์ฝ๋๋ฅผ ๋ํ๋ ๋๋ค. ๋ฐ๋ฉด์ ๋ณต์ก๋๊ฐ ๋ฎ์์๋ก ์ ์ง ๊ด๋ฆฌ๊ฐ ๋ ์ฌ์ด ์ฝ๋๋ฅผ ์ด์งํ๊ณ ๊ธฐ์ ๋ถ์ฑ๋ฅผ ์ค์ด๋ฉฐ ์ ๋ฐ์ ์ธ ์์ ์ฑ์ ํฅ์์ํต๋๋ค. CC๋ฅผ ์ธก์ ํ๋ฉด ๊ฐ๋ฐํ์ด ์ฝ๋๋ฒ ์ด์ค์ ์์ ์ฑ์ ํ๊ฐํ์ฌ ์๋ก์ด ๊ธฐ๋ฅ์ด ์ถ๊ฐ๋ ๋ ์ํํธ์จ์ด๊ฐ ๊ฒฌ๊ณ ํ๊ฒ ์ ์ง๋๋๋ก ํ ์ ์์ต๋๋ค.
๋ํ CC๋ ํ ์คํธ ๊ณํ์์ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ์ ์ฒด ๋ธ๋์น ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๋ฌ์ฑํ๋ ๋ฐ ํ์ํ ์ต์ ํ ์คํธ ์ฌ๋ก ์๋ฅผ ๊ฒฐ์ ํฉ๋๋ค. CI/CD ํ์ดํ๋ผ์ธ์ ํตํฉ๋ ์๋ํ๋ ๋๊ตฌ๋ CC๋ฅผ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๊ณ ์ฌ์ ์ ์๋ ์๊ณ๊ฐ์ ์ด๊ณผํ๋ ์ฝ๋ ์น์ ์ ํ๋๊ทธ๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ฌ์ ์๋ฐฉ์ ์ ๊ทผ ๋ฐฉ์์ ๊ฐ๋ฐ ํ๋ก์ธ์ค ์ด๊ธฐ์ ๋ณต์ก์ฑ์ ๊ด๋ฆฌํ์ฌ ์ ์ฌ์ ๊ฒฐํจ์ ๋ฐฉ์งํ๊ณ ์ฅ๊ธฐ์ ๋น์ฉ์ ์ ๊ฐํฉ๋๋ค.
pipeline {
agent any
stages {
stage('Cyclomatic Complexity Check') {
steps {
sh 'static-analysis-tool --check-complexity --threshold 10'
}
post {
failure {
error 'Pipeline failed due to high cyclomatic complexity.'
}
}
}
}
}
์์ Jenkins ํ์ดํ๋ผ์ธ ์์ ๋ CC ๊ฒ์ฌ๋ฅผ ์๋ํํ์ฌ ์ง๋์น๊ฒ ๋ณต์กํ ์ฝ๋์ ๋ฐฐํฌ๋ฅผ ์ค๋จํ๊ณ ์ํํธ์จ์ด ํ์ง ํ์ค์ ์ ์งํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
CC๊ฐ ํ ์คํธ ๋ฐ ์ ์ง ๊ด๋ฆฌ์ ๋ฏธ์น๋ ์ํฅ
์ํ ๋ณต์ก๋(CC)๋ ๋ชจ๋ ์คํ ๊ฒฝ๋ก๋ฅผ ํฌ๊ดํ๋ ๋ฐ ํ์ํ ํ ์คํธ ์ฌ๋ก ์๋ฅผ ๊ฒฐ์ ํ์ฌ ํ ์คํธ ํ๋ก์ธ์ค์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ๋์ CC ๊ฐ์ ๋ ๊ด๋ฒ์ํ ํ ์คํธ๊ฐ ํ์ํจ์ ์๋ฏธํ๋ฉฐ, ์ด๋ ๋น์ฉ์ด ์ฆ๊ฐํ๊ณ ํ ์คํธ ์ฃผ๊ธฐ๊ฐ ๊ธธ์ด์ง์ ์๋ฏธํฉ๋๋ค. ๋ํ ๋ณต์กํ ์ฝ๋๋ ํฅํ ์์ ์ ๊ฒฐํจ์ด ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ๋์์ง๊ธฐ ๋๋ฌธ์ ์ ์ง ๊ด๋ฆฌ๊ฐ ๋ ์ด๋ ต์ต๋๋ค. ๋ฆฌํฉํ ๋ง์ ํตํด CC๋ฅผ ์ค์ด๋ฉด ํ ์คํธ๊ฐ ๊ฐ์ํ๋ ๋ฟ๋ง ์๋๋ผ ์ฝ๋๋ฒ ์ด์ค๊ฐ ๋ณ๊ฒฝ์ ๋ ์ ์ ์ํ ์ ์์ต๋๋ค.
๋๊ท๋ชจ ํจ์ ๋ถํด, ๋ ๊ฐ๋จํ ์กฐ๊ฑด ๊ตฌ์กฐ ์ฌ์ฉ, Strategy Pattern๊ณผ ๊ฐ์ ๋์์ธ ํจํด ์ ์ฉ๊ณผ ๊ฐ์ ๋ฆฌํฉํ ๋ง ์ ๋ต์ CC๋ฅผ ํฌ๊ฒ ์ค์ผ ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ดํ์ ์ฝ๋ ๋ช ํ์ฑ์ ๋์ด๊ณ ์ ์ฌ์ ์ค๋ฅ๋ฅผ ์ต์ํํฉ๋๋ค. ์๋ํ๋ ์ ์ ์ฝ๋ ๋ถ์ ๋๊ตฌ๋ ์ด๋ฌํ ๋ณ๊ฒฝ ์ฌํญ์ ๊ถ์ฅํ์ฌ ๊ฐ๋ฐ ์ํฌํ๋ก๋ฅผ ๋ฐฉํดํ์ง ์๊ณ ์ง์์ ์ธ ํ์ง ๊ฐ์ ์ ๋ณด์ฅํ ์ ์์ต๋๋ค.
public int determineShippingCost(boolean expedited, boolean international, boolean heavy) {
if (expedited && international && heavy) return 100;
if (expedited && international) return 80;
if (international) return 60;
if (expedited) return 40;
return 20;
}
์์ ํจ์๋ CC๊ฐ 5๋ก, ์ต์ XNUMX๊ฐ์ ํ ์คํธ ์ผ์ด์ค๊ฐ ํ์ํ๋ค๋ ๊ฒ์ ๋ํ๋ ๋๋ค. ์ด ์ฝ๋๋ฅผ ๋ ์์ ๋ฉ์๋๋ก ๋ฆฌํฉํ ๋งํ๋ฉด CC๊ฐ ์ค์ด๋ค์ด ํ ์คํธ์ ์ ์ง ๊ด๋ฆฌ๊ฐ ๋ชจ๋ ๊ฐ์ํ๋ฉ๋๋ค.
CC ๊ด๋ฆฌ์์ ์ ์ ์ฝ๋ ๋ถ์์ ์ญํ
์ ์ ์ฝ๋ ๋ถ์ ๋๊ตฌ๋ Cyclomatic Complexity(CC)๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ์ด๋ฌํ ๋๊ตฌ๋ ๋ชจ๋ ๊ธฐ๋ฅ์ด๋ ๋ชจ๋์ ๋ํ CC๋ฅผ ์๋์ผ๋ก ๊ณ์ฐํ์ฌ ๋ฆฌํฉํ ๋ง์ด ํ์ํ ๋ณต์กํ ์์ญ์ ๋ํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํฉ๋๋ค. ์ ์ ๋ถ์์ CI/CD ํ์ดํ๋ผ์ธ์ ํตํฉํจ์ผ๋ก์จ ๊ฐ๋ฐํ์ ์ํํธ์จ์ด ์๋ช ์ฃผ๊ธฐ ์ ๋ฐ์ ๊ฑธ์ณ CC๋ฅผ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ ์ ์์ต๋๋ค. ์๋ํ๋ ์๋ฆผ์ CC ์๊ณ๊ฐ์ ์ด๊ณผํ๋ฉด ๊ฐ๋ฐ์์๊ฒ ์๋ ค ์ ์์ ์์ ํ๊ณ ์ต์์ ์ฝ๋ฉ ๊ดํ์ ์ด์งํฉ๋๋ค.
๋ํ ์ ์ ๋ถ์ ๋๊ตฌ๋ ์ ์ด ๊ตฌ์กฐ ๋จ์ํ, ๋์์ธ ํจํด ์ ์ฉ, ๋๊ท๋ชจ ํจ์ ๋ถํด์ ๊ฐ์ CC ๊ฐ์๋ฅผ ์ํ ์ ์์ ์ ๊ณตํฉ๋๋ค. ์ด ํผ๋๋ฐฑ ๋ฃจํ๋ ๊นจ๋ํ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ ์งํ๊ณ , ๊ธฐ์ ๋ถ์ฑ๋ฅผ ์ค์ด๋ฉฐ, ์ ๋ฐ์ ์ธ ์ํํธ์จ์ด ์ ์ง ๊ด๋ฆฌ๋ฅผ ํฅ์ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์ด๋ฌํ ๋๊ตฌ๋ฅผ ๊ฐ๋ฐ ํ๋ก์ธ์ค์ ํตํฉํ๋ฉด ์ฅ๊ธฐ์ ์ธ ํ๋ก์ ํธ ์ํ๋ฅผ ์ง์ํ๊ณ ํฅํ ์ ์ง ๊ด๋ฆฌ ๋ ธ๋ ฅ์ ์ค์ผ ์ ์์ต๋๋ค.
pipeline {
agent any
stages {
stage('CC Management') {
steps {
sh 'static-analysis-tool --generate-cc-report cc-report.html'
}
post {
always {
archiveArtifacts artifacts: 'cc-report.html', fingerprint: true
}
}
}
}
}
์์ Jenkins ํ์ดํ๋ผ์ธ ์คํฌ๋ฆฝํธ๋ ์ ์ ์ฝ๋ ๋ถ์์ ์คํํ์ฌ CC ๋ณด๊ณ ์๋ฅผ ์์ฑํ๊ณ ์ง์์ ์ธ ๋ชจ๋ํฐ๋ง์ ์ํด ๋ณด๊ดํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ฝ๋ ๋ณต์ก์ฑ์ ๊ด๋ฆฌํ๋ ๋ฐ ์์ด ํฌ๋ช ์ฑ๊ณผ ์ฑ ์์ ๋ณด์ฅํฉ๋๋ค.
Cyclomatic Complexity(CC)๋ฅผ ์ดํดํ๋ ๊ฒ์ ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํ๊ณ ๊ฒฌ๊ณ ํ๋ฉฐ ํจ์จ์ ์ธ ์ํํธ์จ์ด๋ฅผ ๊ฐ๋ฐํ๋ ๋ฐ ๊ธฐ๋ณธ์ด ๋ฉ๋๋ค. ์ ์ ์ฝ๋ ๋ถ์์ ํ์ฉํ๊ณ ๋ณต์ก์ฑ ๊ด๋ฆฌ๋ฅผ CI/CD ํ์ดํ๋ผ์ธ์ ํตํฉํจ์ผ๋ก์จ ๊ฐ๋ฐํ์ ์ํ์ ์ค์ด๊ณ ํ ์คํธ๋ฅผ ์ต์ ํํ๋ฉฐ ๊นจ๋ํ๊ณ ํ์ฅ ๊ฐ๋ฅํ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ ์งํ ์ ์์ต๋๋ค.
์ํ ๋ณต์ก๋๋ ๋ฌด์์ด๊ณ ๋ฌด์์ ์ธก์ ํ๋๊ฐ?
์ํ ๋ณต์ก๋์ ์ ์
์ํ ๋ณต์ก๋๋ ์์ค ์ฝ๋๋ฅผ ํตํ ์ ํ์ ์ผ๋ก ๋ ๋ฆฝ์ ์ธ ๊ฒฝ๋ก์ ์๋ฅผ ์ ๋ํํ์ฌ ํ๋ก๊ทธ๋จ์ ๋ณต์ก๋๋ฅผ ์ธก์ ํ๋ ์งํ์ ๋๋ค. 1976๋ Thomas J. McCabe๊ฐ ๊ฐ๋ฐํ ์ด ์งํ๋ ๊ฐ๋ฐ์๊ฐ ์ ์ด ํ๋ฆ์ ๋ฐ๋ผ ์ฃผ์ด์ง ์ํํธ์จ์ด๊ฐ ์ผ๋ง๋ ๋ณต์กํ์ง ์ดํดํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์ํ ๋ณต์ก๋๊ฐ ๋์์๋ก ์ฝ๋๋ฅผ ์ดํดํ๊ณ ์ ์ง ๊ด๋ฆฌํ๊ณ ํ ์คํธํ๊ธฐ๊ฐ ๋ ์ด๋ ต์ต๋๋ค. ์ํ ๋ณต์ก๋๋ ๋ณต์กํ ์ฝ๋๋ ์ข ์ข ๋ ๋ง์ ์ค๋ฅ๋ก ์ด์ด์ง๊ธฐ ๋๋ฌธ์ ์์ ์ด๋ ๊ฐ์ ์ค์ ๊ฒฐํจ์ ๋์ ํ ์ํ์ ํ๊ฐํ ๋ ํนํ ๊ด๋ จ์ด ์์ต๋๋ค.
์ด ๋ฉํธ๋ฆญ์ ํ๋ก๊ทธ๋จ์ ์ ์ด ํ๋ฆ ๊ทธ๋ํ๋ฅผ ์ฌ์ฉํ์ฌ ๊ณ์ฐ๋๋ฉฐ, ์ฌ๊ธฐ์ ๋ ธ๋๋ ์ฝ๋ ๋ธ๋ก์ ๋ํ๋ด๊ณ ์์ง๋ ์ ์ด ํ๋ฆ ๊ฒฝ๋ก๋ฅผ ๋ํ๋ ๋๋ค. ์ฌ์ดํด๋ก๋งคํฑ ๋ณต์ก๋์ ๊ณต์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ์ฌ๊ธฐ์ ๋ ์์ง์ ์์ด๊ณ , ๋ ๋ ธ๋์ ์์ด๊ณ , ๋ ์ฐ๊ฒฐ๋ ๊ตฌ์ฑ ์์์ ์๋ฅผ ๋ํ๋ ๋๋ค. 10 ์ดํ์ ์ฌ์ดํด๋ก๋งคํฑ ๋ณต์ก๋ ์ ์๋ ์ผ๋ฐ์ ์ผ๋ก ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํ ์ฝ๋์ ์ต์ ์ธ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค.
public void processOrder(boolean isMember, boolean isHoliday) {
if (isMember) {
System.out.println("Apply member discount");
}
if (isHoliday) {
System.out.println("Apply holiday discount");
}
System.out.println("Process order");
}
์์ ํจ์๋ ๋ ๊ฐ์ ๋ ๋ฆฝ์ ์ธ ๊ฒฐ์ ์ ์ ๊ฐ์ง๋ฉฐ, ๊ทธ ๊ฒฐ๊ณผ 3์ ์ฌ์ดํด๋ก๋งคํฑ ๋ณต์ก๋๊ฐ ๋ฐ์ํฉ๋๋ค. ์ด๋ ์์ ํ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ์ํด ํ ์คํธํด์ผ ํ๋ ์ธ ๊ฐ์ ๊ณ ์ ํ ์คํ ๊ฒฝ๋ก๋ฅผ ๋ํ๋ ๋๋ค.
์ํ ๋ณต์ก๋ ์ธก์ ์ ์ค์์ฑ
์ฌ์ดํด๋ก๋งคํฑ ๋ณต์ก๋๋ฅผ ์ธก์ ํ๋ ๊ฒ์ ์ฝ๋ ํ์ง ๊ฐ์ , ์ ์ง ๊ด๋ฆฌ ๊ฐ์ํ, ํ ์คํธ ๋ฒ์ ํฅ์ ๋ฑ ๋ค์ํ ์ด์ ๋ก ํ์์ ์ ๋๋ค. ๋์ ๋ณต์ก๋๋ ์ข ์ข ๊ฒฐํจ ์ํ ์ฆ๊ฐ ๋ฐ ๋์ ํ ์คํธ ๋น์ฉ๊ณผ ์๊ด๊ด๊ณ๊ฐ ์์ต๋๋ค. ๊ฐ๋ฐ์๋ ์ฌ์ดํด๋ก๋งคํฑ ๋ณต์ก๋๋ฅผ ์ฌ์ฉํ์ฌ ์ค๋ฅ๋ฅผ ๋ฐ์์ํค์ง ์๊ณ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ผ๋ง๋ ์ฝ๊ฒ ์ดํดํ๊ณ ์์ ํ ์ ์๋์ง ์ธก์ ํฉ๋๋ค. ๋ณต์ก๋๊ฐ ๋ฎ์ ์ฝ๋๋ ์ผ๋ฐ์ ์ผ๋ก ๋ ์ ๋ขฐํ ์ ์๋๋ฐ, ์์์น ๋ชปํ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํ ์ ์๋ ๋ ผ๋ฆฌ์ ๊ฒฝ๋ก๊ฐ ์ ๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ ์ ์ฝ๋ ๋ถ์ ๋๊ตฌ๋ ๊ฐ๋ฐ ์ค์ ์ด ๋ฉํธ๋ฆญ์ ์๋์ผ๋ก ๊ณ์ฐํ์ฌ ์ฝ๋ ๋ณ๊ฒฝ์ด ๋ณต์ก์ฑ์ ์ด๋ค ์ํฅ์ ๋ฏธ์น๋์ง์ ๋ํ ์ค์๊ฐ ํผ๋๋ฐฑ์ ์ ๊ณตํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ง์์ ์ธ ํตํฉ/์ง์์ ์ธ ๋ฐฐํฌ(CI/CD) ํ๊ฒฝ์์ ์ด๋ฌํ ๋๊ตฌ๋ ์ฌ์ดํด๋ก๋งคํฑ ๋ณต์ก์ฑ์ด ์ ์๋ ์๊ณ๊ฐ์ ์ด๊ณผํ๋ฉด ๋น๋ ํ๋ก์ธ์ค๋ฅผ ์ค๋จํ์ฌ ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํ ์ฝ๋๋ง ์ฝ๋๋ฒ ์ด์ค์ ํตํฉ๋๋๋ก ํ ์ ์์ต๋๋ค.
pipeline {
agent any
stages {
stage('Check Cyclomatic Complexity') {
steps {
sh 'static-analysis-tool --complexity-threshold 10'
}
post {
failure {
error 'Build failed due to high cyclomatic complexity.'
}
}
}
}
}
์ด Jenkins ํ์ดํ๋ผ์ธ ๊ตฌ์ฑ์ ์ํ์ ๋ณต์ก๋ ๊ฒ์ฌ๋ฅผ ์๋ํํ์ฌ ์ง๋์น๊ฒ ๋ณต์กํ ์ฝ๋๊ฐ ๊ฐ๋ฐ ์ฃผ๊ธฐ์์ ๋ ์ด์ ์งํ๋์ง ์๋๋ก ํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
์ํ ๋ณต์ก๋๊ฐ ํ ์คํธ์ ๋ฏธ์น๋ ์ํฅ
์ํ ๋ณต์ก๋๋ ํ๋ก๊ทธ๋จ ๋ด์ ๋ชจ๋ ๊ฐ๋ฅํ ๊ฒฝ๋ก๋ฅผ ํฌํจํ๋ ๋ฐ ํ์ํ ์ต์ ํ ์คํธ ์ผ์ด์ค ์๋ฅผ ๊ฒฐ์ ํ๊ธฐ ๋๋ฌธ์ ํ ์คํธ์ ์ง์ ์ ์ธ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ๊ฐ ๋ ๋ฆฝ์ ์ธ ๊ฒฝ๋ก๋ ์ ์ฒด ๊ธฐ๋ฅ์ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํด ๊ฒ์ฆํด์ผ ํ๋ ์๋๋ฆฌ์ค๋ฅผ ๋ํ๋ ๋๋ค. ์ฝ๋๊ฐ ๋ณต์กํ ์๋ก ๋ ๋ง์ ํ ์คํธ ์ผ์ด์ค๊ฐ ํ์ํ์ฌ ์ฒ ์ ํ ํ ์คํธ์ ํ์ํ ์๊ฐ๊ณผ ๋ฆฌ์์ค๊ฐ ๋์ด๋ฉ๋๋ค.
์ฌ์ดํด๋ก๋งคํฑ ๋ณต์ก๋๋ฅผ ์ค์ด๋ฉด ํ์ํ ํ ์คํธ ์ผ์ด์ค์ ์๊ฐ ์ค์ด ํ ์คํธ ํ๋ก์ธ์ค๊ฐ ๊ฐ์ํ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด ๋ณต์ก๋ ์ ์๊ฐ 15์ธ ํจ์๋ 15% ๊ฒฝ๋ก ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๋ฌ์ฑํ๋ ค๋ฉด ์ต์ 100๊ฐ์ ํ ์คํธ ์ผ์ด์ค๊ฐ ํ์ํฉ๋๋ค. ์ด๋ฌํ ํจ์๋ฅผ ๋ ์๊ณ ๊ฐ๋จํ ๋ฉ์๋๋ก ๋๋์ด ๋ฆฌํฉํ ๋งํ๋ฉด ๋ณต์ก๋ ์ ์๊ฐ ์ค์ด๋ค์ด ํ ์คํธ ๋ ธ๋ ฅ์ด ์ค์ด๋ญ๋๋ค.
public int calculateShippingCost(boolean isInternational, boolean isExpress, boolean isFragile) {
if (isInternational && isExpress && isFragile) {
return 50;
} else if (isInternational && isExpress) {
return 40;
} else if (isInternational) {
return 30;
} else if (isExpress) {
return 20;
}
return 10;
}
์์ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ๊ฒฐ์ ์ง์ ์ด ์์ด ๋์ ์ํ ๋ณต์ก๋๋ฅผ ์ด๋ํฉ๋๋ค. ์ด ์ฝ๋๋ฅผ ์ ๋ต ํจํด์ด๋ ๋ ๊ฐ๋จํ ์กฐ๊ฑด ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํ๋๋ก ๋ฆฌํฉํ ๋งํ๋ฉด ๋ณต์ก๋ ์ ์์ ํ์ํ ํ ์คํธ ์ฌ๋ก ์๊ฐ ์ค์ด๋ญ๋๋ค.
์ํ ๋ณต์ก๋์ ์ ์ง ๊ด๋ฆฌ์ฑ ๊ฐ์ ๊ด๊ณ
์ํ์ ๋ณต์ก๋๋ ์ฝ๋ ์ ์ง ๊ด๋ฆฌ์ ์๋นํ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ๋ณต์ก๋๊ฐ ๋์ผ๋ฉด ์ฝ๋๋ฅผ ์ดํดํ๊ธฐ ์ด๋ ค์์ง๊ณ ์์ ์ค์ ์ค๋ฅ๊ฐ ๋ ๋ง์์ง๋๋ค. ํ๋ก์ ํธ๊ฐ ์ปค์ง์ ๋ฐ๋ผ ์ ๋๋ก ์ ์ง ๊ด๋ฆฌ๋์ง ์์ ์ฝ๋๋ฒ ์ด์ค๋ ๊ธฐ์ ๋ถ์ฑ๋ฅผ ์ถ์ ํ์ฌ ํฅํ ๊ฐ๋ฐ์ ๋ฆ์ถ ์ ์์ต๋๋ค. ํ์ ์ํ์ ๋ณต์ก๋๋ฅผ ๋ฎ๊ฒ ์ ์งํจ์ผ๋ก์จ ์ฝ๋์ ๋ํ ์ ๊ทผ์ฑ, ์ ์ฐ์ฑ, ๊ฐ์ ์ฉ์ด์ฑ์ ๋ณด์ฅํฉ๋๋ค.
์ ์ ์ฝ๋ ๋ถ์ ๋๊ตฌ๋ ๋ณต์กํ ์์ญ์ ๋ํ ์คํ ๊ฐ๋ฅํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํ์ฌ ์ ์ง ๊ด๋ฆฌ๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํ ๋ฆฌํฉํ ๋ง ์ ๋ต์ ๊ถ์ฅํฉ๋๋ค. ๋๊ท๋ชจ ํจ์ ๋ถํด, ๋ช ํํ ์ ์ด ๊ตฌ์กฐ ์ฌ์ฉ, ๊นจ๋ํ ์ฝ๋ ์์น ์ค์์ ๊ฐ์ ๊ธฐ์ ์ ๋ณต์ก์ฑ์ ์๋นํ ๋ฎ์ถ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋๊ตฌ์์ ์์ฑ๋ ์๋ํ๋ ๋ณด๊ณ ์๋ ํ์ด ๊ฐ์ ํ ์์ญ์ ์ฐ์ ์์ํํ์ฌ ์ฅ๊ธฐ์ ์ธ ์ ์ง ๊ด๋ฆฌ ๋น์ฉ์ ์ค์ด๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
pipeline {
agent any
stages {
stage('Complexity and Maintainability Check') {
steps {
sh 'static-analysis-tool --output maintainability-report.html'
}
post {
always {
archiveArtifacts artifacts: 'maintainability-report.html', fingerprint: true
}
}
}
}
}
์ด Jenkins ํ์ดํ๋ผ์ธ ์คํฌ๋ฆฝํธ๋ ์ ์ง๋ณด์์ฑ ๋ณด๊ณ ์๋ฅผ ์์ฑํ๊ณ ๋ณด๊ดํ์ฌ ์ํ์ ๋ณต์ก๋๊ฐ ์ฝ๋๋ฒ ์ด์ค์ ์ฅ๊ธฐ์ ์ธ ์ํ์ ์ด๋ค ์ํฅ์ ๋ฏธ์น๋์ง์ ๋ํ ์ง์์ ์ธ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํฉ๋๋ค.
์ฌ์ดํด๋ก๋งคํฑ ๋ณต์ก๋๊ฐ ๋ฌด์์ ์ธก์ ํ๋์ง, ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ด ๊ฐ๋ฐ์ ๋ค์ํ ์ธก๋ฉด์ ์ด๋ค ์ํฅ์ ๋ฏธ์น๋์ง ์ดํดํ๋ ๊ฒ์ ๊ณ ํ์ง ์ํํธ์จ์ด๋ฅผ ๊ตฌ์ถํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ์ ์ ์ฝ๋ ๋ถ์ ๋๊ตฌ๋ฅผ ํ์ฉํจ์ผ๋ก์จ ๊ฐ๋ฐํ์ ๋ณต์ก๋๋ฅผ ์ฌ์ ์ ๊ด๋ฆฌํ์ฌ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์ ์ ์ด๊ณ ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํ๋ฉฐ ํ ์คํธํ๊ธฐ ์ฌ์ด์ง ํ์ธํ ์ ์์ต๋๋ค.
์ ์ ์ฝ๋ ๋ถ์์ด ์ํ ๋ณต์ก๋ ๊ฐ์์ ์ด๋ป๊ฒ ๋์์ด ๋๋๊ฐ
๋ณต์กํ ์ฝ๋ ์ธ๊ทธ๋จผํธ ์๋ณ
์ ์ ์ฝ๋ ๋ถ์ ๋๊ตฌ๋ ๋์ ์ํ ๋ณต์ก๋๋ฅผ ๊ฐ์ง ์ฝ๋ ์น์ ์ ์๋ณํ๋ ๋ฐ ๋ฐ์ด๋ฉ๋๋ค. ์ํ ๋ณต์ก๋๋ ํ๋ก๊ทธ๋จ์ ํตํ ์ ํ์ ์ผ๋ก ๋ ๋ฆฝ์ ์ธ ๊ฒฝ๋ก์ ์๋ฅผ ์ธก์ ํ๋๋ฐ, ์ด๋ ์ฝ๋์ ๋ณต์ก๋์ ์ ์ง ๊ด๋ฆฌ์ฑ๊ณผ ์ง์ ์ ์ผ๋ก ๊ด๋ จ์ด ์์ต๋๋ค. ๋ณต์ก๋ ์ ์๊ฐ ๋์์๋ก ํ ์คํธํ ๊ฒฝ๋ก๊ฐ ๋ ๋ง์์ง๊ณ , ์ฝ๋๋ฅผ ์ดํดํ๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ๊ฐ ๋ ์ด๋ ค์์ง๋๋ค. ์ ์ ๋ถ์ ๋๊ตฌ๋ ๋ณต์ก๋๊ฐ ๋ฏธ๋ฆฌ ์ ์๋ ์๊ณ๊ฐ์ ์ด๊ณผํ๋ ํจ์, ๋ฉ์๋ ๋๋ ํด๋์ค๋ฅผ ์ฐพ๊ธฐ ์ํด ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ค์บํ๋ ํ๋ก์ธ์ค๋ฅผ ์๋ํํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์ฌ๋ฌ ๊ฐ์ ์ค์ฒฉ ๋ฃจํ์ ์กฐ๊ฑด๋ฌธ์ด ์๋ ํจ์๋ฅผ ์๊ฐํด ๋ณด์ธ์. ์ ์ ์ฝ๋ ๋ถ์ ๋๊ตฌ๋ ์ด๋ฌํ ๊ฒฐ์ ์ง์ ์ ๊ธฐ๋ฐ์ผ๋ก ์ํ ๋ณต์ก๋๋ฅผ ๊ณ์ฐํ๊ณ ๊ถ์ฅ ํ๊ณ๋ฅผ ์ด๊ณผํ๋ ๋ชจ๋ ํจ์์ ํ๋๊ทธ๋ฅผ ์ง์ ํฉ๋๋ค. ์ด๋ฌํ ๋๊ตฌ๋ ๋ณต์กํ ์์ญ์ ๋ํ ์๊ฐ์ ๋ถ์์ ์ ๊ณตํจ์ผ๋ก์จ ๊ฐ๋ฐ์๊ฐ ๋ฌธ์ ๊ฐ ์๋ ์น์ ์ ๋น ๋ฅด๊ฒ ํ์ ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
public int calculateDiscount(int price, boolean isMember, boolean isHoliday) {
if (isMember) {
if (isHoliday) {
return price * 80 / 100; // 20% discount
} else {
return price * 90 / 100; // 10% discount
}
} else {
if (isHoliday) {
return price * 95 / 100; // 5% discount
}
}
return price;
}
์์ ํจ์๋ ์ฌ๋ฌ ๊ฒฐ์ ์ง์ ์ ๊ฐ์ง๊ณ ์์ด ๋ ๋์ ์ฌ์ดํด๋ก๋งคํฑ ๋ณต์ก๋๋ฅผ ์ด๋ํฉ๋๋ค. ์ ์ ๋ถ์ ๋๊ตฌ๋ ๊ฐ๋ ์ฑ๊ณผ ์ ์ง ๊ด๋ฆฌ๋ฅผ ๊ฐ์ ํ๊ธฐ ์ํด ์ด ํจ์๋ฅผ ๋ฆฌํฉํ ๋งํ๋๋ก ๊ฐ์กฐํ ๊ฒ์ ๋๋ค.
๋ฆฌํฉํ ๋ง ์ ์ ์ ๊ณต
๋ณต์กํ ์ฝ๋๋ฅผ ์๋ณํ๋ ๊ฒ ์ธ์๋ ์ ์ ์ฝ๋ ๋ถ์ ๋๊ตฌ๋ ์ฌ์ดํด๋ก๋งคํฑ ๋ณต์ก์ฑ์ ์ค์ด๊ธฐ ์ํ ๋ฆฌํฉํ ๋ง ์ ๋ต์ ์ ์ํฉ๋๋ค. ๋ฆฌํฉํ ๋ง์ ์ธ๋ถ ๋์์ ๋ณ๊ฒฝํ์ง ์๊ณ ๊ธฐ์กด ์ฝ๋๋ฅผ ์ฌ๊ตฌ์ฑํ์ฌ ๊ฐ๋ ์ฑ์ ๊ฐ์ ํ๊ณ ๋ณต์ก์ฑ์ ์ค์ด๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ์ ์์๋ ํฐ ํจ์๋ฅผ ๋ ์๊ณ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ํจ์๋ก ๋ถํดํ๊ณ , ์ค์ฒฉ๋ ์กฐ๊ฑด๋ฌธ์ ๋คํ์ฑ ๋ฉ์๋๋ก ๋์ฒดํ๊ณ , ์กฐ๊ธฐ ๋ฐํ์ ์ํด ๊ฐ๋ ์ ์ ํ์ฉํ๋ ๊ฒ์ด ํฌํจ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์ด์ ์ calculateDiscount ์ค์ฒฉ์ ์ค์ด๊ณ ๋ช
ํ์ฑ์ ๊ฐ์ ํ๊ธฐ ์ํด ๋ณดํธ ์ ์ ์ฌ์ฉํ์ฌ ํจ์๋ฅผ ๋ฆฌํฉํ ๋งํ ์ ์์ต๋๋ค.
public int calculateDiscount(int price, boolean isMember, boolean isHoliday) {
if (isMember && isHoliday) return price * 80 / 100;
if (isMember) return price * 90 / 100;
if (isHoliday) return price * 95 / 100;
return price;
}
์ด ๋ฆฌํฉํ ๋ง๋ ๋ฒ์ ์ ๊ฒฐ์ ์ง์ ์ ์๋ฅผ ์ค์ฌ ์ฌ์ดํด๋ก๋งคํฑ ๋ณต์ก๋๋ฅผ ๋ฎ์ถฅ๋๋ค. ์ ์ ๋ถ์ ๋๊ตฌ๋ ์ด๋ฌํ ํจํด์ ์๋์ผ๋ก ์ถ์ฒํ์ฌ ๊ฐ๋ฐ์๊ฐ ๋ ๊นจ๋ํ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ ์งํ๋๋ก ๋์ธ ์ ์์ต๋๋ค.
์ฝ๋ฉ ํ์ค ์ํ
์ ์ ์ฝ๋ ๋ถ์์ ์ฌ์ดํด๋ก๋งคํฑ ๋ณต์ก์ฑ์ ์ฒดํฌํ๋ ์ฝ๋ฉ ํ์ค์ ์ํํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ๊ฐ๋ฐํ์ ์ฌ์ ์ ์๋ ๋ณต์ก์ฑ ์๊ณ๊ฐ์ ์ด๊ณผํ๋ ์ฝ๋๋ฅผ ํ๋๊ทธ๋ก ํ์ํ๋๋ก ๋ถ์ ๋๊ตฌ๋ฅผ ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ํ์ ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํ๊ณ ํ ์คํธ ๊ฐ๋ฅํ ์ฝ๋๋ง ๋น๋ ํ์ดํ๋ผ์ธ์ ํต๊ณผํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
์๋ฅผ ๋ค์ด, Jenkins ํ์ดํ๋ผ์ธ์ ์ ์ ๋ถ์ ๋ณด๊ณ ์๊ฐ ๋์ ์ฌ์ดํด๋ก๋งคํฑ ๋ณต์ก์ฑ์ ๋ํ๋ด๋ ๊ฒฝ์ฐ ๋น๋๊ฐ ์คํจํ๋๋ก ์ค์ ํ ์ ์์ต๋๋ค. ์ด ๊ดํ์ ๊ฐ๋ฐ์๊ฐ ์ฝ๋๊ฐ ๋ฉ์ธ ๋ธ๋์น์ ๋ณํฉ๋๊ธฐ ์ ์ ๋ณต์ก์ฑ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
pipeline {
agent any
stages {
stage('Static Code Analysis') {
steps {
sh 'static-analysis-tool --check-complexity --threshold 10'
}
post {
failure {
error 'Build failed due to high cyclomatic complexity.'
}
}
}
}
}
์ด ์์ ๋ CI/CD ํ์ดํ๋ผ์ธ์์ ๋ณต์ก์ฑ ์๊ณ๊ฐ์ ์๋์ผ๋ก ์ ์ฉํ์ฌ ์ฝ๋ฉ ํ์ค์ ์ผ๊ด๋๊ฒ ์ค์ํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค.
์ง์์ ์ธ ๊ฐ์ ์ง์
์ํํธ์จ์ด ๊ฐ๋ฐ์ ์ง์์ ์ธ ๊ฐ์ ์ ์ ๊ธฐ์ ์ธ ํผ๋๋ฐฑ๊ณผ ์ ์ง์ ์ธ ๊ฐ์ ์ ๋ฌ๋ ค ์์ต๋๋ค. ์ ์ ์ฝ๋ ๋ถ์ ๋๊ตฌ๋ ์ฌ์ดํด๋ก๋งคํฑ ๋ณต์ก์ฑ์ ๋ํ ์ค์๊ฐ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํ์ฌ ๊ฐ๋ฐ์๊ฐ ์ฝ๋ ๋ฆฌํฉํ ๋ง ๋ฐ ์ต์ ํ์ ๋ํ ์ ๋ณด์ ์ ๊ฐํ ๊ฒฐ์ ์ ๋ด๋ฆด ์ ์๋๋ก ํฉ๋๋ค. ์ด๋ฌํ ๋๊ตฌ๋ฅผ CI/CD ํ์ดํ๋ผ์ธ์ ํตํฉํ๋ฉด ๋ชจ๋ ์ปค๋ฐ์์ ๋ณต์ก์ฑ ๊ฒ์ฌ๊ฐ ์ํ๋์ด ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ๋ณต์ก์ฑ์ด ์ฆ๊ฐํ๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ๊ฐ ๋น๋ ํ์ ์์ธํ ๋ณด๊ณ ์๋ฅผ ์์ฑํ๋๋ก ๋๊ตฌ๋ฅผ ๊ตฌ์ฑํ์ฌ ๋ณต์ก์ฑ์ด ์ฆ๊ฐํ๋ ์์ญ์ ๊ฐ์กฐํ ์ ์์ต๋๋ค. ํ์ ์ด๋ฌํ ํต์ฐฐ๋ ฅ์ ์ฌ์ฉํ์ฌ ๋ณต์ก์ฑ ๊ฐ์์ ์ด์ ์ ๋ง์ถ ๋ฆฌํฉํ ๋ง ์ธ์ ์ด๋ ์ฝ๋ ๊ฒํ ๋ฅผ ์์ฝํ์ฌ ์ฅ๊ธฐ์ ์ธ ์ ์ง ๊ด๋ฆฌ๋ฅผ ๋ณด์ฅํ ์ ์์ต๋๋ค.
pipeline {
agent any
stages {
stage('Generate Complexity Report') {
steps {
sh 'static-analysis-tool --report complexity-report.html'
}
}
stage('Archive Report') {
steps {
archiveArtifacts artifacts: 'complexity-report.html', fingerprint: true
}
}
}
}
์ด ํ์ดํ๋ผ์ธ์ ๋ณต์ก์ฑ ๋ณด๊ณ ์๋ฅผ ์์ฑํ ๋ฟ๋ง ์๋๋ผ ์ด๋ฅผ ํฅํ ์ฐธ๊ณ ์ฉ์ผ๋ก ๋ณด๊ดํ์ฌ ์ง์์ ์ธ ๋ชจ๋ํฐ๋ง๊ณผ ๊ฐ์ ์ ์ง์ํฉ๋๋ค.
ํ ์คํธ ๋ฒ์ ๊ฐํ
๋์ ์ฌ์ดํด๋ก๋งคํฑ ๋ณต์ก๋๋ ์์ ํ ์ปค๋ฒ๋ฆฌ์ง๋ฅผ ๋ฌ์ฑํ๋ ๋ฐ ํ์ํ ํ ์คํธ ์ผ์ด์ค ์์ ์ง์ ์ ์ธ ์ํฅ์ ๋ฏธ์นฉ๋๋ค. ์ฝ๋์ ๊ฐ ๋ ๋ฆฝ ๊ฒฝ๋ก๋ ์ต์ํ ํ๋์ ํ ์คํธ ์ผ์ด์ค์ ํด๋นํฉ๋๋ค. ์ ์ ์ฝ๋ ๋ถ์ ๋๊ตฌ๋ ํ ์คํธ๋์ง ์์ ๊ฒฝ๋ก๋ฅผ ์๋ณํ๊ณ ์ถ๊ฐ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์ ์ํ์ฌ ๋ชจ๋ ๋ ผ๋ฆฌ์ ๋ถ๊ธฐ๊ฐ ๊ฒ์ฆ๋๋๋ก ๋์ต๋๋ค.
์ฌ์ดํด๋ก๋งคํฑ ๋ณต์ก๋๋ฅผ ์ค์ด๋ฉด ํ์ํ ํ ์คํธ ์ผ์ด์ค ์๊ฐ ์ค์ด๋ค์ด ํ ์คํธ๊ฐ ๊ฐ์ํ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, 100๊ฐ์ ๊ฒฐ์ ์ง์ ์ด ์๋ ํจ์๋ ๋ชจ๋ ๊ฒฝ๋ก๋ฅผ ํฌํจํ๊ธฐ ์ํด XNUMX๊ฐ ์ด์์ ํ ์คํธ ์ผ์ด์ค๊ฐ ํ์ํ ์ ์์ต๋๋ค. ์ด ํจ์๋ฅผ ๋ฆฌํฉํ ๋งํ์ฌ ๊ฒฐ์ ์ง์ ์ ์ค์ด๋ฉด ํ ์คํธ ๋ถ๋ด์ด ์๋นํ ์ค์ด๋ญ๋๋ค.
public int calculateScore(boolean conditionA, boolean conditionB, boolean conditionC) {
if (conditionA && conditionB && conditionC) {
return 100;
} else if (conditionA && conditionB) {
return 80;
} else if (conditionA) {
return 50;
}
return 0;
}
์ด ํจ์์๋ ๋์ ์ฌ์ดํด๋ก๋งคํฑ ๋ณต์ก๋๋ก ์ด์ด์ง๋ ์ฌ๋ฌ ์กฐ๊ฑด์ด ์์ต๋๋ค. ์ ์ ๋ถ์ ๋๊ตฌ๋ ๋ ผ๋ฆฌ๋ฅผ ๋จ์ํํ๊ฑฐ๋ ๋ ์์ ํจ์๋ก ๋๋์ด ํ ์คํธ ๊ฐ๋ฅ์ฑ์ ๋์ด๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค. ํ ์คํธ ์ ๋ต์ ๋ณต์ก๋ ๊ฐ์ ๋ ธ๋ ฅ๊ณผ ์ผ์น์ํด์ผ๋ก์จ ๊ฐ๋ฐ ํ์ ์ต์ํ์ ์ค๋ณต์ผ๋ก ํฌ๊ด์ ์ธ ์ ์ฉ ๋ฒ์๋ฅผ ๋ณด์ฅํ ์ ์์ต๋๋ค.
ํ๋ก๊ทธ๋๋จธ๊ฐ ์ํ ๋ณต์ก๋(CC)์ ์ ์ฌ์ ๋ฌธ์ ์ ์กฐ๊ธฐ ๊ฐ์ง์ ๊ด์ฌ์ ๊ฐ์ ธ์ผ ํ๋ ์ด์
ํ๋ก๊ทธ๋๋จธ๊ฐ ์ํ ๋ณต์ก๋(CC)์ ๊ด์ฌ์ ๊ฐ์ ธ์ผ ํ๋ ์ด์
์ํ ๋ณต์ก๋(CC)๋ ๋จ์ํ ์ด๋ก ์ ๊ฐ๋ ์ด ์๋๋ผ ์ํํธ์จ์ด ๊ฐ๋ฐ ๋ผ์ดํ์ฌ์ดํด์ ๋ชจ๋ ๋จ๊ณ์ ์ํฅ์ ๋ฏธ์น๋ ์ค์ง์ ์ธ ์๋ฏธ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค. ํ๋ก๊ทธ๋๋จธ๋ CC๊ฐ ์ฝ๋์ ์ ์ง ๊ด๋ฆฌ์ฑ, ๊ฐ๋ ์ฑ ๋ฐ ์์ ์ฑ์ ์ง์ ์ ์ธ ์ํฅ์ ๋ฏธ์น๊ธฐ ๋๋ฌธ์ CC๋ฅผ ์ ๊ฒฝ ์จ์ผ ํฉ๋๋ค. ๋์ CC ์ ์๋ ๋ณต์กํ ์ฝ๋ ๊ตฌ์กฐ๋ฅผ ๋ํ๋ด๋ฉฐ, ์ด๋ ์ดํด, ๋๋ฒ๊น ๋ฐ ์์ ์ ๋ ์ด๋ ต๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ณต์ก๋๋ ๊ฐ๋ฐ ๋ฐ ํฅํ ์ ๋ฐ์ดํธ ์ค์ ๋ฒ๊ทธ๋ฅผ ๋์ ํ ๊ฐ๋ฅ์ฑ์ ๋์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก CC ๊ฐ์ด ๋ฎ์์๋ก ์ฝ๋๊ฐ ๋ ๊ฐ๋จํ๊ณ ํ ์คํธํ๊ธฐ ์ฌ์ฐ๋ฉฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ด ์ ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
CC๋ฅผ ์ดํดํ๋ฉด ๊ฐ๋ฐ์๊ฐ ์ ๋ณด์ ์ ๊ฐํ ์ค๊ณ ๊ฒฐ์ ์ ๋ด๋ฆด ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์๋ก์ด ๊ธฐ๋ฅ์ ๊ตฌํํ๊ฑฐ๋ ๊ธฐ์กด ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํ ๋ CC๋ฅผ ๊ณ ๋ คํ๋ ๊ฐ๋ฐ์๋ ๋ชจ๋์์ ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ์ฝ๋๋ฅผ ์์ฑํ ๊ฐ๋ฅ์ฑ์ด ๋ ๋์ต๋๋ค. ์ด๋ ๊ธฐ์ ๋ถ์ฑ๋ฅผ ์ค์ด๊ณ ์๋ก์ด ํ์์ ๋ ๋นจ๋ฆฌ ์จ๋ณด๋ฉํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ๋ํ CC๋ ํ์ํ ํ ์คํธ ์ฌ๋ก ์์ ์๊ด๊ด๊ณ๊ฐ ์์ผ๋ฏ๋ก ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ๋ฉด ๋ณด๋ค ํจ์จ์ ์ธ ํ ์คํธ ์ ๋ต์ผ๋ก ์ด์ด์ง๋๋ค. CC๋ฅผ ๋ฎ๊ฒ ์ ์งํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ํ ์คํธ ๋ ธ๋ ฅ์ ์ค์ด๊ณ ์ฝ๋ ๊ฒํ ๋ฅผ ๊ฐ์ํํ๋ฉฐ ์ ๋ฐ์ ์ธ ํ๋ก์ ํธ ์ผ์ ์ ๊ฐ์ ํ ์ ์์ต๋๋ค.
public int calculateUserScore(boolean isAdmin, boolean isPremium, boolean isActive) {
if (isAdmin && isPremium && isActive) return 100;
if (isAdmin && isPremium) return 80;
if (isPremium && isActive) return 70;
if (isActive) return 50;
return 10;
}
์ด ํจ์์ CC๋ 5์ ๋๋ค. ์ด๋ฅผ ๋ ์๊ณ ์ง์ค์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก ๋๋์ด ๋ณต์ก์ฑ์ ์ค์ด๋ฉด ํ ์คํธ์ ์ ์ง ๊ด๋ฆฌ๊ฐ ๊ฐ์ํ๋๊ณ ์ฝ๋๋ฒ ์ด์ค๊ฐ ํฅํ ๋ณ๊ฒฝ ์ฌํญ์ ๋ ์ ์ ์ํ ์ ์์ต๋๋ค.
์ ์ฌ์ ๋ฌธ์ ์ ์กฐ๊ธฐ ๊ฐ์ง์ ์ค์์ฑ
Cyclomatic Complexity(CC)์ ๊ด๋ จ๋ ์ ์ฌ์ ๋ฌธ์ ๋ฅผ ์กฐ๊ธฐ์ ๊ฐ์งํ๋ฉด ์ํํธ์จ์ด ํ๋ก์ ํธ์ ํ์ง๊ณผ ์ง์ ๊ฐ๋ฅ์ฑ์ ์๋นํ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค. ์ ์ ์ฝ๋ ๋ถ์ ๋๊ตฌ๋ ๊ฐ๋ฐ ํ๋ก์ธ์ค ์ด๊ธฐ์ ๋ณต์ก์ฑ ๊ด๋ จ ๋ฌธ์ ๋ฅผ ์๋ณํ๋ ๋ฐ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. CC๋ฅผ ์ง์์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๋ฉด ํ์ ํ๋ก์ ํธ๊ฐ ํ์ฅ๋จ์ ๋ฐ๋ผ ๋ฌธ์ ๊ฐ ๋ ์ ์๋ ์ฝ๋ ์น์ ์ ๊ฐ์งํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ฌ์ ์๋ฐฉ์ ์ ๊ทผ ๋ฐฉ์์ ์์ ์ด ๋ ๋น์ฉ์ด ๋ง์ด ๋ค๊ณ ์๊ฐ์ด ๋ง์ด ๊ฑธ๋ฆฌ๋ ๊ฐ๋ฐ ํ๋ฐ ๋จ๊ณ์์ ์ค์ํ ๋ฒ๊ทธ๋ฅผ ๋์ ํ ์ํ์ ์ค์ฌ์ค๋๋ค.
์กฐ๊ธฐ ๊ฐ์ง๋ ๋ํ ๋ ๋์ ๋ฆฌ์์ค ํ ๋น์ ์ฉ์ดํ๊ฒ ํฉ๋๋ค. ํ์ ๋์ ๋ณต์ก์ฑ ์์ญ์ ๋ฆฌํฉํ ๋ง ๋ ธ๋ ฅ์ ์ฐ์ ์ํ์ฌ ์ค์ํ ๊ตฌ์ฑ ์์๊ฐ ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํ๊ณ ํ ์คํธํ๊ธฐ ์ฌ์ด์ง ํ์ธํ ์ ์์ต๋๋ค. ๋ํ ๋ณต์ก์ฑ ๋ฌธ์ ๋ฅผ ์กฐ๊ธฐ์ ํฌ์ฐฉํ๋ฉด ๋ฐ๋ณต์ ์ธ ๊ฐ์ ์ด ๊ฐ๋ฅํ์ฌ ๊ธฐ์ ๋ถ์ฑ๊ฐ ์ถ์ ๋๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ฆด๋ฆฌ์ค ์ฃผ๊ธฐ๊ฐ ๋นจ๋ผ์ง๊ณ ์ฝ๋ ๊ฒํ ๋๋ ํ๋ก๋์ ๋ฐฐํฌ ์ค์ ๋๋ผ์์ด ์ค์ด๋ญ๋๋ค. CI/CD ํ์ดํ๋ผ์ธ์ ํตํฉ๋ ์๋ํ๋ ๋ณต์ก์ฑ ๊ฒ์ฌ๋ ์ ์ฝ๋๊ฐ ํ๋ฆฝ๋ ๋ณต์ก์ฑ ํ์ค์ ์ค์ํ๋๋ก ๋ณด์ฅํ์ฌ ์ฅ๊ธฐ์ ์ธ ํ๋ก์ ํธ ๊ฑด๊ฐ์ ์ฆ์งํฉ๋๋ค.
pipeline {
agent any
stages {
stage('Early Complexity Detection') {
steps {
sh 'static-analysis-tool --complexity-threshold 10 --early-detection'
}
post {
failure {
error 'Build failed: Early detection of high cyclomatic complexity.'
}
}
}
}
}
์ด Jenkins ํ์ดํ๋ผ์ธ ๊ตฌ์ฑ์ ๋ณต์ก์ฑ ๊ฒ์ฌ๋ฅผ ์๋ํํ์ฌ ์กฐ๊ธฐ ๊ฐ์ง๋ฅผ ๋ณด์ฅํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค. CC ์๊ณ๊ฐ์ ์ด๊ณผํ๋ฉด ํ์ดํ๋ผ์ธ์ด ์คํจํ์ฌ ์ฆ๊ฐ์ ์ธ ์กฐ์น๊ฐ ํ์ํฉ๋๋ค. ์ด๋ฌํ ๊ดํ์ ์ฑํํจ์ผ๋ก์จ ๊ฐ๋ฐ ํ์ ๋ณต์ก์ฑ ๊ด๋ จ ๋ฌธ์ ๊ฐ ์ดํ ๊ฐ๋ฐ ๋จ๊ณ์ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ก ๋ฐฉ์งํ์ฌ ์ํํธ์จ์ด๊ฐ ์์ ์ ์ด๊ณ ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํ๋ฉฐ ํ์ฅํ๊ธฐ ์ฌ์ด ์ํ๋ฅผ ์ ์งํ ์ ์์ต๋๋ค.
Cyclomatic Complexity(CC)๋ฅผ ์ ๊ทน์ ์ผ๋ก ๋ชจ๋ํฐ๋งํ๊ณ ๊ด๋ฆฌํ๋ ํ๋ก๊ทธ๋๋จธ๋ ๊ณ ํ์ง์ ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๋ง๋๋ ๋ฐ ๊ธฐ์ฌํฉ๋๋ค. ์ ์ฌ์ ๋ฌธ์ ๋ฅผ ์กฐ๊ธฐ์ ๊ฐ์งํ๋ฉด ๋ณต์ก์ฑ์ด ์ ์ด๋์ด ๋ฒ๊ทธ ์ํ์ด ์ค์ด๋ค๊ณ ์ ์ง ๊ด๋ฆฌ ๋น์ฉ์ด ๋ฎ์์ง๋ฉฐ ์ ๋ฐ์ ์ธ ์ํํธ์จ์ด ์ฑ๋ฅ์ด ํฅ์๋ฉ๋๋ค. ์๋ํ๋ CC ๊ฒ์ฌ๋ฅผ CI/CD ํ์ดํ๋ผ์ธ์ ํตํฉํ๋ฉด ์ฅ๊ธฐ์ ์ธ ์ฝ๋ ํ์ง๊ณผ ํ๋ก์ ํธ ์ฑ๊ณต์ ์ํ ๊ฐ๋ ฅํ ํ๋ ์์ํฌ๊ฐ ์ ๊ณต๋ฉ๋๋ค.
์ฝ๋์์ ์ํ ๋ณต์ก๋๋ฅผ ์ฐพ๋ ๋ฐฉ๋ฒ
์ํ ๋ณต์ก๋ ๊ณ์ฐ์ ๊ธฐ๋ณธ ์ดํด
์ํ ๋ณต์ก๋(CC)๋ ํ๋ก๊ทธ๋จ ์์ค ์ฝ๋๋ฅผ ํตํ ๋
๋ฆฝ ๊ฒฝ๋ก์ ์๋ฅผ ์ธก์ ํฉ๋๋ค. CC๋ฅผ ์๋์ผ๋ก ์ฐพ์ผ๋ ค๋ฉด ๊ฐ๋ฐ์๋ McCabe์ ๊ณต์์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ ๋ ์ ์ด ํ๋ฆ ๊ทธ๋ํ์ ์์ง ์, ๋
ธ๋ ์, ์ฐ๊ฒฐ๋ ๊ตฌ์ฑ ์์ ์๋ฅผ ๋ํ๋
๋๋ค. ์์ ํจ์์ ๊ฒฝ์ฐ CC๋ฅผ ์๋์ผ๋ก ๊ณ์ฐํ๋ ๊ฒ์ด ๊ฐ๋ฅํ์ง๋ง ์ฝ๋๋ฒ ์ด์ค๊ฐ ์ปค์ง์ ๋ฐ๋ผ ์ด๋ ๋น์ค์ฉ์ ์ด ๋ฉ๋๋ค. ๊ฐ ์กฐ๊ฑด๋ฌธ, ๋ฃจํ ๋ฐ ์ ์ด ๊ตฌ์กฐ๊ฐ CC์ ์ด๋ป๊ฒ ๊ธฐ์ฌํ๋์ง ์ดํดํ๋ ๊ฒ์ ์ ํํ ์ธก์ ์ ํ์์ ์
๋๋ค. ๋ค์๊ณผ ๊ฐ์ ๊ฐ ๊ฒฐ์ ์ง์ if, else, while, for๊ธ๋ ๋ฐ์ผ case ์ง์ ์ CC ๊ฐ์ 1์ ๋ํฉ๋๋ค.
์ :
public void exampleFunction(boolean conditionA, boolean conditionB) {
if (conditionA) {
System.out.println("Condition A is true");
}
if (conditionB) {
System.out.println("Condition B is true");
}
}
์ด ๊ธฐ๋ฅ์๋ ๋ ๊ฐ์ง ๊ฒฐ์ ์ง์ ์ด ์์ต๋๋ค.if ๋ฌธ์ฅ), ๊ฒฐ๊ณผ์ ์ผ๋ก CC 3(2๊ฐ์ ์กฐ๊ฑด + ๊ธฐ๋ณธ ๊ฒฝ๋ก์ ๋ํ 1๊ฐ)์ด ๋ฐ์ํฉ๋๋ค. ์ด๋ฌํ ๊ณ์ฐ์ ์ดํดํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ์ฝ๋์ ๊ฐ ๋ถ๋ถ์ด ์ ์ฒด ๋ณต์ก์ฑ์ ์ด๋ค ์ํฅ์ ๋ฏธ์น๋์ง์ ๋ํ ํต์ฐฐ๋ ฅ์ ์ป์ต๋๋ค.
์ ์ ์ฝ๋ ๋ถ์ ๋๊ตฌ ์ฌ์ฉ
์ ์ ์ฝ๋ ๋ถ์ ๋๊ตฌ๋ ์ฌ์ดํด๋ก๋งคํฑ ๋ณต์ก๋๋ฅผ ๊ณ์ฐํ๋ ์๋ํ๋ ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ๋๊ตฌ๋ ์ ์ฒด ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ค์บํ๊ณ , ๊ฐ ๊ธฐ๋ฅ ๋๋ ๋ชจ๋์ ๋ํ CC ๊ฐ์ ๋ณด๊ณ ํ๊ณ , ํ์ฉ ๊ฐ๋ฅํ ๋ณต์ก๋ ์๊ณ๊ฐ์ ์ด๊ณผํ๋ ์์ญ์ ๊ฐ์กฐ ํ์ํฉ๋๋ค. ์ธ๊ธฐ ์๋ ์ ์ ๋ถ์ ๋๊ตฌ๋ ๊ฐ๋ฐ ํ๊ฒฝ๊ณผ ํตํฉ๋์ด ์ค์๊ฐ ํผ๋๋ฐฑ์ ์ ๊ณตํฉ๋๋ค. ์คํ ๊ฐ๋ฅํ ์ ์๊ณผ ํจ๊ป ๋ณต์ก๋ ์ ์๋ฅผ ์ ์ํ์ฌ ๊ฐ๋ฐ์๊ฐ ์ต์ ์ ์ฝ๋ ํ์ง์ ์ ์งํ๊ธฐ ์ฝ๊ฒ ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, ์ ์ ์ฝ๋ ๋ถ์ ๋๊ตฌ๋ฅผ ์คํํ๋ฉด ๋ค์๊ณผ ๊ฐ์ ์ถ๋ ฅ์ด ์์ฑ๋ฉ๋๋ค.
Function: processOrder
Cyclomatic Complexity: 12
Recommendation: Consider refactoring to reduce nested conditionals and loops.
์ด๋ฌํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํจ์ผ๋ก์จ ์ด๋ฌํ ๋๊ตฌ๋ ์ถ์ธก์ ์์ ๊ณ ๊ฐ๋ฐ์๊ฐ ์ฝ๋์ ๊ฐ์ฅ ๋ณต์กํ ์น์ ์ ๋ฆฌํฉํ ๋งํ๋ ๋ฐ ์ง์คํ ์ ์๋๋ก ํฉ๋๋ค. ์ด ํ๋ก์ธ์ค๋ ํ๋ก์ ํธ๊ฐ ์งํํจ์ ๋ฐ๋ผ ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํ๊ณ ํ์ฅ ๊ฐ๋ฅํ ์ํ๋ฅผ ์ ์งํ๋ ๋ฐ ํ์์ ์ ๋๋ค.
๋ณต์ก์ฑ ๋ถ์์ ์ํ IDE ํ๋ฌ๊ทธ์ธ ํ์ฉ
์ต์ ํตํฉ ๊ฐ๋ฐ ํ๊ฒฝ(IDE)์ CC ๊ฐ์ง๋ฅผ ๊ฐ์ํํ๋ ํ๋ฌ๊ทธ์ธ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ํ๋ฌ๊ทธ์ธ์ ๊ฐ๋ฐ ์ํฌํ๋ก์ ์๋ฒฝํ๊ฒ ํตํฉ๋์ด ๊ฐ๋ฐ์๊ฐ ์ฝ๋๋ฅผ ์์ฑํ ๋ ์ค์๊ฐ ๋ณต์ก์ฑ ์ ์๋ฅผ ์ ๊ณตํฉ๋๋ค. IDE ๊ธฐ๋ฐ ๋ณต์ก์ฑ ๋ถ์ ๋๊ตฌ๋ ํธ์ง๊ธฐ ๋ด์์ ๋ฌธ์ ๊ฐ ์๋ ์ฝ๋ ์ธ๊ทธ๋จผํธ๋ฅผ ์ง์ ๊ฐ์กฐ ํ์ํ์ฌ ์ฆ๊ฐ์ ์ธ ์์ ์กฐ์น๋ฅผ ์ทจํ ์ ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, ํจ์๋ฅผ ํธ์งํ ๋ CC๊ฐ ์ง์ ๋ ์๊ณ๊ฐ์ ์ด๊ณผํ๋ฉด ํ๋ฌ๊ทธ์ธ์ด ๊ฒฝ๊ณ ๋ฅผ ํ์ํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ๊ฐ๋ฐ์๋ ๋ฉ์๋ ์ถ์ถ, ์ค์ฒฉ ์กฐ๊ฑด ๊ฐ์ ๋๋ ๋ ๊ฐ๋จํ ์ ์ด ๊ตฌ์กฐ ์ฌ์ฉ๊ณผ ๊ฐ์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ ์ฉํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ค์๊ฐ ํต์ฐฐ๋ ฅ์ ๊ฐ๋ฐ ์ค์ ๋ณต์ก์ฑ ๊ด๋ จ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ ์ค์ฌ์ค๋๋ค.
public int calculateDiscount(int price, boolean isMember, boolean isHoliday) {
if (isMember) {
if (isHoliday) {
return price * 80 / 100;
} else {
return price * 90 / 100;
}
} else if (isHoliday) {
return price * 95 / 100;
}
return price;
}
์ด ํจ์์๋ ์ค์ฒฉ๋ ์กฐ๊ฑด์ด ์ฌ๋ฌ ๊ฐ ์์ด์ ๋ ๋์ CC๊ฐ ๋ฐ์ํฉ๋๋ค. IDE ํ๋ฌ๊ทธ์ธ์ ์ด๊ฒ์ ๋ฆฌํฉํ ๋ง ํ๋๊ทธ๋ก ์ง์ ํ์ฌ ๋ ํํํ ๊ตฌ์กฐ๋ฅผ ์ ์ํ๊ฑฐ๋ ํจ์๋ฅผ ๋ ์์ ๋จ์๋ก ๋๋๋๋ค.
CC์ ์ด์ ์ ๋ง์ถ ์๋ ์ฝ๋ ๊ฒํ ์ํ
์๋ํ๋ ๋๊ตฌ๊ฐ ๋น ๋ฅธ CC ๊ณ์ฐ์ ์ ๊ณตํ๋ ๋ฐ๋ฉด, ์๋ ์ฝ๋ ๊ฒํ ๋ ๊ท์คํ ์ปจํ ์คํธ๋ณ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํฉ๋๋ค. ์ฝ๋ ๊ฒํ ์ค์ ๊ฐ๋ฐ์๋ ์ ์ด ํ๋ฆ ๊ตฌ์กฐ๋ฅผ ๊ฒํ ํ์ฌ ๋ ผ๋ฆฌ๋ฅผ ๋จ์ํํ๊ณ ์์ฌ ๊ฒฐ์ ์ง์ ์ ์ค์ผ ์ ์๋ ๊ธฐํ๋ฅผ ํ์ ํด์ผ ํฉ๋๋ค. ์ฝ๋ ๊ฒํ ์์ ์ํ์ ๋ณต์ก์ฑ์ ๊ฐ์กฐํ๋ฉด ๋ณต์ก์ฑ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฐ ํ๋ก์ธ์ค์ ํ์์ ์ธ ๋ถ๋ถ์ด ๋ฉ๋๋ค.
๋ฆฌ๋ทฐ์ด๋ ๋ค์์ ์ฐพ์ ์ ์์ต๋๋ค.
ํํํด์ง ์ ์๋ ๊ณผ๋ํ ์ค์ฒฉ.
์ฌ๋ฌ ์์ ์ ์ํํ๊ณ ๋ถํด๋ ์ ์๋ ํจ์์ ๋๋ค.
์กฐ๊ฑด ๋ ผ๋ฆฌ๋ฅผ ๋คํ์ฑ์ผ๋ก ๋์ฒดํ ์ ์๋ ๊ธฐํ.
๋ณต์ก์ฑ์ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ผ์์ ์ธ ๊ฒํ ์ ์ผ๋ถ๊ฐ ๋๋ ๋ฌธํ๋ฅผ ์ก์ฑํจ์ผ๋ก์จ ํ์ ๋ ๊น๋ํ๊ณ ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ ์งํ ์ ์์ต๋๋ค.
๋จ์ ํ ์คํธ์ ๋ณต์ก์ฑ ๋ถ์ ํตํฉ
๋จ์ ํ ์คํธ ์ ๋ต์ CC์ ๋ํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํ ์๋ ์์ต๋๋ค. ๊ฐ ๋ ๋ฆฝ์ ์ธ ๊ฒฝ๋ก์ ํ ์คํธ๊ฐ ํ์ํ๊ธฐ ๋๋ฌธ์ ํ์ํ ํ ์คํธ ์ฌ๋ก๊ฐ ๋ง์ผ๋ฉด ๋ณต์ก์ฑ์ด ๋์์ง์ ๋ํ๋ ๋๋ค. CC ์ ์์ ํจ๊ป ๋จ์ ํ ์คํธ ๋ฒ์๋ฅผ ๋ถ์ํ๋ฉด ๋จ์ํ์ ์ด์ ์ ์ป์ ์ ์๋ ์ฝ๋๋ฅผ ์๋ณํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ๊ฐ๋ฐ์๋ ๋ฆฌํฉํ ๋ง์ ํตํด ์คํ ๊ฒฝ๋ก ์๋ฅผ ์ค์ฌ CC๋ฅผ ์ค์ผ ์ ์์ผ๋ฏ๋ก ํ ์คํธ ํ๋ก์ธ์ค๊ฐ ๊ฐ์ํ๋ฉ๋๋ค.
์ :
public int computeShippingCost(boolean isExpress, boolean isInternational, boolean hasInsurance) {
if (isExpress && isInternational) return 100;
if (isInternational) return 80;
if (isExpress) return 50;
if (hasInsurance) return 30;
return 20;
}
์ด ํจ์์๋ 5๊ฐ์ ๊ฒฐ์ ์ง์ ์ด ์์ด CC๋ XNUMX๊ฐ ๋ฉ๋๋ค. ๋ ผ๋ฆฌ๋ฅผ ๋ ์์ ๋ฉ์๋๋ก ๋ถ๋ฆฌํ์ฌ ๋ฆฌํฉํ ๋งํ๋ฉด ๋ณต์ก์ฑ๊ณผ ํด๋น ํ ์คํธ ์ฌ๋ก ์๊ฐ ์ค์ด๋ค์ด ํ ์คํธ ํจ์จ์ฑ์ด ๋์์ง๋๋ค.
์ฝ๋์์ Cyclomatic Complexity๋ฅผ ์ดํดํ๊ณ ์๋ณํ๋ ค๋ฉด ์๋ํ๋ ๋๊ตฌ, ์๋ ๊ฒํ ๋ฐ ์ฌ๋ ค ๊น์ ์ค๊ณ ๊ดํ์ ๊ฒฐํฉํด์ผ ํฉ๋๋ค. ์ด๋ฌํ ๋ฐฉ๋ฒ์ ์ผ๋ฐ์ ์ธ ๊ฐ๋ฐ ์ํฌํ๋ก์ ํตํฉํจ์ผ๋ก์จ ํ๋ก๊ทธ๋๋จธ๋ ํ์ฅ ๊ฐ๋ฅํ๊ณ ์ง์ ๊ฐ๋ฅํ ์ํํธ์จ์ด ๊ฐ๋ฐ์ ์ง์ํ๋ ๊ณ ํ์ง, ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํ๊ณ ํ ์คํธ ๊ฐ๋ฅํ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๋ณด์ฅํ ์ ์์ต๋๋ค.
๋ชจ๋ ํ๋ก๊ทธ๋จ์ ๋ณต์ก์ฑ์ ์ค์ด๋ ๋ฐฉ๋ฒ
์ ์ด ๊ตฌ์กฐ ๋จ์ํ
๋ชจ๋ ํ๋ก๊ทธ๋จ์์ ์ฌ์ดํด๋ก๋งคํฑ ๋ณต์ก์ฑ์ ์ค์ด๋ ๊ฐ์ฅ ํจ๊ณผ์ ์ธ ๋ฐฉ๋ฒ ์ค ํ๋๋ ์ ์ด ๊ตฌ์กฐ๋ฅผ ๋จ์ํํ๋ ๊ฒ์
๋๋ค. ์ฌ๋ฌ ์กฐ๊ฑด ๋ถ๊ธฐ๊ฐ ์๋ ๋ณต์กํ ์ ์ด ๊ตฌ์กฐ๋ ์ฝ๋์ ๋ณต์ก์ฑ์ ํฌ๊ฒ ์ฆ๊ฐ์ํต๋๋ค. ์ค์ฒฉ๋ if ์ง์ , switch ์ผ์ด์ค์ ๋ฃจํ๋ ์ ์ด ํ๋ฆ์ ๊ฐ์ํํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค. ๊ฐ๋ ์ ์ด๋ผ๊ณ ๋ ํ๋ ์กฐ๊ธฐ ๋ฐํ์ ์์ธ์ ์ธ ์ผ์ด์ค๋ฅผ ๋ฏธ๋ฆฌ ์ฒ๋ฆฌํ์ฌ ๋ถํ์ํ ์ค์ฒฉ์ ์ค์ผ ์ ์์ต๋๋ค.
์ :
public int calculateBonus(int yearsOfService, boolean isManager) {
if (yearsOfService < 1) return 0;
if (isManager) return 5000;
return 2000;
}
์์ ์ฝ๋๋ ๊ฐ๋ ์ ์ ์ฌ์ฉํ์ฌ ๋ ผ๋ฆฌ๋ฅผ ๋จ์ํํ๊ณ ์ค์ฒฉ์ ์ค์ด๋ฉฐ ๊ฐ๋ ์ฑ์ ๊ฐ์ ํฉ๋๋ค. ์ ์ด ๊ตฌ์กฐ๋ฅผ ๋จ์ํํ๋ฉด ํ์ํ ํ ์คํธ ์ผ์ด์ค ์๋ ์ค์ด๋ค์ด ์ฝ๋๋ฅผ ํ ์คํธํ๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ๊ฐ ๋ ์ฌ์์ง๋๋ค.
ํฐ ํจ์๋ฅผ ์์ ํจ์๋ก ๋ฆฌํฉํ ๋ง
ํฐ ํจ์๋ฅผ ๋ ์๊ณ ์ง์ค์ ์ธ ํจ์๋ก ๋ถํดํ๋ ๊ฒ์ ๋ณต์ก์ฑ์ ์ค์ด๋ ๋ ๋ค๋ฅธ ํ์์ ์ธ ๊ธฐ์ ์ ๋๋ค. ์ฌ๋ฌ ์์ ์ ์ฒ๋ฆฌํ๋ ํฐ ํจ์๋ ์ฝ๊ณ , ์ดํดํ๊ณ , ์ ์งํ๊ธฐ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ์ด๋ฅผ ๊ฐ๊ฐ ๋จ์ผ ์์ ์ ๋ด๋นํ๋ ๋ ์์ ํจ์๋ก ๋ฆฌํฉํ ๋งํ๋ฉด ์ํ์ ๋ณต์ก์ฑ์ด ๊ฐ์ํ๊ณ ์ฌ์ฌ์ฉ์ฑ์ด ํฅ์๋ฉ๋๋ค.
public void processOrder(boolean isPriority, boolean isInternational) {
if (isPriority) handlePriority();
if (isInternational) handleInternational();
finalizeOrder();
}
private void handlePriority() {
System.out.println("Priority handling");
}
private void handleInternational() {
System.out.println("International shipping");
}
private void finalizeOrder() {
System.out.println("Order finalized");
}
์ด ์์์ ๋ฆฌํฉํ ๋ง์ ๋ณต์ก์ฑ์ ์ค์
๋๋ค. processOrder ๊ธฐ๋ฅ. ๋ ์์ ๊ธฐ๋ฅ์ ํ
์คํธ์ ์ ์ง ๊ด๋ฆฌ๋ฅผ ๋ ์ฝ๊ฒ ๋ง๋ค์ด ์ ๋ฐ์ ์ธ ์ฝ๋ ๋ช
ํ์ฑ์ ํฅ์์ํต๋๋ค.
๋์์ธ ํจํด ์ ์ฉ
Strategy, State, Template Method์ ๊ฐ์ ๋์์ธ ํจํด์ ๋ชจ๋์์ด๊ณ ์ ์ฐํ ์ฝ๋๋ฅผ ์ด์งํจ์ผ๋ก์จ ๋ณต์ก์ฑ์ ์ค์ผ ์ ์์ต๋๋ค. ์ด๋ฌํ ํจํด์ ๋ค๋ฅธ ํด๋์ค์ ์ฑ ์์ ์์ํจ์ผ๋ก์จ ๋ณต์กํ ์กฐ๊ฑด ๋ ผ๋ฆฌ๋ฅผ ์ ๊ฑฐํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, Strategy ํจํด์ ๋ฐํ์์ ์๊ณ ๋ฆฌ์ฆ์ ์ ํํ์ฌ ์ ํ์ ๋ฐ๋ฅธ ์กฐ๊ฑด ๋ถ๊ธฐ๋ฅผ ์ ๊ฑฐํ ์ ์์ต๋๋ค.
interface PaymentStrategy {
void pay(int amount);
}
class CreditCardPayment implements PaymentStrategy {
public void pay(int amount) {
System.out.println("Paid " + amount + " using Credit Card");
}
}
class PayPalPayment implements PaymentStrategy {
public void pay(int amount) {
System.out.println("Paid " + amount + " using PayPal");
}
}
public class ShoppingCart {
private PaymentStrategy paymentStrategy;
public ShoppingCart(PaymentStrategy paymentStrategy) {
this.paymentStrategy = paymentStrategy;
}
public void checkout(int amount) {
paymentStrategy.pay(amount);
}
}
์ด ์์ ์์ ์ ๋ต ํจํด์ ์ฌ์ฉํ๋ฉด ์ฌ๋ฌ ์กฐ๊ฑด ํ์ธ์ด ํ์ ์๊ฒ ๋์ด ์ํ ๋ณต์ก๋๊ฐ ์ค์ด๋ค๊ณ ์ฝ๋๊ฐ ๋ ๊น๋ํ๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ฌ์์ง๋๋ค.
๋ฃจํ ๋ณต์ก์ฑ ๊ฐ์
๋ฃจํ๋ ์ข
์ข
์ฌ์ดํด๋ก๋งคํฑ ๋ณต์ก๋์ ์๋นํ ๊ธฐ์ฌํ๋๋ฐ, ํนํ ์ค์ฒฉ๋ ๊ฒฝ์ฐ ๊ทธ๋ ์ต๋๋ค. ์ค์ฒฉ๋ ๋ฃจํ์ ๊น์ด๋ฅผ ์ค์ด๊ฑฐ๋ ํ๋ ์ธ์ด์ ์คํธ๋ฆผ ์ฐ์ฐ๊ณผ ๊ฐ์ ๋ ํจ์จ์ ์ธ ๊ตฌ์กฐ๋ก ๋์ฒดํ๋ฉด ์ฝ๋๋ฅผ ๊ฐ์ํํ ์ ์์ต๋๋ค. ์ฌ์ฉ break, continue๊ธ๋ ๋ฐ์ผ return ์ ์ ํ ๋ฌธ์ฅ์ ์ฌ์ฉํ๋ฉด ๋ฃจํ๋ฅผ ํํํ๊ฒ ๋ง๋ค๊ณ ๋ณต์ก์ฑ์ ์ค์ด๋ ๋ฐ์๋ ๋์์ด ๋ ์ ์์ต๋๋ค.
public void processList(List<String> items) {
items.stream()
.filter(item -> item.startsWith("A"))
.forEach(System.out::println);
}
์ด ์์ ๋ ์ค์ฒฉ ๋ฃจํ๋ฅผ ์คํธ๋ฆผ ์ฐ์ฐ์ผ๋ก ๋์ฒดํ์ฌ ๊ฐ๋ ์ฑ์ ๊ฐ์ ํ๊ณ ์ํ์ ๋ณต์ก์ฑ์ ์ค์ ๋๋ค. ์คํธ๋ฆผ API๋ ๋ณต์ก์ฑ ์ ์๋ฅผ ์ฆ๊ฐ์ํค์ง ์๊ณ ๋ณต์กํ ์ฐ์ฐ์ ์ฒ๋ฆฌํ๋ ๊ฐ๊ฒฐํ ์ฝ๋๋ฅผ ํ์ฉํฉ๋๋ค.
์กฐ๊ฑด์ ์ต์ํ
๋ณต์กํ ์กฐ๊ฑด์์ ๋์ ์ํ ๋ณต์ก๋์ ๊ธฐ์ฌํฉ๋๋ค. ์กฐ๊ธฐ ๋ฐํ, ์ผํญ ์ฐ์ฐ์ ๋๋ ์ค๋ช ์ ๋ฐฉ๋ฒ์ผ๋ก ์กฐ๊ฑด์ ์บก์ํํ์ฌ ์ด๋ฌํ ํํ์์ ๋จ์ํํ๋ฉด ๋ณต์ก์ฑ์ ์ค์ผ ์ ์์ต๋๋ค. ๋ช ํํ๊ณ ๊ฐ๋จํ ์กฐ๊ฑด์์ ๊ฐ๋ ์ฑ์ ๋์ด๊ณ ์ค๋ฅ๋ฅผ ๋์ ํ ๊ฐ๋ฅ์ฑ์ ์ค์ ๋๋ค.
public boolean isEligibleForDiscount(Customer customer) {
return customer.isLoyalMember() && customer.getPurchaseHistory() > 5;
}
์ด ๊ฐ๊ฒฐํ ๋ฐฉ๋ฒ์ ๋ณต์กํ ์กฐ๊ฑด ๋ ผ๋ฆฌ๋ฅผ ๋ช ํํ๊ณ ์ฝ๊ธฐ ์ฌ์ด ํํ์์ผ๋ก ๋์ฒดํฉ๋๋ค. ์ด๋ฐ ๋ฐฉ์์ผ๋ก ์กฐ๊ฑด์ ๋จ์ํํ๋ฉด ์ํ์ ๋ณต์ก์ฑ์ด ์ค๊ณ ์ฝ๋๋ฅผ ์ดํดํ๊ณ ํ ์คํธํ๊ธฐ๊ฐ ๋ ์ฌ์์ง๋๋ค.
๋ชจ๋ ํ๋ก๊ทธ๋จ์ ๋ณต์ก์ฑ์ ์ค์ด๋ ค๋ฉด ์ ์คํ ๋์์ธ ์ ํ, ์ ๊ธฐ์ ์ธ ๋ฆฌํฉํ ๋ง, ์ต์ ์ธ์ด ๊ธฐ๋ฅ ํ์ฉ์ด ํ์ํฉ๋๋ค. ์ ์ด ๊ตฌ์กฐ๋ฅผ ๋จ์ํํ๊ณ , ๋๊ท๋ชจ ํจ์๋ฅผ ๋ฆฌํฉํ ๋งํ๊ณ , ์ ์ ํ ๋์์ธ ํจํด์ ์ ์ฉํ๊ณ , ๋ฃจํ ๋ณต์ก์ฑ์ ์ค์ด๊ณ , ์กฐ๊ฑด์์ ์ต์ํํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ์ฅ๊ธฐ์ ์ธ ์ํํธ์จ์ด ์ฑ๊ณต์ ์ง์ํ๋ ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํ๊ณ ํจ์จ์ ์ด๋ฉฐ ํ์ฅ ๊ฐ๋ฅํ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค.
๊ณผ์ ์ ํจ์
๋์ ๋ณต์ก์ฑ์ ์ง๋ ๋ ๊ฑฐ์ ์ฝ๋ ์ฒ๋ฆฌ
๋ ๊ฑฐ์ ์ฝ๋๋ฒ ์ด์ค๋ ์ข ์ข ๋์ ์ฌ์ดํด๋ก๋งคํฑ ๋ณต์ก๋๋ฅผ ๊ฐ์ง๊ณ ์์ด ๊ฐ๋ฐ์์๊ฒ ์๋นํ ๊ณผ์ ๋ฅผ ์๊ฒจ์ค๋๋ค. ์ด๋ฌํ ์ฝ๋๋ ์ ์ ํ ๋ฆฌํฉํ ๋ง ์์ด ์งํํ์ ์ ์์ผ๋ฉฐ, ์ด๋ ๋ฐ์ ํ๊ฒ ๊ฒฐํฉ๋ ๊ตฌ์ฑ ์์์ ๋ณต์กํ ์ ์ด ๊ตฌ์กฐ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ์ด๋ฌํ ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํ๋ฉด ์๋์น ์์ ๋ถ์์ฉ์ด ๋ฐ์ํ ์ ์์ผ๋ฉฐ, ํนํ ์ ์ ํ ๋ฌธ์์ ํ ์คํธ๊ฐ ๋ถ์กฑํ ๊ฒฝ์ฐ ๋์ฑ ๊ทธ๋ ์ต๋๋ค. ๊ฐ๋ฐ์๋ ์ฆ๋ถ์ ๋ฆฌํฉํ ๋ง ์ ๋ต๊ณผ ๊ด๋ฒ์ํ ๋จ์ ํ ์คํธ๋ฅผ ๊ตฌํํ์ฌ ๋ณ๊ฒฝ ์ฌํญ์ด ๊ธฐ์กด ๊ธฐ๋ฅ์ ์์์ํค์ง ์๋๋ก ํ๋ ๋ฐฉ์์ผ๋ก ๋ ๊ฑฐ์ ์ฝ๋์ ์ ์คํ๊ฒ ์ ๊ทผํด์ผ ํฉ๋๋ค. ์๋ํ๋ ์ ์ ์ฝ๋ ๋ถ์ ๋๊ตฌ๋ ์ฝ๋์์ ๊ฐ์ฅ ๋ณต์กํ๊ณ ์ํํ ์์ญ์ ์ ํํ ํ์ ํ์ฌ ๊ฐ๋ฐ์๊ฐ ๋ ธ๋ ฅ์ ์ง์คํด์ผ ํ ๊ณณ์ ์๋ดํ ์ ์์ต๋๋ค.
์ฑ๋ฅ๊ณผ ๋จ์์ฑ์ ๊ท ํ
์ฌ์ดํด๋ก๋งคํฑ ๋ณต์ก์ฑ์ ์ค์ด๋ ๋ฐ๋ ์ข ์ข ์ฝ๋๋ฅผ ๋ ์์ ํจ์๋ก ๋ฆฌํฉํ ๋งํ๊ฑฐ๋ ๋์์ธ ํจํด์ ์ ์ฉํ๋ ๊ฒ์ด ํฌํจ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฌํ ๋ณ๊ฒฝ ์ฌํญ์ ๋๋๋ก ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์น ์ ์์ผ๋ฉฐ, ํนํ ์ถ๊ฐ ๋ฉ์๋ ํธ์ถ๋ก ์ธํด ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ ๋์ฑ ๊ทธ๋ ์ต๋๋ค. ๊ฐ๋ฐ์๋ ๊ฐ๋จํ๊ณ ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด ์ฝ๋๋ฅผ ์์ฑํ๋ ๊ฒ๊ณผ ์ฑ๋ฅ์ ์ ์งํ๋ ๊ฒ ์ฌ์ด์์ ๊ท ํ์ ๋ง์ถฐ์ผ ํฉ๋๋ค. ๋ฆฌํฉํ ๋ง ํ์ ์ฑ๋ฅ ํ๋กํ์ผ๋ง ๋ฐ ๋ฒค์น๋งํน์ ์ํํ์ฌ ๋จ์ํ ๋ ธ๋ ฅ์ผ๋ก ์ธํด ์์คํ ํจ์จ์ฑ์ด ์ ํ๋์ง ์๋๋ก ํด์ผ ํฉ๋๋ค. ์ฑ๋ฅ์ด ์ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์๋นํ ์ฑ๋ฅ ์ด์ ์ ์ ๊ณตํ๋ ๊ฒฝ์ฐ ๋ณต์กํ ๊ตฌ์กฐ๋ฅผ ์ผ๋ถ ์ ์งํด์ผ ํ ์ ์์ต๋๋ค.
์๋ํ ๋๊ตฌ์ ๋ํ ๊ณผ๋ํ ์์กด
์ ์ ์ฝ๋ ๋ถ์ ๋๊ตฌ๋ ๋์ ๋ณต์ก์ฑ์ ๊ฐ์งํ๋ ๋ฐ ๋งค์ฐ ์ค์ํ์ง๋ง, ์ด๋ฌํ ๋๊ตฌ์ ์ง๋์น๊ฒ ์์กดํ๋ฉด ๋ฌธ์ ๊ฐ ๋ ์ ์์ต๋๋ค. ๋๊ตฌ๊ฐ ํญ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ๊ด๋ฒ์ํ ๋งฅ๋ฝ์ ์ดํดํ์ง ๋ชปํ์ฌ ๊ฑฐ์ง ์์ฑ ๋๋ ์ต์ ํ ๊ธฐํ ๋์นจ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ๋ํ ๊ฐ๋ฐ์๋ ์๋ํ๋ ๋๊ตฌ๊ฐ ๋ชจ๋ ๋ฌธ์ ๋ฅผ ํฌ์ฐฉํ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํ๊ณ ์๋ ์ฝ๋ ๊ฒํ ์์ ์ป์ ๊ท์คํ ํต์ฐฐ๋ ฅ์ ๋ฌด์ํ ์ ์์ต๋๋ค. ์ด๋ฌํ ํจ์ ์ ํผํ๊ธฐ ์ํด ํ์ ์๋ํ๋ ๋ถ์๊ณผ ์ฒ ์ ํ ๋๋ฃ ๊ฒํ ๋ฅผ ๊ฒฐํฉํ์ฌ ๋ณต์ก์ฑ ๊ฐ์๋ฅผ ์ํ ๊ฒฐ์ ์ด ์ ๋ฐ์ ์ธ ํ๋ก์ ํธ ๋ชฉํ์ ์ผ์นํ๋๋ก ํด์ผ ํฉ๋๋ค.
์ ์ ํ ํ ์คํธ ์์ด ๋ฆฌํฉํ ๋งํ๊ธฐ
๋ณต์ก์ฑ์ ์ค์ด๊ธฐ ์ํ ์ฝ๋ ๋ฆฌํฉํ ๋ง์ ํ์์ ์ด์ง๋ง ํฌ๊ด์ ์ธ ํ ์คํธ ๋ฒ์๊ฐ ์๋ค๋ฉด ์ํํฉ๋๋ค. ์ฝ๋๋ฅผ ๋จ์ํํ๊ธฐ ์ํ ๋ณ๊ฒฝ์ ์๋์น ์๊ฒ ์ฝ๋์ ๋์์ ๋ณ๊ฒฝํ์ฌ ๋ฒ๊ทธ์ ์์คํ ์ค๋ฅ๋ฅผ ์ด๋ํ ์ ์์ต๋๋ค. ๊ฐ๋ฐ์๋ ์๋นํ ๋ฆฌํฉํ ๋ง ์์ ์ ์์ํ๊ธฐ ์ ์ ์ฝ๋๋ฒ ์ด์ค์ ์ ์ ํ ๋จ์ ๋ฐ ํตํฉ ํ ์คํธ๊ฐ ์๋์ง ํ์ธํด์ผ ํฉ๋๋ค. ์ด๋ฌํ ํ ์คํธ๋ ์์ ๋ง์ ์ ๊ณตํ์ฌ ๋ณ๊ฒฝ ํ์๋ ๊ธฐ๋ฅ์ด ๊ทธ๋๋ก ์ ์ง๋๋์ง ํ์ธํฉ๋๋ค. ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ(TDD) ๊ดํ์ ์ฑํํ์ฌ ๋ฆฌํฉํ ๋ง ์ค์ ๋์ ๋ ๋ชจ๋ ์ ์ฝ๋์ ๊ฐ๋ ฅํ ํ ์คํธ๊ฐ ์๋ฐ๋๋๋ก ํ ์๋ ์์ต๋๋ค.
๋น์ฆ๋์ค ๋ก์ง ๋ณต์ก์ฑ ๋ฌด์
์ผ๋ถ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณธ์ง์ ์ผ๋ก ์ฝ๊ฒ ๋จ์ํํ ์ ์๋ ๋ณต์กํ ๋น์ฆ๋์ค ๋ก์ง์ ํฌํจํฉ๋๋ค. ๋๋ฉ์ธ์ ์ดํดํ์ง ์๊ณ ๋จ์ํ๋ฅผ ๊ฐ์ ๋ก ์๋ํ๋ฉด ์ค์ํ ํ๋ก์ธ์ค๊ฐ ๋ถ์ ์ ํ๊ฒ ๋ถํด๋์ด ํผ๋๊ณผ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ณผ๋ํ ๋จ์ํ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ๊ฐ๋ฐ์๋ ์ข ์ข ์ค์ผ ์ ์๋ ๊ธฐ์ ์ ๋ณต์ก์ฑ๊ณผ ๊ด๋ฆฌํด์ผ ํ๋ ํ์์ ์ธ ๋น์ฆ๋์ค ๋ณต์ก์ฑ์ ๊ตฌ๋ณํด์ผ ํฉ๋๋ค. ๋น์ฆ๋์ค ์ดํด ๊ด๊ณ์์ ํ๋ ฅํ๋ฉด ์ฝ๋ ๋ฆฌํฉํ ๋ง ์์ ์ด ํต์ฌ ๋น์ฆ๋์ค ํ๋ก์ธ์ค์ ๋ฌด๊ฒฐ์ฑ์ ์กด์คํ๋๋ก ํ ์ ์์ต๋๋ค.
ํ ๊ฐ ์ผ๊ด๋์ง ์์ ๋ณต์ก์ฑ ํ์ค
์ฌ๋ฌ ๊ฐ๋ฐ ํ์ด ์ฐธ์ฌํ๋ ๋๊ท๋ชจ ํ๋ก์ ํธ์์ ์ผ๊ด๋์ง ์์ ๋ณต์ก์ฑ ํ์ค์ ๋จํธํ๋ ์ฝ๋๋ฒ ์ด์ค๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ์ผ๋ถ ํ์ ์ฑ๋ฅ์ ์ฐ์ ์ํ๋ ๋ฐ๋ฉด, ๋ค๋ฅธ ํ์ ์ ์ง ๊ด๋ฆฌ์ ์ค์ ์ ๋์ด ์์ถฉ๋๋ ์ฝ๋ฉ ๊ดํ์ด ๋ฐ์ํฉ๋๋ค. ํ์ฉ ๊ฐ๋ฅํ ์ฌ์ดํด๋ก๋งคํฑ ๋ณต์ก์ฑ ์๊ณ๊ฐ์ ๋ํ ์กฐ์ง ์ ์ฒด ์ง์นจ์ ์๋ฆฝํ๋ ๊ฒ์ด ํ์์ ์ ๋๋ค. ์ ๊ธฐ์ ์ธ ํ ๊ฐ ๊ฒํ ์ ๊ณต์ ๋ ๋ชจ๋ฒ ์ฌ๋ก๋ ์ผ๊ด์ฑ์ ์ ์งํ๋ ๋ฐ ๋์์ด ๋๋ฉฐ ์ ์ฒด ์ฝ๋๋ฒ ์ด์ค๊ฐ ํฉ์๋ ํ์ค์ ์ค์ํ๋๋ก ํฉ๋๋ค. ๋ช ํํ ๋ฌธ์ํ ๋ฐ ๊ต์ก ์ธ์ ์ ๋ณต์ก์ฑ ๊ด๋ฆฌ ์ ๋ต์ ๋ํ ํ์ ๋์ฑ ์ ๋ ฌํ ์ ์์ต๋๋ค.
๋ณต์ก์ฑ ์งํ์ ์คํด
์ํ ๋ณต์ก๋๋ ๊ฐ์น ์๋ ์งํ์ด์ง๋ง, ๋จ๋ ์ผ๋ก ํด์ํด์๋ ์ ๋ฉ๋๋ค. ๋ณต์ก๋ ์ ์๊ฐ ๋ฎ๋ค๊ณ ํด์ ๋ฐ๋์ ์ฝ๋๊ฐ ์ ์ค๊ณ๋์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ ๊ฒ์ ์๋๋ฉฐ, ๋์ ์ ์๊ฐ ํญ์ ํ์ง์ด ์ข์ง ์๋ค๋ ๊ฒ์ ์๋ฏธํ๋ ๊ฒ์ ์๋๋๋ค. ๊ฐ๋ฐ์๋ ์ฝ๋ ํ์ง์ ํ๊ฐํ ๋ ๊ฐ๋ ์ฑ, ์ฑ๋ฅ, ํ ์คํธ ๋ฒ์์ ๊ฐ์ ๋ค๋ฅธ ์์๋ฅผ ๊ณ ๋ คํด์ผ ํฉ๋๋ค. ๋ณต์ก๋๊ฐ ๋ฎ์ ์ ์๋ฅผ ๋ฌ์ฑํ๋ ๋ฐ ์ง๋์น๊ฒ ์ค์ ์ ๋๋ฉด ์ค์ง์ ์ธ ์ด์ ์ด ๊ฑฐ์ ์๋ ๋ถํ์ํ ๋ฆฌํฉํ ๋ง์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ์งํ๋ ์์ฌ ๊ฒฐ์ ์ ์๋ดํด์ผ์ง ์ง์ํด์๋ ์ ๋ฉ๋๋ค.
์ด๋ฌํ ๊ณผ์ ์ ํจ์ ์ ํด๊ฒฐํ๋ ค๋ฉด ๊ธฐ์ ์ ๋ต, ํ์ ํ๋ก์ธ์ค, ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ๊ณผ ๋น์ฆ๋์ค ์๊ตฌ ์ฌํญ์ ๋ํ ์ฌ์ธต์ ์ธ ์ดํด๋ฅผ ๊ฒฐํฉํ ๊ท ํ ์กํ ์ ๊ทผ ๋ฐฉ์์ด ํ์ํฉ๋๋ค. ์ด๋ฌํ ์ํ์ ์ธ์ํ๊ณ ์ํํจ์ผ๋ก์จ ๊ฐ๋ฐ ํ์ ์ฌ์ดํด๋ก๋งคํฑ ๋ณต์ก์ฑ์ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ์ฌ ๊ฒฌ๊ณ ํ๊ณ ์ ์ง ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ฉฐ ๊ณ ํ์ง์ ์ํํธ์จ์ด ์๋ฃจ์ ์ ๋ง๋ค์ด๋ผ ์ ์์ต๋๋ค.
๋์ ์ํ ๋ณต์ก๋ ํ๋ก๊ทธ๋จ์ ์ฐพ์์ ๋ ๋ค์์ ํด์ผ ํ ์ผ
๋์ ๋ณต์ก์ฑ์ ์ํฅ ํ๊ฐ
ํ๋ก๊ทธ๋จ์ด ๋์ ์ฌ์ดํด๋ก๋งคํฑ ๋ณต์ก๋๋ฅผ ๊ฐ์ง ๊ฒ์ผ๋ก ํ์ธ๋๋ฉด ์ฒซ ๋ฒ์งธ ๋จ๊ณ๋ ํ๋ก์ ํธ์ ๋ฏธ์น๋ ์ํฅ์ ํ๊ฐํ๋ ๊ฒ์ ๋๋ค. ๋ชจ๋ ๋ณต์กํ ์ฝ๋๊ฐ ์ฆ๊ฐ์ ์ธ ๋ฆฌํฉํ ๋ง์ ํ์๋ก ํ๋ ๊ฒ์ ์๋๋๋ค. ๊ฐ๋ฐ์๋ ์ฝ๋๊ฐ ์ผ๋ง๋ ์์ฃผ ์์ ๋๋์ง, ์ ํ๋ฆฌ์ผ์ด์ ์ ํต์ฌ ๊ธฐ๋ฅ์ ๋ํ ์ค์์ฑ, ๋ณต์ก์ฑ์ผ๋ก ์ธํด ์ ๋ฐ์ดํธ ์ค์ ์ํ์ด ๋ฐ์ํ๋์ง ์ฌ๋ถ๋ฅผ ํ๊ฐํด์ผ ํฉ๋๋ค. ๊ฑฐ์ ์์ ๋์ง ์๊ณ ์ ํ ์คํธ๋ ๋์ ๋ณต์ก๋ ์ฝ๋๋ ๋ฆฌํฉํ ๋ง์ ์ฐ์ ์์๊ฐ ๋ฎ์ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ ์ ์์ต๋๋ค. ๋ฐ๋ฉด์ ๋ณต์ก์ฑ์ด ๋์ ์์ฃผ ์ ๋ฐ์ดํธ๋ ์ฝ๋๋ ๋ ํฐ ์ํ์ ์ด๋ํ๋ฏ๋ก ์ฆ์ ์ฒ๋ฆฌํด์ผ ํฉ๋๋ค. ์ ์ ์ฝ๋ ๋ถ์ ๋ณด๊ณ ์๋ ๊ฐ์ฅ ๋ณต์กํ ์์ญ์ ๊ฐ์กฐํ๊ณ ๊ฐ๋ฐ์๊ฐ ์ง์คํด์ผ ํ ๊ณณ์ ์ ์ํ์ฌ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
๋ฆฌํฉํ ๋ง ์์ ์ ์ฐ์ ์์ ์ง์
๋์ ๋ณต์ก์ฑ ์์ญ์ ์๋ณํ ํ์๋ ์ฐ์ ์์๋ฅผ ์ ํ๋ ๊ฒ์ด ํ์์ ์ ๋๋ค. ๋ฆฌํฉํ ๋ง ์์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ง ๊ด๋ฆฌ์ฑ๊ณผ ์ฑ๋ฅ์ ์๋นํ ์ํฅ์ ๋ฏธ์น๋ ๋ชจ๋๋ถํฐ ์์ํด์ผ ํฉ๋๋ค. ํฐ ๊ธฐ๋ฅ์ ๋ ์๊ณ ์ง์ค์ ์ธ ๋ฐฉ๋ฒ์ผ๋ก ๋ถํดํ๋ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค. ๋ฐ๋ณต์ ์ธ ๋ ผ๋ฆฌ๋ฅผ ์ ๊ฑฐํ๊ณ ์์ฌ ๊ฒฐ์ ๊ตฌ์กฐ๋ฅผ ๋จ์ํํ๊ธฐ ์ํด ์ ์ ํ ๊ฒฝ์ฐ ๋์์ธ ํจํด์ ์ ์ฉํฉ๋๋ค. ๊ฐ๋ฐ์๋ ๋ํ ๊ฐ ๋ณ๊ฒฝ ์ฌํญ์ ๋ฌธ์ํํ์ฌ ๋ณ๊ฒฝ ์ด์ ์ ๋ณต์ก์ฑ์ ์ค์ด๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํด์ผ ํฉ๋๋ค. ์ด๋ฌํ ๋ฆฌํฉํ ๋ง ์์ ์ ์ ์ง์ ์ผ๋ก ์ํํ์ฌ ๊ฐ ๋จ๊ณ ํ์๋ ์ฝ๋๊ฐ ๊ณ์ ์๋ํ๋๋ก ํด์ผ ํฉ๋๋ค. ๊ฐ์ฅ ์ค์ํ ์์ญ์ ๋จผ์ ํด๊ฒฐํจ์ผ๋ก์จ ๊ฐ๋ฐ ํ์ ํ๋ก์ ํธ ์ผ์ ์ ๋ฐฉํดํ์ง ์๊ณ ๋ ์๋นํ ๊ฐ์ ์ ์ด๋ฃฐ ์ ์์ต๋๋ค.
ํ ์คํธ ๋ฒ์ ๊ฐํ
์ ์ ํ ํ ์คํธ ์์ด ๋ณต์ก์ฑ์ด ๋์ ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํ๋ ๊ฒ์ ์ํํฉ๋๋ค. ์์ ์ ์์ํ๊ธฐ ์ ์ ํฌ๊ด์ ์ธ ํ ์คํธ ๋ฒ์๊ฐ ์์ด์ผ ํฉ๋๋ค. ๋จ์ ํ ์คํธ๋ ๊ฐ๋ฅํ ๋ชจ๋ ์คํ ๊ฒฝ๋ก๋ฅผ ํฌ๊ดํด์ผ ํ๋ฉฐ, ๋ฆฌํฉํ ๋ง์ผ๋ก ์ธํด ์๋ก์ด ๋ฒ๊ทธ๊ฐ ๋ฐ์ํ์ง ์๋๋ก ํด์ผ ํฉ๋๋ค. ํ ์คํธ ๋ฒ์๊ฐ ๋ถ์กฑํ ๊ฒฝ์ฐ ๊ฐ๋ฐ์๋ ๋ณ๊ฒฝํ๊ธฐ ์ ์ ํ ์คํธ๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค. ํ ์คํธ ์ฃผ๋ ๊ฐ๋ฐ(TDD) ๊ดํ์ ์ฑํํ๋ฉด ๋ฆฌํฉํ ๋ง ์ค์ ๋์ ๋ ๋ชจ๋ ์ ์ฝ๋๊ฐ ์ ๋ขฐํ ์ ์๊ณ ์ฒ ์ ํ ๊ฒ์ฆ๋ฉ๋๋ค. ์๋ํ๋ ํ ์คํธ ๋๊ตฌ๋ ํ๊ท๋ฅผ ๊ฐ์งํ๋ ๋ฐ ๋์์ด ๋์ด ๋ฆฌํฉํ ๋ง ์์ ์ด ์ฑ๊ณต์ ์ด๊ณ ์์ ํ๋ค๋ ํ์ ์ ์ ๊ณตํ ์๋ ์์ต๋๋ค.
ํผ์ด ์ฝ๋ ๋ฆฌ๋ทฐ์ ์ฐธ์ฌํ์ธ์
๋์ ์ฌ์ดํด๋ก๋งคํฑ ๋ณต์ก๋ ํ๋ก๊ทธ๋จ์ ๋ค๋ฃฐ ๋ ํผ์ด ์ฝ๋ ๊ฒํ ๋ ํ์์ ์ ๋๋ค. ์ฝ๋ ๊ฒํ ๋ ํ์๋ค์ด ํต์ฐฐ๋ ฅ์ ๊ณต์ ํ๊ณ , ๋์ ์๋ฃจ์ ์ ๋ ผ์ํ๊ณ , ์๋ํ ๋๊ตฌ๊ฐ ๊ฐ๊ณผํ ์ ์๋ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ํฌ์ฐฉํ ์ ์๋ ๊ธฐํ๋ฅผ ์ ๊ณตํฉ๋๋ค. ํ๋ ฅ ๊ฒํ ๋ ๋ํ ๋ฆฌํฉํ ๋ง์ด ํ๋ก์ ํธ ๋ชฉํ์ ์ฝ๋ฉ ํ์ค์ ๋ถํฉํ๋์ง ํ์ธํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. ๊ฒํ ์๋ ์ ์๋ ๋ณ๊ฒฝ ์ฌํญ์ ํ๊ฐํ ๋ ๊ฐ๋ ์ฑ, ์ ์ง ๊ด๋ฆฌ์ฑ ๋ฐ ๋ ผ๋ฆฌ์ ์ผ๊ด์ฑ์ ์ง์คํด์ผ ํฉ๋๋ค. ์ ๊ธฐ์ ์ผ๋ก ์ฝ๋ ๊ฒํ ๋ฅผ ์ํํ๋ฉด ํ์ง๊ณผ ์ง์์ ์ธ ๊ฐ์ ๋ฌธํ๊ฐ ์กฐ์ฑ๋์ด ๋์ฑ ๊ฐ๋ ฅํ ์ํํธ์จ์ด๊ฐ ํ์ํฉ๋๋ค.
์ฆ๋ถ ๋ฆฌํฉํ ๋ง ์ ์ฉ
ํ ๋ฒ์ ์ ์ฒด ๊ณ ๋ณต์ก๋ ํ๋ก๊ทธ๋จ์ ๋ฆฌํฉํ ๋งํ๋ ค๊ณ ํ๋ฉด ์๋์ ์ด๊ณ ์ํํ ์ ์์ต๋๋ค. ๋์ ๊ฐ๋ฐ์๋ ์ฆ๋ถ์ ๋ฆฌํฉํ ๋ง ๋ฐฉ์์ ์ฑํํด์ผ ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ๋ฆฌํฉํ ๋ง ํ๋ก์ธ์ค๋ฅผ ๊ด๋ฆฌ ๊ฐ๋ฅํ ์์ ์ผ๋ก ๋๋์ด ํ ๋ฒ์ ํ ์น์ ์ ์ฝ๋๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ด ํฌํจ๋ฉ๋๋ค. ๋ฆฌํฉํ ๋ง๋ ๊ฐ ์น์ ์ ๋ค์ ์น์ ์ผ๋ก ๋์ด๊ฐ๊ธฐ ์ ์ ์ฒ ์ ํ ํ ์คํธํด์ผ ํฉ๋๋ค. ์ฆ๋ถ์ ๋ฆฌํฉํ ๋ง์ ์ค๋ฅ๋ฅผ ๋์ ํ ์ํ์ ์ต์ํํ๊ณ ๊ฐ๋ฐ ์ผ์ ์ ๋ฐฉํดํ์ง ์๋ ์ ์ง์ ์ธ ๊ฐ์ ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ์๊ฐ์ด ์ง๋จ์ ๋ฐ๋ผ ์ด ๋ฐฉ์์ ์ํํธ์จ์ด ์์ ์ฑ์ ์ ์งํ๋ฉด์ ์ ๋ฐ์ ์ธ ๋ณต์ก์ฑ์ ํฌ๊ฒ ์ค์ ๋๋ค.
๋ณต์ก์ฑ ์์ค ๋ชจ๋ํฐ๋ง ๋ฐ ์ ์ง ๊ด๋ฆฌ
๋ณต์ก์ฑ์ ์ค์ด๋ ๊ฒ์ ์ผํ์ฑ ์์ ์ด ์๋๋๋ค. ์ง์์ ์ธ ๋ชจ๋ํฐ๋ง๊ณผ ์ ์ง ๊ด๋ฆฌ๊ฐ ํ์ํฉ๋๋ค. ๋ฆฌํฉํ ๋ง ํ ํ์ ์ ์ ์ฝ๋ ๋ถ์ ๋๊ตฌ๋ฅผ ๊ฐ๋ฐ ์ํฌํ๋ก์ ํตํฉํ์ฌ ๋ณต์ก์ฑ ์์ค์ ์ ๊ธฐ์ ์ผ๋ก ์ถ์ ํด์ผ ํฉ๋๋ค. ์ด๋ฌํ ๋๊ตฌ๋ ์๋ก์ด ์ฝ๋ ์ ์ถ์ ๋ํ ์ค์๊ฐ ํผ๋๋ฐฑ์ ์ ๊ณตํ์ฌ ๋ณต์ก์ฑ์ด ์ฝ๋๋ฒ ์ด์ค๋ก ๋ค์ ์ ์ ๋๋ ๊ฒ์ ๋ฐฉ์งํ ์ ์์ต๋๋ค. ํ์ฉ ๊ฐ๋ฅํ ๋ณต์ก์ฑ ์๊ณ๊ฐ์ ์ค์ ํ๋ ์ฝ๋ฉ ํ์ค์ ์๋ฆฝํ๋ฉด ํ๋ก์ ํธ ์ ์ฒด์์ ์ผ๊ด์ฑ์ ์ ์งํ ์ ์์ต๋๋ค. ๋ํ ์ฃผ๊ธฐ์ ์ธ ์ฝ๋ ๊ฒํ ๋ฅผ ์ํํ์ฌ ๋ณต์ก์ฑ ์์ค์ ํ๊ฐํ๊ณ ์ฌ๊ฐํ ๋ฌธ์ ๊ฐ ๋๊ธฐ ์ ์ ์ ์ฌ์ ์ธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผ ํฉ๋๋ค.
๋ฌธ์ ๋ณต์ก์ฑ ๊ด๋ฆฌ ์ ๋ต
ํจ๊ณผ์ ์ธ ๋ณต์ก์ฑ ๊ด๋ฆฌ์๋ ๋ช ํํ ๋ฌธ์ํ๊ฐ ํ์ํฉ๋๋ค. ํ์ ๋ณต์ก์ฑ ์๊ณ๊ฐ, ๋ฆฌํฉํ ๋ง ๊ฐ์ด๋๋ผ์ธ, ์ฝ๋์ ๋จ์์ฑ์ ์ ์งํ๊ธฐ ์ํ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๊ธฐ๋กํด์ผ ํฉ๋๋ค. ์ด ๋ฌธ์๋ ํ์ฌ ๋ฐ ๋ฏธ๋ ํ ๊ตฌ์ฑ์์ ์ํ ์ฐธ๊ณ ์๋ฃ๋ก ์ฌ์ฉ๋์ด ๋ชจ๋ ์ฌ๋์ด ์ผ๊ด๋ ํ๋ก์ธ์ค๋ฅผ ๋ฐ๋ฅด๋๋ก ํฉ๋๋ค. ์ฑ๊ณต์ ์ธ ๋ฆฌํฉํ ๋ง ๋ ธ๋ ฅ์ ๋ฌธ์ํํ๋ฉด ํ๋ก์ ํธ์ ๋ค๋ฅธ ๋ถ๋ถ์์ ์ ์ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๊ท์คํ ์ฌ๋ก ์ฐ๊ตฌ๋ ์ ๊ณตํ ์ ์์ต๋๋ค. ํฌ๊ด์ ์ธ ๋ฌธ์ํ๋ ์ง์ ๊ณต์ ๋ฌธํ๋ฅผ ์ก์ฑํ๊ณ ์ฅ๊ธฐ์ ์ธ ์ฝ๋ ํ์ง์ ์ ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
์ด๋ฌํ ๋จ๊ณ๋ฅผ ๋ฐ๋ฅด๋ฉด ๊ฐ๋ฐํ์ ๋์ ์ฌ์ดํด๋ก๋งคํฑ ๋ณต์ก๋ ํ๋ก๊ทธ๋จ์ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ๊ณ , ์ ์ง๊ด๋ฆฌ์ฑ์ ๊ฐ์ ํ๊ณ , ๊ธฐ์ ๋ถ์ฑ๋ฅผ ์ค์ด๋ฉฐ, ๊ณ ํ์ง ์ํํธ์จ์ด ์๋ฃจ์ ์ ๊ณต์ ๋ณด์ฅํ ์ ์์ต๋๋ค. ์ง์์ ์ธ ๋ชจ๋ํฐ๋ง, ์ ๋ต์ ๋ฆฌํฉํ ๋ง, ํ์ ์ ๋ ธ๋ ฅ์ ์ง์ ๊ฐ๋ฅํ๊ณ ํจ์จ์ ์ธ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ ์งํ๋ ๋ฐ ์ค์ํฉ๋๋ค.
SMART TS XL: ์ํ ๋ณต์ก์ฑ ๊ด๋ฆฌ๋ฅผ ์ํ ์ข ํฉ ์๋ฃจ์
๋ฐฉ๋ฒ SMART TS XL ๋ณต์ก์ฑ ๊ด๋ฆฌ๋ฅผ ๊ฐ์ํํฉ๋๋ค
SMART TS XL ์ฌ์ธต์ ์ธ ์ฝ๋ ๋ถ์๊ณผ ์คํ ๊ฐ๋ฅํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํ์ฌ ์ํ์ ๋ณต์ก์ฑ ๊ด๋ฆฌ๋ฅผ ๊ฐ์ํํ๋๋ก ์ค๊ณ๋์์ต๋๋ค. ๊ธฐ์กด์ ์ ์ ์ฝ๋ ๋ถ์ ๋๊ตฌ์ ๋ฌ๋ฆฌ, SMART TS XL ๊ฐ ๊ธฐ๋ฅ์ ๋ํ ์์ธํ ๋ณต์ก์ฑ ์งํ๋ฅผ ์ ๊ณตํ์ฌ ๋ณต์ก์ฑ์ด ํ์ฉ ๊ฐ๋ฅํ ์๊ณ๊ฐ์ ์ด๊ณผํ๋ ์์ญ์ ๊ฐ์กฐํฉ๋๋ค. ์ง๊ด์ ์ธ ๋์๋ณด๋๋ฅผ ํตํด ๊ฐ๋ฐ์๋ ์ฝ๋๋ฒ ์ด์ค ์ ์ฒด์ ๋ณต์ก์ฑ ๋ถํฌ๋ฅผ ์๊ฐํํ์ฌ ๋ฐ์ดํฐ ๊ธฐ๋ฐ ํต์ฐฐ๋ ฅ์ ๊ธฐ๋ฐ์ผ๋ก ๋ฆฌํฉํ ๋ง ์์ ์ ์ฐ์ ์์๋ฅผ ์ง์ ํ ์ ์์ต๋๋ค. SMART TS XL์ง์์ ์ธ ๋ถ์ ๊ธฐ๋ฅ์ ํตํด ๋ชจ๋ ์ฝ๋ ๋ณ๊ฒฝ ์ ๋ณต์ก์ฑ์ ์ถ์ ํ ์ ์์ผ๋ฏ๋ก ์งํํ๋ ํ๋ก์ ํธ์์ ๋ณต์ก์ฑ ์์ค์ ๋ฎ๊ฒ ์ ์งํ๋ ๋ฐ ์ด์์ ์ธ ๋๊ตฌ์ ๋๋ค.
์ด ๋๊ตฌ๋ ๋ํ ๊ธฐ์กด ๊ฐ๋ฐ ์ํฌํ๋ก์ ์๋ฒฝํ๊ฒ ํตํฉ๋์ด ์ฝ๋ฉ ํ๋ก์ธ์ค ์ค์ ์ค์๊ฐ ํผ๋๋ฐฑ์ ์ ๊ณตํฉ๋๋ค. ๋ณต์กํ ์ฝ๋ ๊ตฌ์กฐ๋ฅผ ์์ฑํ๋ ๋๋ก ํ๋๊ทธ๋ฅผ ์ง์ ํ์ฌ SMART TS XL ๋ณต์ก์ฑ ๋ฌธ์ ๊ฐ ๋์ ๋๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค. ์ด๋ฌํ ์ฌ์ ์๋ฐฉ์ ์ ๊ทผ ๋ฐฉ์์ ํตํด ๊ฐ๋ฐ์๋ ์ค์๊ฐ์ผ๋ก ๋ณต์ก์ฑ์ ํด๊ฒฐํ์ฌ ๊ธฐ์ ๋ถ์ฑ๋ฅผ ์ค์ด๊ณ ์ฅ๊ธฐ์ ์ธ ์ฝ๋ ์ ์ง ๊ด๋ฆฌ๋ฅผ ๊ฐ์ ํ ์ ์์ต๋๋ค. ๋ํ, SMART TS XL ์๋ํ๋ ๋ณด๊ณ ๋ฅผ ์ง์ํ๊ณ ๋ณต์ก์ฑ ์ถ์ธ์ ๋ํ ์ ๊ธฐ์ ์ธ ์ ๋ฐ์ดํธ๋ฅผ ์ ๊ณตํ๋ฉฐ, ์ด๋ฅผ ํตํด ํ์ด ์งํ ์ํฉ์ ๋ชจ๋ํฐ๋งํ๊ณ ์ด์ ๋ฐ๋ผ ์ ๋ต์ ์กฐ์ ํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
์ฃผ์ ํน์ง SMART TS XL ์ํ ๋ณต์ก๋ ๊ด๋ฆฌ๋ฅผ ์ํด
SMART TS XL ํ์ด ์ฌ์ดํด๋ก๋งคํฑ ๋ณต์ก์ฑ์ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋๋ก ํน๋ณํ ์ค๊ณ๋ ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค. ๋๋๋ฌ์ง๋ ๊ธฐ๋ฅ ์ค ํ๋๋ ๋ณต์ก์ฑ ์ฆ๊ฐ์ ๊ธฐ์ฌํ๋ ๊ตฌ์ฑ ์์ ๊ฐ์ ์ํธ ์ข ์์ฑ์ ๊ฐ์งํ๋ ์ฌ์ธต ์ข ์์ฑ ๋ถ์์ ๋๋ค. ๊ฐ๋ฐ์๋ ์ด๋ฌํ ๊ด๊ณ๋ฅผ ์๋ณํ์ฌ ์ฝ๋๋ฅผ ๋ฆฌํฉํ ๋งํ์ฌ ๊ฒฐํฉ์ ์ค์ด๊ณ ์ ์ด ํ๋ฆ์ ๋จ์ํํ ์ ์์ต๋๋ค. SMART TS XL ๋ํ ํน์ ์ฝ๋๋ฒ ์ด์ค์ ๋ง๋ ๋ชจ๋ฒ ์ฌ๋ก ๊ถ์ฅ ์ฌํญ์ ์ ๊ณตํ์ฌ ๋ฆฌํฉํ ๋ง ์์ ์ด ์ ๊ณ ํ์ค์ ๋ถํฉํ๋๋ก ๋ณด์ฅํฉ๋๋ค.
๊ทธ ์์, SMART TS XL ์ ์ฒด ์ฝ๋๋ฒ ์ด์ค๊ฐ ์๋ ์ฝ๋ ๋ณ๊ฒฝ์ ์ด์ ์ ๋ง์ถ ์ฆ๋ถ์ ๋ณต์ก์ฑ ๋ถ์์ ์ง์ํฉ๋๋ค. ์ด ํ๊ฒํ ๋ ์ ๊ทผ ๋ฐฉ์์ ํตํด ํ์ ๊ฐ๋ฐ ์ฃผ๊ธฐ๋ฅผ ๋ฆ์ถ์ง ์๊ณ ๋ณต์ก์ฑ์ ๊ด๋ฆฌํ ์ ์์ต๋๋ค. ๊ณ ๊ธ ๋ณด๊ณ ๊ธฐ๋ฅ์ ํฌ๊ด์ ์ธ ๋ณต์ก์ฑ ๋งต์ ์์ฑํ์ฌ ํ์ด ๋ณต์ก์ฑ์ด ์ด๋ป๊ฒ ๋ถํฌ๋๋์ง ์๊ฐํํ๊ณ ๊ณ ์ํ ์์ญ์ ์๋ณํ ์ ์๋๋ก ํฉ๋๋ค. ์ด๋ฌํ ๋ณด๊ณ ์๋ ํ์ ์ ํธ๋์ ๋ฐ๋ผ ์ฌ์ฉ์ ์ ์ํ ์ ์์ด ๋ณต์ก์ฑ ๊ด๋ฆฌ ์ ๋ต์ด ๊ตฌํ๋๋ ๋ฐฉ์์ ์ ์ฐ์ฑ์ ์ ๊ณตํฉ๋๋ค.
์์ฝํ์๋ฉด, SMART TS XL ์ฌ์ดํด๋ก๋งคํฑ ๋ณต์ก์ฑ์ ๊ด๋ฆฌํ๋ ๋ฐ ํ์์ ์ธ ๋๊ตฌ๊ฐ ๋๋ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ ๋ชจ์์ ์ ๊ณตํฉ๋๋ค. ์ฌ์ธต ๋ถ์, ์ค์๊ฐ ํผ๋๋ฐฑ ๋ฐ ์๋ํ๋ ๋ณด๊ณ ๊ธฐ๋ฅ์ ํตํด ๊ฐ๋ฐํ์ ๊นจ๋ํ๊ณ ํจ์จ์ ์ด๋ฉฐ ํ์ฅ ๊ฐ๋ฅํ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ ์งํ ์ ์์ต๋๋ค. ํตํฉํ์ฌ SMART TS XL ์ด๋ฅผ ์ํฌํ๋ก์ ํตํฉํ๋ฉด ํ์ ๊ธฐ์ ๋ถ์ฑ๋ฅผ ์ค์ด๊ณ , ์ ์ง ๊ด๋ฆฌ์ฑ์ ๊ฐ์ ํ๊ณ , ์ํํธ์จ์ด ํ๋ก์ ํธ์ ์ฅ๊ธฐ์ ์ธ ์ฑ๊ณต์ ๋ณด์ฅํ ์ ์์ต๋๋ค.
๋งบ์๋ง
์ฌ์ดํด๋ก๋งคํฑ ๋ณต์ก์ฑ์ ๊ด๋ฆฌํ๋ ๊ฒ์ ๊ณ ํ์ง์ ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํ ์ํํธ์จ์ด๋ฅผ ๊ฐ๋ฐํ๋ ๋ฐ ์์ด ๊ธฐ๋ณธ์ ์ธ ์ธก๋ฉด์ ๋๋ค. ๋์ ๋ณต์ก์ฑ์ ํ์ฅ์ฑ์ ๋ฐฉํดํ๊ณ , ๊ฒฐํจ ์ํ์ ์ฆ๊ฐ์ํค๊ณ , ํ ์คํธ ๋ ธ๋ ฅ์ ๋ณต์กํ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๋ฉด ์ต์์ ์ฝ๋ฉ ๊ดํ, ์ ๋ต์ ๋ฆฌํฉํ ๋ง, ์ง์์ ์ธ ๋ชจ๋ํฐ๋ง์ ๊ฒฐํฉํ ์ฌ๋ ค ๊น์ ์ ๊ทผ ๋ฐฉ์์ด ํ์ํฉ๋๋ค. ๊ฐ๋ฐํ์ ์ฑ๋ฅ์ ์ ํ์ํค์ง ์์ผ๋ฉด์ ๋จ์์ฑ์ ๊ฐ์กฐํ๋ ๋ฐฉ๋ฒ๋ก ์ ์ฑํํด์ผ ํฉ๋๋ค. ๋๊ท๋ชจ ๊ธฐ๋ฅ ๋ถํด, ๋์์ธ ํจํด ์ ์ฉ, ์ ์ด ๊ตฌ์กฐ ๋จ์ํ์ ๊ฐ์ ๊ธฐ์ ์ ๋ณต์ก์ฑ์ ์ค์ด๋ ๋ฐ ํฌ๊ฒ ๊ธฐ์ฌํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ง์ ๊ฐ๋ฅํ ๋ณต์ก์ฑ ๊ด๋ฆฌ๋ฅผ ๋ฌ์ฑํ๋ ค๋ฉด ์๋ ๊ดํ ์ด์์ด ํ์ํฉ๋๋ค. ๊ฐ๋ฐ ์ํฌํ๋ก์ ์ํํ๊ฒ ํตํฉ๋์ด ์ค์๊ฐ ํต์ฐฐ๋ ฅ๊ณผ ์คํ ๊ฐ๋ฅํ ๊ถ์ฅ ์ฌํญ์ ์ ๊ณตํ๋ ์ ๋ขฐํ ์ ์๋ ๋๊ตฌ๊ฐ ํ์ํฉ๋๋ค. ์ด๋ฌํ ๋๊ตฌ๊ฐ ์์ผ๋ฉด ๋ณต์ก์ฑ์ด ์ถ์ ๋์ด ํ๋ก์ ํธ ์ผ์ ๊ณผ ์ํํธ์จ์ด ์์ ์ฑ์ ์ํํ๋ ๊ธฐ์ ๋ถ์ฑ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
SMART TS XL ์ฌ์ดํด๋ก๋งคํฑ ๋ณต์ก์ฑ์ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ๋ ค๋ ํ์๊ฒ ์์ด์๋ ์ ๋ ์๋ฃจ์ ์ผ๋ก ๋ถ์ํ์ต๋๋ค. ์ฌ์ธต์ ์ธ ์ฝ๋ ๋ถ์, ์ค์๊ฐ ํผ๋๋ฐฑ ๋ฐ ์๋ํ๋ ๋ณด๊ณ ๊ธฐ๋ฅ์ ํตํด ๊ฐ๋ฐ์๋ ๋ณต์ก์ฑ ๋ฌธ์ ๋ฅผ ์ฌ์ ์ ๊ฐ์งํ๊ณ ํด๊ฒฐํ ์ ์์ต๋๋ค. ์์ธํ ๋ณต์ก์ฑ ๋งต์ ์์ฑํ๊ณ ์ค์ํ ์ข ์์ฑ์ ๊ฐ์กฐํ๋ ์ด ๋๊ตฌ์ ๊ธฐ๋ฅ์ ๋ฆฌํฉํ ๋ง ์์ ์ค์ ์ ๋ณด์ ์ ๊ฐํ ์์ฌ ๊ฒฐ์ ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ๋ํ ์ฆ๋ถ ๋ถ์์ ์ง์คํจ์ผ๋ก์จ SMART TS XL ๋ณต์ก์ฑ ๊ด๋ฆฌ๊ฐ ๊ฐ๋ฐ ์๋๋ฅผ ๋ฐฉํดํ์ง ์๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ํํธ์จ์ด ํ๋ก์ ํธ๊ฐ ์ฑ์ฅํ๊ณ ๋ฐ์ ํจ์ ๋ฐ๋ผ ๊ฐ๋ ฅํ ์ ์ ์ฝ๋ ๋ถ์ ๋๊ตฌ์ ์ญํ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. SMART TS XL ๋์ฑ ์ค์ํด์ง๋๋ค. ํตํฉ SMART TS XL ๊ฐ๋ฐ ์ํฌํ๋ก์ ์ฝ๋๋ฒ ์ด์ค๋ฅผ ์ ๋ฆฌํ๊ณ , ํ์ฅ ๊ฐ๋ฅํ๋ฉฐ, ์ ์ง ๊ด๋ฆฌํ๊ธฐ ์ฝ๊ฒ ์ ์งํ์ฌ ๊ถ๊ทน์ ์ผ๋ก ์ํํธ์จ์ด์ ์ฅ๊ธฐ์ ์ธ ์ฑ๊ณต๊ณผ ๊ธฐ์ ๋ถ์ฑ ๊ฐ์์ ๊ธฐ์ฌํฉ๋๋ค.