Spring&Spring Boot

(Spring / Design pattern ) 템플릿 메소드 패턴, 전략 패턴

Developer RyanKim 2020. 5. 12. 17:02

 

 

(Spring / Design pattern) 템플릿 메소드 패턴, 전략 패턴

템플릿 메소드 패턴과 전략패턴을 적용하기 전에 선행 되어야 할 중요한 작업은

고정된 작업 흐름을 갖고 있으며, 자주 반복되는 코드가 있다면
변하는 부분과 변하지 않는 부분을 정의 하는 것이다.

위 작업이 잘 선행되어야 불필요한 코드의 중복을 줄이고, 확장에도 유연한 이 패턴들을 적용할 수 있다.

 

템플릿 메소드 패턴 (Template Method Pattern)

상속을 통해 기능을 확장해서 사용한다.
변하지 않는 부분은 슈퍼클래스에 두고 사용하고, 변하는 부분은 추상 메소드로 정의하여
각 서브클래스에서 오버라이드하여 새롭게 정의해 사용하도록 하는 것이다.

 

장점: 공통되는 부분의 기능을 한곳에서 정의하여 코드의 중복을 제거하고, 유지보수도 용이하다.


Ex) User 라는 Table에 쿼리를 실행시키는 기능을 만들경우, 추가 수정 삭제 조회의 기능을 하는 클래스들에서
DB와 연결을 관리하는 부분은 공통일 것이고 실행시키는 쿼리만 다를 것이다. DB 제품이나 연결주소가 바뀌는 상황에서
슈퍼클래스만 수정하여 작업이 가능하다.

또한 추가 수정 삭제 등 이외의 작업이 추가될 경우에는 공통부분의 수정 없이 확장도 가능하다

 

단점: 기능마다 상속을 통해 새로운 클래스를 만들어야 한다. 그리고 확장 구조가 이미 클래스를 설계하는 시점에서 고정된다.
따라서 관계에 대한 유연성이 떨어진다.

 

전략패턴 (Strategy Pattern)

 

템플릿 메소드 패턴보다 더 유연하고 확장성이 뛰어나다. 오브젝트를 아예 둘로 분리하고
클래스 레벨에서는 인터페이스를 통해서만 의존하도록 만든다.
OCP 관점에서, 확장에 해당하는 부분을 별도의 클래스로 만들어 추상화된 인터페이스를 통해 위임하는 방식이다.

Context(맥락)는 변하지 않는다.
Strategy(전략)를 가지고 작업을 수행한다.

작업 수행에 어떤 Strategy가 사용될지 선택하는 것은 Client 이다.
결국, ContextClient에서 구체적인 Strategy를 전달 받고, 해당 Strategy를 통해 작업을 수행한다.

 

장점: 컨텍스트는 그대로 유지되면서(OCP의 폐쇄 원칙) 필요에 따라 전략을 바꿔 쓸 수 있다. (OCP의 개방 원칙)

 

Spring의 기능을 사용한다면 Context에서는 Stategy 인터페이스를 의존하고, 필요에 따라 상황에 맞는 Strategy 구현체 Bean을 주입받아 사용하도록 구현 할 수 있다.

 

Spring의 많은 API나 기능에서 위 패턴들을 사용하고 있다.