본문 바로가기

Spring Framework

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

템플릿 콜백 패턴(Template Callback Pattern)은 소프트웨어 개발에서 많이 사용되는 디자인 패턴 중 하나입니다. 이 패턴은 알고리즘의 전체적인 구조는 유지하면서, 일부분은 서브클래스에서 구현되도록 하는 것을 목적으로 합니다.

템플릿 콜백 패턴은 주로 Template Method 디자인 패턴과 함께 사용됩니다. Template Method 패턴은 알고리즘의 구조를 정의하고, 이 구조에서 일부분은 추상 메서드로 선언하여 서브클래스에서 구현하도록 합니다. 이때, 템플릿 콜백 패턴은 추상 메서드에서 콜백 메서드를 호출하여, 서브클래스에서 구현한 기능을 실행합니다.

이제, 템플릿 콜백 패턴을 사용한 간단한 예제 코드를 작성해보겠습니다. 여기서는 파일을 읽어들여, 파일 내용을 처리하는 프로그램을 작성해봅시다.

 팩토리 메서드 패턴

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;

public class FileProcessor {
    private String filePath;

    public FileProcessor(String filePath) {
        this.filePath = filePath;
    }

    public String processFile(FileCallback callback) throws IOException {
        StringBuilder result = new StringBuilder();
        BufferedReader reader = new BufferedReader(new FileReader(filePath));

        String line;
        while ((line = reader.readLine()) != null) {
            result.append(callback.doWithLine(line));
        }

        reader.close();
        return result.toString();
    }
}

위의 코드에서는 FileProcessor 클래스를 정의하고, processFile() 메서드를 구현합니다. 이 메서드는 파일을 읽어들인 후, 파일 내용을 처리하는 콜백 메서드(doWithLine())를 호출합니다.

이제, 콜백 메서드를 정의하는 인터페이스인 FileCallback을 작성해봅시다.

public interface FileCallback {
    String doWithLine(String line);
}

위의 코드에서는 FileCallback 인터페이스를 정의하고, doWithLine() 메서드를 선언합니다. 이 메서드는 파일에서 한 줄씩 읽어들인 후, 각 줄에 대한 처리를 수행합니다.

마지막으로, 다음과 같이 FileProcessor를 사용하여 파일 내용을 처리할 수 있습니다.

public class Main {
    public static void main(String[] args) throws IOException {
        FileProcessor processor = new FileProcessor("data.txt");

        // 파일 내용을 모두 소문자로 변환하여 반환하는 콜백 메서드 구현
        String result = processor.processFile(new FileCallback() {
            @Override
            public String doWithLine(String line) {
                return line.toLowerCase() + "\n";
            }
        });

        System.out.println(result);
    }
}

위의 코드에서는 먼저, Main 클래스에서 FileProcessor 객체를 생성하고, processFile() 메서드를 호출합니다. 이때, 콜백 메서드로서 익명 클래스를 사용하여, 파일 내용을 모두 소문자로 변환하는 기능을 구현합니다. 이렇게 구현된 콜백 메서드는 processFile() 메서드 내에서 호출되어, 파일에서 한 줄씩 읽어들인 후 소문자로 변환하여 StringBuilder 객체에 추가합니다. 마지막으로, 변환된 결과를 문자열로 반환합니다.

위의 예제 코드에서는 파일 내용을 모두 소문자로 변환하는 기능을 구현했지만, 콜백 메서드를 사용하면 파일 내용을 처리하는 다양한 기능을 구현할 수 있습니다. 따라서, 템플릿 콜백 패턴을 사용하면 알고리즘의 전체적인 구조는 유지하면서, 일부분을 서브클래스에서 구현할 수 있으므로, 코드의 재사용성과 확장성을 높일 수 있습니다.

 

가장 전형적인 템플릿 콜백 패턴의 후보는 try/catch/finally 블록을 사용하는 코드입니다. 일정한 리소스를 만들거나 가져와 작업하면서 예외가 발생할 가능성이 있는 코드는 보통 try/catch/finally 구조로 코드가 만들어질 가능성이 높습니다. 예외상황을 처리하기 위한 catc와 리소스를 반납하거나 제거하는 finally가 필요하기 때문입니다. 이런 코드가 한 두번 사용되는 것이 아니라 여기 저기서 자주 반복된다면 템플릿 콜백 패턴을 적용하기 적당합니다.

 

조금 복잡해 보이지만 DI 방식의 전략 패턴 구조라고 생각하고 보면 간단합니다.

클라이언트가 템플릿 메소드를 호출하면서 콜백 오브젝트를 전달하는 것은 메소드 레벨에서 일어나는 DI입니다. 템플릿이 사용할 콜백 인터페이스를 구현한 오브젝트를 메소드를 통해 주입해주는 DI 작업이 클라이언트가 템플릿의 기능을 호출하는 것과 동시에 발생합니다.

일반적인 DI 라면 템플릿에 인스턴스 변수를 만들어 놓고, 사용할 의존 오브젝트를 수정자 메소드로 받아서 사용할 것입니다. 반면에 템플릿 콜백 패턴에서는 매번 메소드 단위로 사용할 오브젝트를 새롭게 전달받는다는 것이 특징입니다. 콜백 오브젝트가 내부 클래스로서 자신을 생성한 클라이언트 메소드 내의 정보를 직접 참조한다는 것도 템플릿 콜백의 고유한 특징입니다. 클라이언트와 콜백이 강하게 결합된다는 면에서도 일반적인 DI아 조금 다릅니다.

템플릿 콜백 패턴은 전략 패턴과 DI의 장점을 익명 내부 클래스 사용 전략과 결합한 독특한 활용법이라고 이해할 수 있습니다. 단순히 전략 패턴으로만 보기엔 독특한 특징이 많으르모 템플릿 콜백 패턴을 하나의 고유한 디자인 패턴으로 기억해 두면 편리합나다.

'Spring Framework' 카테고리의 다른 글

서비스 추상화  (0) 2024.04.09
Service Layer  (0) 2024.04.09
전략 패턴  (0) 2024.04.09
@Import  (0) 2024.04.09
SOLID(객체 지향 설계 원칙)  (0) 2024.04.09