템플릿 메서드 패턴은 다형성을 사용해서 변하는 부분과 변하지 않는 부분을 분리하는 방법이다.
-AbstractTemplate은 템플릿 메서드 패턴에서 부모 클래스이고, 템플릿 역할을 한다.
📍템플릿 메서드 패턴
작업에서 알고리즘의 골격을 정의하고 일부 단계를 하위 클래스로 연기한다.
템플릿 메서드를 사용하면 하위 클래스가 알고리즘의 구조를 변경하지 않고도 알고리즘의 특정 단계를 재정의 할 수 있다.
부모 클래스에 알고리즘의 골격인 템플릿을 정의하고 일부 변경되는 로직은 자식 클래스에 정의하는 것이다.
결국 상속과 오버라이딩을 통한 다형성으로 문제를 해결하는 것이다
하지만 템플릿 메서드 패턴은 상속을 사용한다
따라서 상속에서 오는 단점들을 그대로 안고 간다. 특히 자식 클래스가 부모 클래스와 컴파일 시점에 강하게 결합되는 문제가 있다.
자식 클래스 입장에서는 부모 클래스의 기능을 전혀 사용하지 않는데 부모 클래스를 알아야 한다면 이것은 좋은 설계가 아니다
잘못된 의존관계 때문에 부모 클래스를 수정하면 자식 클래스에도 영향을 줄 수 있다
📍전략 패턴
템플릿 메서드 패턴은 부모 클래스에 변하지 않는 템플릿을 두고 변하는 부분을 자식 클래스에 두어서 상속을 사용해서 문제를 해결한다.
전략패턴은 변하지 않는 부분을 Context 라는 곳에 두고, 변하는 부분을 Strategy 라는 인터페이스를 만들고 해당 인터페이스를 구현하도록 해서 문제를 해결한다. 상속이 아니라 위임으로 문제를 해결하는 것이다.
알고리즘 제품군을 정의하고 각각을 캡슐화하여 상호 교환 가능하게 만들자. 전략을 사용하면 알고리즘을 사용하는 클라이언트와 독립적으로 알고리즘을 변경할 수 있다.
1. Context에 원하는 Strategy 구현체를 주입한다.
2. 클라이언트는 context를 실행한다.
3. context 로직 중간에 Strategy.call()을 호출해서 주입 받은 Strategy 로직을 실행한다.
4. context는 나머지 로직을 실행한다.
변하지 않는 부분을 템플릿이라 하고, 그 템플릿 안에서 변하는 부분에 약간 다른 코드 조각을 넘겨서 실행하는 것이 목적이다.
📍템플릿 콜백 패턴
ContextV2는 변하지 않는 템플릿 역할을 한다. 그리고 변하는 부분은 파라미터로 넘어온 Strategy의 코드를 실행해서 처리한다. 이렇게 다른 코드의 인수로서 넘겨주는 실행 가능한 코드를 콜백(callback)이라 한다.
✓ 콜백 정의
프로그래밍에서 callback 또는 콜에프터 함수는 다른 코드의 인수로서 넘겨주는 실행 가능한 코드를 말한다. 콜백을 넘겨받는 코드는 이 콜백을 필요에 따라 즉시 실행할 수도 있고, 아니면 나중에 실행할 수도 있다.
-> callback은 코드가 호출(call)은 되는데 코드를 넘겨준 곳의 뒤(back)에서 실행된다는 뜻이다.
ContextV2 예제에서 콜백은 Strategy 이다. 여기에서는 클라이언트에서 직접 Strategy를 실행하는 것이 아니라 클라이언트가 Context2.execte(..)를 실행할 때 Strategy를 넘겨주고 ContextV2 뒤에서 Strategy가 실행된다.
템플릿 콜백 패턴
-스프링에서 ContextV2와 같은 방식의 전략 패턴을 템플릿 콜백 패턴이라 한다. 전략 패턴에서 Context가 템플릿 역할을 하고, Strategy 부분이 콜백으로 넘어온다 생각하면 된다.
-참고로 템플릿 콜백 패턴은 GOF 패턴은 아니고, 스프링 내부에서 이런 방식을 자주 사용하기 때문에 스프링 안에서만 이렇게 부른다. 전략 패턴에서 템플릿과 콜백 부분이 강조된 패턴이라 생각하면 된다.
-스프링에서는 JdbcTemplate, RestTemplate, TransactionTemplate, RedisTemplate처럼 다양한 템플릿 콜백 패턴이 사용된다. 스프링에서 이름에 XxxTemplate가 있다면 템플릿 콜백 패턴으로 만들어져 있다 생각하면 된다.
'스터디 > Spring' 카테고리의 다른 글
[SPRING 고급] 프록시팩토리와 포인트컷,어드바이스,어드바이저 (1) | 2024.12.29 |
---|---|
[SPRING 고급] JDK 동적 프록시와 CGLIB (1) | 2024.12.27 |
[SPRING 고급] 프록시 패턴과 데코레이터 패턴 (0) | 2024.12.24 |
[SPRING 고급] 동시성 문제와 ThreadLocal 사용 (0) | 2024.12.17 |
[Spring] Spring 기초 (0) | 2023.03.18 |