์ˆœํ™˜ ๋ณต์žก๋„

์ˆœํ™˜ ๋ณต์žก๋„์˜ ๊ธฐ๋ณธ๊ณผ ๋ชจ๋“  ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ์•Œ์•„์•ผ ํ•˜๋Š” ์ด์œ 

์ธ์ปด 2024๋…„ ๏ผ’์›” 20์ผ

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 ๊ฐœ๋ฐœ ์›Œํฌํ”Œ๋กœ์— ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์ •๋ฆฌํ•˜๊ณ , ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๋ฉฐ, ์œ ์ง€ ๊ด€๋ฆฌํ•˜๊ธฐ ์‰ฝ๊ฒŒ ์œ ์ง€ํ•˜์—ฌ ๊ถ๊ทน์ ์œผ๋กœ ์†Œํ”„ํŠธ์›จ์–ด์˜ ์žฅ๊ธฐ์ ์ธ ์„ฑ๊ณต๊ณผ ๊ธฐ์ˆ  ๋ถ€์ฑ„ ๊ฐ์†Œ์— ๊ธฐ์—ฌํ•ฉ๋‹ˆ๋‹ค.