๊ธ€ ์ž‘์„ฑ์ž: ๊ฐœ๋ฐœํ•˜๋Š” ํ›ˆ์ด

์ „๋žต ํŒจํ„ด(Strategy Pattern)

์ „๋žต ํŒจํ„ด์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ง‘ํ•ฉ(Algorithm Family)์„ ์‚ฌ์šฉํ•˜๋Š” ํ–‰์œ„ ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ฐ๊ฐ ๊ฐ์ฒด๋กœ ์บก์Šํ™”ํ•˜๊ณ , ๋™์ผํ•œ ๋ชฉ์ ์„ ํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์„ ํ•˜๋‚˜์˜ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ฌถ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์ด ํด๋ผ์ด์–ธํŠธ ๊ฐ์ฒด์—์„œ ๊ต์ฒด๋˜๋ฉด์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ํด๋ผ์ด์–ธํŠธ ๊ฐ์ฒด์— ๋…๋ฆฝ์ ์œผ๋กœ ๊ตฌ์„ฑ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋Š์Šจํ•œ ์—ฐ๊ฒฐ(Decoupling)์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ฃ .

 

๋Š์Šจํ•˜๊ฒŒ ์—ฐ๊ฒฐ๋œ๋‹ค๋Š” ๊ฒƒ์€ ํด๋ผ์ด์–ธํŠธ ๊ฐ์ฒด๊ฐ€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ๋ณ€ํ•˜๊ฒŒ ๋  ๋•Œ, ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๊ฒŒ ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ˆ˜์ •๋˜์–ด์•ผ ํ•œ๋‹ค๋ฉด, ์บก์Šํ™”๋œ ํ•ด๋‹น ์•Œ๊ณ ๋ฆฌ์ฆ˜๋งŒ ์ˆ˜์ •ํ•˜๊ฒŒ ๋˜๊ณ , ๋‚ด๋ถ€์ ์œผ๋กœ ์–ด๋–ป๊ฒŒ ์ˆ˜์ •๋˜๊ณ  ์–ด๋–ป๊ฒŒ ๊ตฌํ˜„๋˜์–ด ์žˆ๋Š”์ง€ ํด๋ผ์ด์–ธํŠธ ๊ฐ์ฒด๋Š” ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด๋ด…์‹œ๋‹ค.

์–ด๋–ค ๋ฌธ์ž์—ด์ด ๋“ค์–ด์™”์„ ๋•Œ, ์กฐ๊ฑด์„ ๊ฒ€์‚ฌํ•ด์ฃผ๋Š” Validator ๊ฐ์ฒด๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•ด๋ณผ๊ฒŒ์š”. ์ฒ˜์Œ์—๋Š” ๋ณ„ ๋ฌธ์ œ๊ฐ€ ์—†๊ฒ ์ง€๋งŒ, ๋งŒ์•ฝ ์ถ”๊ฐ€์ ์ธ ์š”๊ตฌ์‚ฌํ•ญ์ด ์ƒ๊ฒจ์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ถ”๊ฐ€๋œ๋‹ค๋ฉด ์–ด๋–จ๊นŒ์š”? ๊ทธ๋•Œ ์šฐ๋ฆฌ๋Š” ์•„๋งˆ๋„ Validator ๊ฐ์ฒด์— ์ƒˆ๋กœ์šด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ถ”๊ฐ€ํ•˜๊ฒ ์ฃ . 

 

ํ•˜์ง€๋งŒ ์ด๋Ÿฐ ๋ฐฉ๋ฒ•์€ ๊ฐœ๋ฐฉ ํ์‡„ ์›์น™(OCP)์— ์–ด๊ธ‹๋‚ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด ๊ฐ์ฒด์— ๋ณ€๊ฒฝ์‚ฌํ•ญ์ด ์ƒ๊ธฐ๊ธฐ ๋•Œ๋ฌธ์ด์ฃ .

 

 

๋”ฐ๋ผ์„œ ์ „๋žต ํŒจํ„ด์€ ํด๋ผ์ด์–ธํŠธ ๊ฐ์ฒด๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ง‘ํ•ฉ์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง€๊ณ , ๊ตฌ์ฒด์ ์ธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ•„์š”์— ๋”ฐ๋ผ ์ฃผ์ž…ํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

 

์ด๋Ÿฐ ๋””์ž์ธ ํŒจํ„ด์„ ์‚ฌ์šฉํ•˜๋ฉด ๋งŒ์•ฝ ์ƒˆ๋กœ์šด ์š”๊ตฌ์‚ฌํ•ญ์— ๋”ฐ๋ผ Validator๊ฐ€ ์•„์Šคํ‚ค ์ฝ”๋“œ๋ฅผ ๊ฒ€์‚ฌํ•˜๊ฒŒ ๋œ๋‹ค๊ณ  ํ•˜๋”๋ผ๋„ ์•„๋ž˜์™€ ๊ฐ™์ด ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์„ ํ†ตํ•ด์„œ ๊ฐœ๋ฐฉ ํ์‡„ ์›์น™์„ ์ง€ํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๊ตฌํ˜„ํ•ด๋ณด๊ธฐ

๊ทธ๋Ÿผ ์œ„์—์„œ ์ •๋ฆฌํ•œ ์ปจ์…‰์„ ๊ทธ๋Œ€๋กœ ๊ตฌํ˜„ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๋จผ์ €, ํด๋ผ์ด์–ธํŠธ ๊ฐ์ฒด์™€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋  ํ”„๋กœํ† ์ฝœ์„ ์ •์˜ํ• ๊ฒŒ์š”.

 

protocol Validatable {
    func validate(text: String) -> Bool
}

protocol Validator {
    var validationStrategy: Validatable { get set }
    func validate(text: String) -> Bool
}

Validatable ํ”„๋กœํ† ์ฝœ์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๋  ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค. validate ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•˜๊ณ  ์žˆ๊ณ , ์ธ์ž๋กœ ๋ฌธ์ž์—ด์„ ๋ฐ›์œผ๋ฉด ์ ์ ˆํ•œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜ํ–‰ํ•œ ๋’ค์— Bool ํƒ€์ž… ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ๊ฐ•์ œํ•˜๊ณ  ์žˆ์–ด์š”. ์ „๋žต์— ํ•ด๋‹นํ•˜๋Š” ๊ฐ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์€ ์ด ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•ด validate๋ฅผ ๊ตฌํ˜„ํ•˜๋ฉด ๋˜๊ฒ ์ฃ .

 

Validator ํ”„๋กœํ† ์ฝœ์€ ํด๋ผ์ด์–ธํŠธ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€์— ๋Œ€ํ•œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค. validationStrategy ํ”„๋กœํผํ‹ฐ๋ฅผ ํ†ตํ•ด์„œ Validatable ํƒ€์ž…, ์ฆ‰, ๊ฒ€์ฆ์— ์‚ฌ์šฉํ•  ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ฐ€์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Validator๋„ validation ๋ฉ”์„œ๋“œ๋ฅผ ๊ฐ€์ง€๋Š”๋ฐ์š”, ์ด๋ฒˆ์—๋Š” ์‹ค์ œ๋กœ ์‚ฌ์šฉ์ž๊ฐ€ ํ˜ธ์ถœํ•˜๊ณ  ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋  ๋ฉ”์„œ๋“œ์ž…๋‹ˆ๋‹ค.

 

final class StringValidator: Validator {
    var validationStrategy: Validatable
    
    init(strategy: Validatable) {
        self.validationStrategy = strategy
    }
    
    func change(strategy: Validatable) {
        self.validationStrategy = strategy
    }
    
    func validate(text: String) -> Bool {
        return validationStrategy.validate(text: text)
    }
}

์ด์ œ ํด๋ผ์ด์–ธํŠธ ๊ฐ์ฒด์˜ ๊ตฌ์ฒดํƒ€์ž…์„ ์ •์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. StringValidator๋Š” Validator ํ”„๋กœํ† ์ฝœ์„ ์ฑ„ํƒํ•ด ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋Š”๋ฐ์š”, validate ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๊ฒ€์ฆ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜ํ–‰ํ•˜๊ณ , change ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ํ˜„์žฌ ์‚ฌ์šฉํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋‹ค๋ฅธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. 

 

์—ฌ๊ธฐ์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ validate ๋ฉ”์„œ๋“œ๋ฅผ ๋‹ค์‹œ ๋ณผ๊ฒŒ์š”.

func validate(text: String) -> Bool {
    return validationStrategy.validate(text: text)
}

validate ๋ฉ”์„œ๋“œ๋Š” ๋‚ด๋ถ€์— ์–ด๋–ค ์•Œ๊ณ ๋ฆฌ์ฆ˜๋„ ๊ฐ€์ง€์ง€ ์•Š์•„์š”. ๋Œ€์‹  ์ž์‹ ์ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ „๋žต(validationStrategy)๊ฐ€ ๊ฐ€์ง„ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‹คํ–‰ํ•ด์„œ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜ํ•˜์ฃ . ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ตฌํ˜„๊ณผ ๊ทธ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฐ์ฒด๊ฐ€ ์™„์ „ํ•˜๊ฒŒ ๋ถ„๋ฆฌ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

 

๊ทธ๋Ÿผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ตฌํ˜„ํ•ด์ฃผ์–ด์•ผ๊ฒ ์ฃ ?

class NumberValidator: Validatable {
    func validate(text: String) -> Bool {
        return text.allSatisfy({ $0.isNumber })
    }
}

class LengthValidator: Validatable {
    func validate(text: String) -> Bool {
        return text.count < 10
    }
}

์ผ๋‹จ Validatable์„ ์ฑ„ํƒํ•˜๋Š” ๋‘ ๊ฐœ์˜ ํƒ€์ž…์„ ๋งŒ๋“ค์—ˆ์–ด์š”. ๊ทธ๋ฆฌ๊ณ  ๊ฐ๊ฐ ๋ฌธ์ž์—ด์˜ ๋ชจ๋“  ๋ฌธ์ž๊ฐ€ ์ˆซ์ž์ธ์ง€ ํ™•์ธํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๊ฐ€ 10 ๋ฏธ๋งŒ์ธ์ง€ ํ™•์ธํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ •์˜ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.

 

let validator = StringValidator(strategy: LengthValidator())
print(validator.validate(text: "12345678910")) // false

validator.change(strategy: NumberValidator())
print(validator.validate(text: "12345678910")) // true

ํด๋ผ์ด์–ธํŠธ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ƒ์„ฑ์ž๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•  ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ฃผ์ž…ํ•˜๊ฑฐ๋‚˜, change ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉํ•  ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค. 

 

์ƒˆ๋กœ์šด ์ „๋žต์˜ ์ถ”๊ฐ€

๊ฝค ๊ฐ„๋‹จํ•˜๊ฒŒ ์ „๋žต ํŒจํ„ด์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์—ˆ๋Š”๋ฐ์š”, ์ด๋ฒˆ์—๋Š” ์œ„์—์„œ ์ •๋ฆฌํ•˜๋ฉด์„œ ์ด์•ผ๊ธฐํ–ˆ๋˜๋Œ€๋กœ ์ƒˆ๋กœ์šด ์š”๊ตฌ์‚ฌํ•ญ์ด ํ•˜๋‚˜ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค๊ณ  ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ์—๋Š” StringValidator๊ฐ€ ๋ฌธ์ž์—ด์˜ ๋ชจ๋“  ๋ฌธ์ž๊ฐ€ ์•„์Šคํ‚ค ์ฝ”๋“œ๋กœ ํ‘œํ˜„์ด ๊ฐ€๋Šฅํ•œ์ง€ ํ™•์ธํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ถ”๊ฐ€๋˜์–ด์•ผ ํ•ด์š”.

 

class AsciiValidator: Validatable {
    func validate(text: String) -> Bool {
        return text.allSatisfy({ $0.isASCII })
    }
}

๋”ฐ๋ผ์„œ Validatable์„ ์ฑ„ํƒํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์บก์Šํ™”ํ•œ ๊ฐ์ฒด๋ฅผ ์ƒˆ๋กœ ํ•˜๋‚˜ ๋งŒ๋“ค๊ณ ,

 

validator.change(strategy: AsciiValidator())
print(validator.validate(text: "12345678910")) // true

ํด๋ผ์ด์–ธํŠธ ๊ฐ์ฒด์— ์ฃผ์ž…ํ•ด์ฃผ๊ธฐ๋งŒ ํ•˜๋ฉด ์ƒˆ๋กœ์šด ์š”๊ตฌ์‚ฌํ•ญ์„ ๋งŒ์กฑ์‹œํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งŒ์•ฝ ์ถ”๊ฐ€ํ•ด์•ผํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด ์ˆ˜์‹ญ๊ฐ€์ง€๋ผ๋ฉด ๊ธฐ์กด ๊ฐ์ฒด๋ฅผ ์ˆ˜์ •ํ•˜์ง€ ์•Š๊ณ  ์‰ฝ๊ฒŒ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ฒ ์ฃ .

 

๋งŒ์•ฝ ๋ชจ๋“  ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ํ•œ๋ฒˆ์— ์ˆ˜ํ–‰ํ•ด์•ผํ•œ๋‹ค๊ณ  ํ•˜๋”๋ผ๋„ ์•„๋ž˜์ฒ˜๋Ÿผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋‹ˆ๊นŒ์š”.

func validateAll(text: String) -> Bool {
    let strategies: [Validatable] = [LengthValidator(), NumberValidator(), AsciiValidator()]
    return strategies.filter({ strategy in
        return StringValidator(strategy: strategy).validate(text: text)
    }).isEmpty
}

print(validateAll(text: "12345678910")) // false

 

์ •๋ฆฌ

์ „๋žต ํŒจํ„ด์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์„ ์บก์Šํ™”ํ•ด์„œ ํด๋ผ์ด์–ธํŠธ ๊ฐ์ฒด๋กœ๋ถ€ํ„ฐ ๋ถ„๋ฆฌํ•˜๊ณ , ๊ฐ™์€ ๋ชฉ์ ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋“ค์„ ํ•˜๋‚˜์˜ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ฌถ์–ด ๊ฐ์ฒด๊ฐ€ ํ•„์š”์— ๋”ฐ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด์ด์—ˆ์Šต๋‹ˆ๋‹ค. 

 

์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์™„์ „ํžˆ ๋ถ„๋ฆฌ๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ณ€๊ฒฝ๊ณผ ํ™•์žฅ์— ์œ ์—ฐํ•˜๊ณ  OCP๋ฅผ ๋”ฐ๋ฅด๋Š” ๋””์ž์ธ ํŒจํ„ด์ž…๋‹ˆ๋‹ค. ์‚ฌ์‹ค ๋”ฐ์ง€๊ณ  ๋ณด๋ฉด SRP, DIP, SIP, LSP๋„ ๋ชจ๋‘ ๋”ฐ๋ฅด๊ณ  ์žˆ์–ด์š”.

 

์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์ˆ˜ํ–‰์„ ์บก์Šํ™”๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๊ฐ์ฒด์—, ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ์„ ํƒ์€ ํด๋ผ์ด์–ธํŠธ ๊ฐ์ฒด๋กœ ๋‚˜๋ˆ„๊ณ  ์žˆ์–ด ๋‹จ์ผ ์ฑ…์ž„ ์›์น™(SRP)์„ ๋”ฐ๋ฅด๊ณ ,

ํด๋ผ์ด์–ธํŠธ ๊ฐ์ฒด๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ธํ„ฐํŽ˜์ด์Šค์— ์˜์กดํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜์กด์„ฑ ์—ญ์ „ ์›์น™(DIP) ๋”ฐ๋ฅด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ฐ ์ธํ„ฐํŽ˜์ด์Šค๋Š” Alogrithm Family๋ฅผ ํ‘œํ˜„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ธํ„ฐํŽ˜์ด์Šค ๋ถ„๋ฆฌ ์›์น™(SIP)๋„ ๋”ฐ๋ฅด๊ณ ,

์œ„ ์˜ˆ์ œ์—์„œ๋Š” LSP๊ฐ€ ๋ช…ํ™•ํžˆ ๋‚˜ํƒ€๋‚˜์ง€๋Š” ์•Š์ง€๋งŒ, ์–ธ์ œ๋‚˜ ๊ฐ™์€ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ•˜์œ„ ํƒ€์ž…๊ณผ ์ƒ์œ„ ํƒ€์ž…์ด ์น˜ํ™˜ ๊ฐ€๋Šฅํ•œ ๋ฆฌ์Šค์ฝ”ํ”„ ์น˜ํ™˜ ์›์น™(LSP)์„ ๋”ฐ๋ฅด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

์ „๋žต ํŒจํ„ด์€ ํ•œ ๊ฐ์ฒด๊ฐ€ ๋น„์Šทํ•œ ๋ชฉ์ ์„ ๊ฐ€์ง€๋Š” ์—ฌ๋Ÿฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋Ÿฐํƒ€์ž„์— ์„ ํƒ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ๋  ๋•Œ ๋ถ„๊ธฐ ์ฒ˜๋ฆฌ๋ฅผ ์ค„์ด๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉํ•ด๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์•„์š”.