Spring ‐ 템플릿 메서드 패턴과 콜백 패턴 - dnwls16071/Backend_Study_TIL GitHub Wiki

📚 템플릿 메서드 패턴

스크린샷 2025-02-08 오후 4 42 12

  • 부모 클래스에 알고리즘의 골격인 템플릿을 정의하고 일부 변경되는 로직은 자식 클래스에서 정의하는 것
  • 자식 클래스가 알고리즘 전체 구조를 변경하지 않고 특정 부분만 재정의 가능하다.
  • 상속과 오버라이딩을 통한 다형성으로 문제를 해결한 것

❗이펙티브 자바로 공부했던 내용

아이템 18. 상속보다는 컴포지션을 사용하라 아이템 19. 상속을 고려해 설계하고 문서화하라. 그러지 않았다면 상속을 금지하라

@Slf4j
public abstract class AbstractTemplate {

	public void execute() {
		long startTime = System.currentTimeMillis();
		//비즈니스 로직 실행
		call(); //상속
		//비즈니스 로직 종료
		long endTime = System.currentTimeMillis();
		long resultTime = endTime - startTime;
		log.info("resultTime={}", resultTime);
	}
	protected abstract void call();
}

📚 전략 패턴

스크린샷 2025-02-08 오후 5 17 22

  • Context에서 Strategy 인터페이스를 주입받는다.
  • Context에서 execute()를 호출할 때 Strategy에 위임한다.
@Slf4j
public class ContextV1 {

	private final Strategy strategy;  // Strategy 주입

	public ContextV1(Strategy strategy) {
		this.strategy = strategy;
	}

	// Context에서 call()을 호출할 때 Strategy에 위임한다.
	public void execute() {
		long startTime = System.currentTimeMillis();
		//비즈니스 로직 실행
		strategy.call(); //위임
		//비즈니스 로직 종료
		long endTime = System.currentTimeMillis();
		long resultTime = endTime - startTime;
		log.info("resultTime={}", resultTime);
	}
}

📚 템플릿 콜백 패턴

  • 콜백(Callback) : 다른 코드의 인수로서 넘겨주는 실행 가능한 코드
  • 기존 전략 패턴에서 주입 방식 대신 파라미터 방식으로 넘겨주는 방식이 이에 해당한다.

스크린샷 2025-02-08 오후 5 24 44

@Slf4j
public class ContextV2 {

	// ContextV1과 달리 파라미터로 넘겨 동시성 문제를 차단한다.
	public void execute(Strategy strategy) {
		long startTime = System.currentTimeMillis();
		//비즈니스 로직 실행
		strategy.call(); //위임
		//비즈니스 로직 종료
		long endTime = System.currentTimeMillis();
		long resultTime = endTime - startTime;
		log.info("resultTime={}", resultTime);
	}
}