web study/배경지식
전략 패턴이란
65살까지 코딩
2023. 5. 24. 22:45
728x90
반응형
전략 패턴이란
컨텍스트(변하지 않는 부분) 안에서 전략(변하는 부분)을 전달받아 실행하는 패턴이다. 전략은 컨텍스트에서 인터페이스로 존재하며 여러 전략들이 인터페이스를 구현하여 컨텍스트에 주입되어 사용하게된다. 스프링에서 자주사용하는 DI도 전략패턴의 예라고 할 수 있다.
전략 패턴은 추상 클래스를 사용하는 템플릿 메소드 패턴와 달리 인터페이스를 사용하기 때문에 OCP 원칙에 좀 더 알맞고 부모클래스와의 의존관계가 없기 때문에 느슨한 결합을 추구할 수 있다.
언제사용할까?
변하는 로직과 변하지 않는 부분이 로직이 존재하고, 변하지 않는 로직에서 변하는 로직을 여러개로 갈아 끼울때, 예를들어 게시판을 만드는 서비스에서 mysql도 사용하고 싶고 mongodb도 사용하고 싶다면 board라는 컨텍스트가 있을 것이고 db라는 strategy interface를 만들고 mysql과 mogodb 전략을 갈아끼우며 사용할 수 있을 것이다.
컨텍스트에서 전략을 어떻게 주입할 수 있을까
- 생성자로 주입 받을 수 있다. ( 동적으로 전략을 바꾸는 것이 힘듦 -> setter을 통해 바꿀 수 있으나 동서성 이슈 차라리 여러가지 컨텍스트를 만드는 것이 차라리 나음)
- 파라미터로 주입받아 사용하기.
생성자로 주입하기
@Test
void strategyV1(){
StrategyLogic1 strategyLogic1 = new StrategyLogic1();
ContextV1 context1 = new ContextV1(strategyLogic1);
context1.execute();
StrategyLogic2 strategyLogic2 = new StrategyLogic2();
ContextV1 context2 = new ContextV1(strategyLogic2);
context2.execute();
}
@Test
void strategyV2(){
ContextV1 context1 = new ContextV1(() -> log.info("비즈니스 로직1 실행"));
context1.execute();
ContextV1 context2 = new ContextV1(() -> log.info("비즈니스 로직2 실행"));
context2.execute();
}
파라미터로 주입하기
@Test
void strategyV1(){
ContextV2 context1 = new ContextV2();
context1.execute(new StrategyLogic1());
context1.execute(new StrategyLogic2());
}
@Test
void strategyV2(){
ContextV2 context1 = new ContextV2();
context1.execute(() -> log.info("비즈니스 로직 1 실행"));
context1.execute(() -> log.info("비즈니스 로직 2 실행"));
}
참고로 strategyV2()와 같이 전략패턴을 사용하면서 람다로 콜백함수를 넘겨주는 방식을 템플릿 콜백 패턴이라고 한다( redisTempalte, jdbcTemplate, redistTemplate) 등에서 나오는 그 template과 일치하다.
728x90
반응형