책책책/토비의 스프링 3.1

[Spring] 템플릿/콜백 패턴 (Template/Callback Pattern)

Deveun 2021. 7. 31. 05:09

토비의 스프링 3장: 템플릿

템플릿/콜백 패턴 (Template/Callback Pattern)

앞에서 살펴본 전략패턴(Strategy Pattern)의 기본 구조에서 익명의 내부 클래스를 활용한 방식을 스프링에서는 템플릿/콜백 패턴이라고 한다. 전략패턴과는 다르게 보통 단일 메소드 인터페이스를 사용한다. 먼저 각각의 용어들을 살펴보자.

 

  o 템플릿(Template)

  : 만들어져 있는 을 템플릿이라고 하는데, 프로그래밍에서는 고정된 틀 안에 변경되는 부분을 넣어 사용하는 것을 말한다.

  o 콜백(Callback)

  : 다른 오브젝트에서 메소드로 사용되기 위해 전달되는 오브젝트를 말한다. 자바에서는 메소드를 파라미터로 전달하는 방법이 없기 때문에 메소드를 담은 오브젝트를 전달하는 것이다. (= functional object)

 

이전 게시글에서 전략패턴으로 작성한 코드의 Calculator.java의 덧셈/뺄셈 메소드 부분을 익명 내부 클래스를 사용하는 방식으로 변경하면 다음과 같다. (이전 게시글 참고: 2021.07.31 - [책책책/토비의 스프링 3.1] - [Spring] 전략패턴(Strategy Pattern))

 

Calculator.java

public void sum() throws IOException{

        // 익명 내부 클래스로 Strategy 인터페이스를 구현 (= 콜백)
        Strategy strategy = new Strategy() {
            public void operationStrategy(int[] num, int i) {
                num[0] += num[i];
            }
        };
        contextWithStrategy(strategy);
    }

    public void subtract() throws IOException{

        // 익명 내부 클래스로 Strategy 인터페이스를 구현(= 콜백)
        Strategy strategy = new Strategy() {
            public void operationStrategy(int[] num, int i) {
                num[0] -= num[i];
            }
        };
        contextWithStrategy(strategy);
    }

 

여기서도 콜백 부분을 재사용이 가능하도록 분리하여 코드의 개선이 가능하다.

 

public class Caculator {


    public void sum() throws IOException{
        caculate('+');
    }

    public void subtract() throws IOException{
        caculate('-');
    }

    public void caculate(char operand) throws IOException{

        // 콜백의 재사용
        Strategy strategy = new Strategy() {
            public void operationStrategy(int[] num, int i) {
                switch(operand) {
                    case '+':
                        num[0] -= num[i];
                        break;
                    case '-':
                        num[0] += num[i];
                        break;
                    default:
                        num[0] = 0;
                        break;
                }
            }
        };
        contextWithStrategy(strategy);
    }

    public void contextWithStrategy(Strategy strategy) throws IOException{
		// 생략...
    }
}

 

sum(), subtract()의 구현부분이 눈에 띄이게 간단해진 것을 확인할 수 있다. 추가로, context method 부분을 별도의 객체로 분리하면 Caculator뿐만 아니라 다른 클래스에서도 재사용이 가능하다.

 

 

[참고서적] http://www.acornpub.co.kr/book/toby-spring3.1-vol1#spring3

 

토비의 스프링 3.1 Vol. 1 스프링의 이해와 원리

스프링의 핵심 프로그래밍 모델의 원리와 이에 적용된 다양한 디자인 패턴, 프로그래밍 기법의 이해를 돕는 책

www.acornpub.co.kr