템플릿 메서드 패턴과 전략, 콜백
스프링에서 자주 사용되는 패턴들
김영한 스프링 핵심 원리 고급편을 듣고 느낀점들
핵심 기능 → 객체가 제공하는 고유의 기능
부가 기능 → 로그 추적, 트랜잭션 기능. 핵심 기능과 함께 사용됨
이 모든 것들의 핵심은...
→ 변하는 것과 변하지 않는 것의 분리
→ 변하지 않는 코드는 중복될 수 있는데, 한번만 작성될 수 있도록 하자
좋은 설계는 변경이 일어날 때 자연스럽게 드러난다.
템플릿 메서드 패턴
프레임워크가 만들어놓은 abstact class에서 함수하나만을 구현하면 되는 경우 주로 템플릿 메서드 패턴이라고 한다.
변하는 부분 → 템플릿 메서드
나머지 부분 → 인터페이스, 또는 abstract class에 장착
상속 클래스를 사용하거나, 익명 내부 클래스를 사용한다. (또는 SAM인 경우, 람다를 사용할 수 있을 듯 하다.)
그런데 항상 해당 클래스를 상속받아야 한다는, 단점이 있다. (POJO에서 벗어남) ( 김영한 강의에서는 부모 클래스와 강하게 결합되어 있다고 하고 있음)
내겐 템플릿 메서드가 질리도록 익숙해서, 1.5배속으로 시청하였지만, 정말 설명을 쉽게한다는 생각을 했다. 나중에 후배에게 설명해야할 때, 비슷한 방법을 써야겠다.
단일 책임 원칙(SRP) → 변하지 않는 부분을 하나로 모음으로 SRP를 지킬 수 있다.(수정시 코드를 하나만 변경하면 된다.)
이런 것들을 개선하는 방법으로는 전략패턴,
(DI와 전략패턴이 섞여있는) 템플릿 콜백 패턴등이 있을 것이다.
전략패턴
이 패턴은 컴포지션을 사용하자는 느낌. 컴포지션이지만, 인터페이스를 사용하는 컴포지션.
추상에 의존하고, 런타임에 구체 클래스의 인스턴스를 DI해주는 스프링에서 사용하는 기본적인 패턴.
마찬가지로 익명내부 클래스를 사용할 수 있다. 메서드가 한개인 경우에는 람다를 사용할 수도 있을 것이다.
선 조립 후(객체 생성시에), 다시는 해당 strategy를 변경하기 어려울 수 있다는 단점이 있다. (이게 사실 단점이 아닐수도 있지만, functional 객체이므로, 스레드에 안전하게 사용할 수 있으므로)
전략을 parameter로 전달할 수 있다. → 전략을 DI하는 패턴
전략을 DI 하는 패턴이 결국, 템플릿 콜백에서 사용된다. ( 콜백 - 전략, 템플릿 -고정코드)
템플릿 콜백 패턴
콜백- 변하는 부분
스프링에서 자주되는 패턴으로, 스프링에서만 사용되는 용어.
JdbcTempalte, TransactionTemplate 틍이 이 패턴으로 구성되어 있음.
해당 template 객체의 함수를 호출할때, 변경되는 부분만 사용자가 작성하여 호출하면 됨.
반복되는 코드 없이 사용할 수 있으므로, 시간이 절약되고, 가독성이 향상된다.
부가 기능을 구현하는 것에 있어서는, 템플릿 콜백 패턴보다 AOP가 낫다. ( 프록시로 구현이후, 그 후 AOP로 나아간다.)