본문 바로가기

Spring

[Spring] 전략 패턴

GOF 디자인 패턴에서 정의한 전략 패턴의 의도

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

전략 패턴은 변하지 않는 로직(부가 기능)을 Context라는 곳에 두고, 변하는 부분(핵심 기능)을 Strategy 라는 인터페이스를 만들고 해당 인터페이스를 구현하도록 하여 문제를 해결한다.

-> 상속이 아닌 위임으로 템플릿 메서드 패던의 문제 해결

Context - 변하지 않는 템플릿 역할

Strategy - 변하는 알고리즘

// 템플릿 역할을 할 Context.class
class Context{

	fun template(strategy: Strategy){
    	//부가 기능
	    strategy.logic() // 비즈니스 로직
        //부가 기능
    }
}

// 구현해야할 비즈니스 로직을 가지고 있는 인터페이스
Interface Strategy{
	
    fun logic()
}

// 비즈니스 로직을 구현할 StrategyLogic.class
Class StrategyLogic(): Strategy{
	
    override fun logic(){
    	// 비즈니스 로직 구현
    }
}

// 사용
Class class(){
	
    fun use(){
    	// 클래스를 생성하여 구현
    	val context = Context()
        val strategyLogic = StrategyLogic()
        context.template(strategyLogic)
        
        // or
        // 익명 추상 클래스 사용
        val context = Context()
        context.template(object: Strategy{
        	override fun logic(){
            	// 비즈니스 로직 구현
            }
        }
    }
}
  • 템플릿 역할의 Context의 코드가 변해도 비즈니스 로직 구현에 영향을 끼치지 않는다.
  • 실행 시 마다 로직을 유연하게 바꿀 수 있다. (단점이자 장점)

템플릿 콜백 패턴

- 콜백이란 다른 코드의 인수로서 넘겨주는 실행 가능한 코드를 말한다. 콜백을 넘겨받는 코드는 이 콜백을 필요에 따라 즉시 실행할 수 있고, 나중에 실행할 수도 있다.( = 전략 패턴 )

- 스프링에서 xxxTemplete 클래스들을 템플릿 콜백 패턴을 적용하여 구현