본문 바로가기
프로그래밍/kotlin

[디자인 패턴] 전략 패턴이란

by 뜨끔쓰 2022. 9. 15.
728x90
728x90
인프런의 김영한님의 강의 스프링 핵심 원리 - 고급편을 학습하며 정리한 글입니다.

 

스프링 핵심 원리 - 고급편 (인프런)

 

스프링 핵심 원리 - 고급편 - 인프런 | 강의

스프링의 핵심 원리와 고급 기술들을 깊이있게 학습하고, 스프링을 자신있게 사용할 수 있습니다., - 강의 소개 | 인프런...

www.inflearn.com

 

전략 패턴이란?

직전글 템플릿 메서드 패턴은 부모 클래스에 변하지 않는 템플릿을 두고, 변하는 부분을 자식 클래스에 두어 상속을 사용해서 문제를 해결했는데 전략패턴은 변하지 않는 부분을 Context라는 곳에 두고, 변하는 부분을 Strategy라는 인터페이스를 만들고 해당 인터페이스를 구현해도록 해서 문제를 해결 한다.

※ 상속이 아니라 위임으로 문제를 해결

 

전략 패턴의 구성

알고리즘 제품군을 정의하고 각각을 캡슐화하여 상호 교환 가능하게 만드는 것
전략을 사용하면 알고리즘을 사용하는 클라이언트와 독립적으로 알고리즘을 변경할 수 있다.

대략 정의는 이와 같으며 코드로 한번 확인해보도록 합시다.

우선 변하는 알고리즘 역할을 하는 인터페이스를 생성해봅시다.


 

Strategy 클래스
interface Strategy {
    fun call()
}

 

이제 변하지 않는 로직을 가지고 있는 템플릿 역할을 하는 클래스 ContextV1을 작성해보자

ContextV1
class ContextV1(
    private val strategy: Strategy,
) {
    private val log = LoggerFactory.getLogger(ContextV1::class.java)

    fun execute() {
        val startTime = System.currentTimeMillis()
        //비즈니스 로직 실행
        strategy.call() //위임
        //비즈니스 로직 종료

        val endTime = System.currentTimeMillis()
        val resultTime = endTime - startTime
        log.info("resultTime={}", resultTime)
    }

}

전략패턴에서는 이것을 컨텍스트(문맥)이라고 한다. 컨텍스트는 크게 변하지 않지만, 그 안에서 strategy를 통해 일부 전략만 쉽게 변경 할 수 있다.

 

 

이제 변하는 알고리즘으로 Strategy 인터페이스를 구현 할 클래스를 작성한다.

 

StrategyLogic1
class StrategyLogic1: Strategy {

    private val log = LoggerFactory.getLogger(StrategyLogic1::class.java)

    override fun call() {
        log.info("비즈니스 로직1 실행")
    }
}

 

2개의 클래스를 보면 대단한 로직은 존재 하지 않으며 테스트 용도로 간단히 작성되어있습니다.

 

이렇게 작성한 후 테스트 코드로 검증을 해보도록 합시다.

 

StrategyTest

 

    @Test
    fun strategyTest() {

        /* 직접 클래스를 생성하여 Strategy 인터페이스를 상속받아 구현한다 */
        val strategyLogic1 = StrategyLogic1()
        val contextV1 = ContextV1(strategyLogic1)
        contextV1.execute()

        /* 익명 내부 클래스로 구현 */
        val context2 = ContextV1(object : Strategy {
            override fun call() {
                log.info("비즈니스 로직2 실행")
            }
        })
        context2.execute()
    }

이렇게 직접 클래스를 생성하여 구현하거나 또는 익명내부 클래스로 만들어서 사용 할 수 있다.

 

 

전략패턴을 보면 스프링에서 의존관계 주입에서 사용하는 방식이라고 한다. 내가 봐도 비슷한 형태로 구성되는 것 같다.

 

선조립 후 실행 하는 방법이며 Context를 실행하는 시점에 전략을 신경쓰지 않고 단순히 실행만하면 된다.

 

디자인 패턴을 배우면 배울 수록 기존에 배웠던 디자인패턴과 헷갈리는 경우가 생기는 것 같은데 확실히 복습을 통하여 정리를 꾸준히 해서 내것으로 만들도록 노력해야 할 것 같다.

 

 

728x90
반응형

댓글