<Spring> 전략 패턴

라모스·2022년 6월 19일
0

Spring☘️

목록 보기
12/18
post-thumbnail

전략 패턴

템플릿 메서드 패턴은 부모 클래스에 변하지 않는 템플릿을 두고, 변하는 부분을 자식 클래스에 두어서 상속을 사용해 문제를 해결했다.

전략 패턴은 변하지 않는 부분을 Context라는 곳에 두고, 변하는 부분을 Strategy라는 인터페이스를 만들고 해당 인터페이스를 구현하도록 해서 문제를 해결한다. 상속이 아니라 위임으로 문제를 해결하는 것이다. Context는 변하지 않는 템플릿 역할, Strategy는 변하는 알고리즘 역할을 한다.

"동일 계열의 알고리즘군을 정의하고 각각을 캡슐화하여 상호 교환 가능하게 만들자. 전략을 사용하면 알고리즘을 사용하는 클라이언트와 독립적으로 알고리즘을 변경할 수 있다."
[GoF의 디자인 패턴 中]

예제

Strategy 인터페이스와 구현체들은 다음과 같이 작성할 수 있다.

public interface Strategy {
    void call();
}


@Slf4j
public class StrategyLogic1 implements Strategy {
    @Override
    public void call() {
        log.info("비즈니스 로직1 실행");
    }
}


@Slf4j
public class StrategyLogic2 implements Strategy {
    @Override
    public void call() {
        log.info("비즈니스 로직2 실행");
    }
}

변하지 않는 로직을 가지고 있는 템플릿 역할을 하는 Context는 다음과 같다. 컨텍스트(문맥)는 크게 변하지 않지만, 그 문맥 속에서 strategy를 통해 일부 전략이 변경된다 생각하면 된다.

@Slf4j
public class ContextV1 {
    private Strategy strategy;
    
    public ContextV1(Strategy strategy) {
        this.strategy = strategy;
    }
    
    public void execute() {
        long startTime = System.currentTimeMillis();
        // 비즈니스 로직 실행
        strategy.call(); // 위임
        // 비즈니스 로직 종료
        long endTime = System.currentTimeMillis();
        long resultTime = endTime - startTime;
        log.info("resultTime={}", resultTime);
    }
}

@Test
void strategyV1() {
    Strategy strategyLogic1 = new StrategyLogic1();
    ContextV1 context1 = new ContextV1(strategyLogic1);
    context1.execute();
    
    Strategy strategyLogic2 = new StrategyLogic2();
    ContextV1 context2 = new ContextV1(strategyLogic2);
    context2.execute();
}

코드를 보면 의존관계 주입을 통해 ContextV1 Strategy의 구현체인 strategyLogic1을 주입하는 것을 확인할 수 있는데, 이런 방식으로 Context 안에 원하는 전략을 주입한다. 원하는 모양으로 조립을 완료하고 난 다음에 context1.execute()를 호출해서 context를 실행한다.
// 선조립, 후실행 방식과 전략을 파라미터로 전달 받는 방식을 비교하여 알아두자

정리

전략 패턴은 변하지 않는 부분을 context 쪽에 두고 변하는 부분을 strategy로 추출하여 조립하는 방식으로 구현한다. 의존의 방향이 템플릿 메서드 패턴과는 반대로 변하지 않는 부분에서 변하는 부분으로 향하지만, 구현체에 직접 의존하는 것이 아닌 추상화된 인터페이스에 의존하게 함으로써 변경의 유연함을 확보할 수 있다.

전략 패턴을 바탕으로 SOLID 원칙의 OCP, DIP, SRP가 지켜지는 점을 확인할 수 있다.

References

profile
Step by step goes a long way.

0개의 댓글