스프링 디자인패턴 그리고 전략 패턴
1) 스프링 디자인 패턴이란?
- 스프링 디자인 패턴이란 실제 개발 요구 사항을 해결하면서 만들어진 다양한 해결책 중에서
사람들이 인정한 '베스트 프랙티스'를 모아둔 것입니다.
스프링 디자인 패턴은 객체 지향 특성과 설계 원칙에 기반해서 구현되어 있습니다.
따라서 스프링 디자인 패턴을 이해하기 위해서는
객체 지향의 4대 특성(상속, 추상화, 다형성, 캡슐화)과 설계 원칙(SOLID)에 대해 알아야 합니다.
2) 전략 패턴
- 이번 글에서는 스프링 디자인 패턴 중 대표적인 것 중 하나인 전략 패턴을 알아보겠습니다.
전략 패턴을 이해하려면, 우선 전략 패턴을 구성하는 3가지 요소에 대해 알아야 합니다.
(1) 전략 메서드를 가진 전략 객체
(2) 전략 객체를 사용하는 컨텍스트
(3) 전략 객체를 생성해 컨텍스트에 주입하는 클라이언트
즉, 클라이언트는 다양한 전략 중 하나를 선택해 컨텍스트에 주입합니다.
예시 코드를 통해서 알아보겠습니다.
[전략 인터페이스]
package strategyPattern;
public interface Strategy{
public abstract void runStrategy();
}
[전략 인터페이스를 구현하는 StrategyGun.java]
package strategyPattern;
public class StrategyGun implements Strategy {
@Override
public void runStrategy(){
System.out.println("탕, 타당, 타다당");
}
}
[전략 인터페이스를 구현하는 StrategySword.java]
package strategyPattern;
public class StrategySword implements Strategy {
@Override
public void runStrategy(){
System.out.println("챙... 채채챙 챙챙");
}
}
[전략 인터페이스를 구현하는 StrategyBow.java]
package strategyPattern;
public class StrategyBow implements Strategy {
@Override
public void runStrategy(){
System.out.println("슝... 쐐액.. 쉑");
}
}
[전략을 사용하는 컨텍스트 Soldier.java]
package strategyPattern;
public class Soldier{
void runContext(Strategy strategy){
System.out.println("전투 시작");
strategy.runStrategy();
System.out.println("전투 종료");
}
}
[전략 패턴의 클라이언트 Client.java]
package strategyPattern;
public class Client{
public static void main(String[] args){
Strategy strategy = null;
Soldier rambo = new Soldier();
// 총을 람보에게 전달해서 전투를 수행하게 한다.
strategy = new StrategyGun();
rambo.runContext(strategy);
System.out.println();
// 칼을 람보에게 전달해서 전투를 수행하게 한다.
strategy = new StrategySword();
rambo.runContext(strategy);
System.out.println();
// 활을 람보에게 전달해서 전투를 수행하게 한다.
strategy = new StrategyBow();
rambo.runContext(strategy);
}
}
- 위 코드처럼 전략을 다양하게 변경하면서 컨텍스트를 실행할 수 있습니다.
전략 패턴은 다른 디자인 패턴인 템플릿 메서드 패턴과 유사합니다.
단, 전략 패턴은 객체 주입을 활용하고, 템플릿 메서드 패턴은 상속을 활용한다는 차이점이 있습니다.
- 또한, 위의 클래스 다이어그램을 보면, 전략 패턴은 SOLID 원칙의 OCP(개방 폐쇄 원칙)와 DIP(의존 역전 원칙)이 적용된 것을 확인할 수 있습니다.
참고
스프링 입문을 위한 자바 객체지향의 원리와 이해
(317) [10분 테코톡] 📣 완태의 전략패턴 - YouTube