ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 💡 템플릿 콜백 패턴
    💻 computer science/🌠 디자인패턴 2024. 5. 7. 16:20

    🧩 Template Callback 패턴


    스프링 프레임워크에서 DI(의존성 주입)에서 사용하는 특별한 전략패턴

    • ex) Jdbc Template, Rest Template, Transaction Template, Redis Template

     

    public class TransactionTemplate extends DefaultTransactionDefinition
    		implements TransactionOperations, InitializingBean {
    	...
    
    	@Override
    	@Nullable
    	public <T> T execute(TransactionCallback<T> action) throws TransactionException {
    		...
    	}
    }

     

     

    🆚 기존의 전략패턴

     

    기존의 전략패턴은 전략 알고리즘 부분을 컴파일 타임에서 클래스로 만든 후 구현체를 주입해야 한다.

    이와 달리 템플릿 콜백 패턴은 런타임 타임에서 익명 클래스를 이용해 동적으로 전략 알고리즘을 주입한다.

     

    🤙 콜백 (Callback)

     

    프로그래밍에서 콜백은 하나의 오브젝트를 다른 오브젝트의 메소드에 매개변수로 넘겨주는 실행 가능한 코드이다.

    • 다른 코드의 인수로서 넘겨주는 실행 가능한 코드

    callback은 코드가 호출은 되는데, 코드를 넘겨준 곳의 뒤에서 실행된다는 것이다.

    • 코드를 넘겨 받은 함수는 이 콜백 함수를 필요에 따라 원할 때 실행할 수 있다.

     

    🧑🏻‍💻 자바에서의 콜백

    interface Test {
    	int add(int x, int y);
    }
    
    public class Main {
      public static void main(String[] args) {
    	   int res = result((x, y) -> x + y);
    	   System.out.println(res); // 3
    	}
    	
    	public static int result(IAdd Iadd) {
         return Iadd.add(1, 2);
      }
    }

     

    🏃 패턴 흐름

    콜백은 보통 단일 메소드로 이루어진 인터페이스를 사용 (함수형 인터페이스)

    • 템플릿의 작업 흐름중 특정 기능을 위해 한 번 호출되는 경우가 일반적이기 때문

     

    👍 특징과 장점, 단점

     

    🤖 특징

    • 전략패턴과 스프링의 의존성 주입(DI)의 장점을 익명 내부 클래스 사용 전략과 결합
    장점 단점
    전략 객체를 일일히 만들 필요가 없다.
    - 별도의 전략을 위한 클래스 없이, 전략을 사용하고자 하는 메소드에 매개변수 값으로 전략 로직을 넘겨서 실행
    스프링 클라이언트에서 DI를 사용하지 않게 되면, Bean으로 등록되지 않아서 싱글톤 객체가 되지 않는다.
    외부에서 어떤 전략을 사용하는지 감추고 중요한 부분에 집중할 수 있다. 인터페이스를 사용하지만 실제 사용할 클래스를 직접 선언하기 때문에 결합도가 증가한다. 

     

    🧑🏻‍💻 예제 코드

    1️⃣ 인터페이스 정의

    2️⃣ 템플릿 메서드의 인자로 인터페이스 매개변수를 추가

     

    interface OperationStrategy {
        int calculate(int x, int y);
    }
    
    class OperationTemplate {
        public void templateMethod(int x, int y, OperationStrategy operationStrategy) {
            int number1 = 10;
            int number2 = operationStrategy.calculate(x, y);
            System.out.println(number1 * number2);
        }
    }
    
    public class Client {
        public static void main(String[] args) {
            int x = 100;
            int y = 50;
            OperationTemplate operationTemplate = new OperationTemplate();
    
            operationTemplate.templateMethod(x, y, (x1, y1) -> x1 + y1); // 1500
            operationTemplate.templateMethod(x, y, (x1, y1) -> x1 - y1); // 500
            operationTemplate.templateMethod(x, y, (x1, y1) -> x1 * y1); // 50000
        }
    }

     

     

    📕 참고 자료

    💠 Template Callback 디자인 패턴

    콜백

    댓글

Designed by Tistory.