본문 바로가기
카테고리 없음

Template & Callback

by 최고영회 2014. 5. 26.
728x90
반응형
SMALL

템플릿과 콜백

스프링에서는 전략 패턴의 기본 구조에 익명 내부 클래스를 활용한 방식을 템플릿/콜백 패턴이라고 부른다. 

전략 패턴의 컨텍스트를 템플릿이라 부르고, 익명 내부 클래스로 만들어지는 오브젝트를 콜백이라 부른다. 

 

템플릿 : 어떤 목적을 위해 미리 만들어둔 모양이 있는 틀을 가리킨다. 

도형을 그릴 때 사용하는 도형자가 바로 템플릿이다. 프로그래밍에서는 고정된 틀 안에 바꿀 수 있는 부분을 넣어서 사용하는 경우에 템플릿이라고 부른다. 

 

콜백 : 실행되는 것을 목적으로 다른 오브젝트의 메소드에 전달되는 오브젝트를 말한다. 

특정 로직을 담은 메소드를 실행 시키기 위해 사용하는데, 자바에선 메소드 자체를 파라미터로 전달할 방법은 없기 때문에 메소드가 담긴 오브젝트를 전달해야 한다. 

그래서 펑셔널 오브젝트(functional object)라고도 한다. 

 

템플릿/콜백의 동작원리

특징 

여러 개의 메소드를 가진 일반적인 인터페이스를 사용할 수 있는 전략 패턴의 전략과 달리 템플릿/콜백 패턴의 콜백은 보통 단일 메소드 인터페이스를 사용한다. 

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

콜백은 일반적으로 하나의 메소드를 가진 인터페이스를 구현한 익명 내부 클래스로 만들어진다고 보면 된다. 

콜백 인터페이스의 메소드에는 보통 파라미터가 있다. 이 파라미터는 템플릿의 작업 흐름 중에 만들어지는 컨텍스트 정보를 전달받을 때 사용된다.


 

 

 

위 그림은 템플릿/콜백 패턴의 일반적인 작업 흐름을 보여준다.

 

조금 복잡해 보이지만 DI 방식의 전략 패턴 구조라고 생각하고 보면 간단하다. 클라이언트가 템플릿 메소드를 호출하면서 콜백 오브젝트를 전달하는 것은 메소드 레벨에서 일어나는 DI이다.

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

템플릿/콜백 방식은 전략 패턴과 DI 장점을 익명 내부 클래스 사용 전략과 결합한 독특한 활용법이라고 이해할 수 있다.

 

예제

try/catch/finally를 템플릿으로 하고 계산 로직을 콜백으로 하는 간단한 예제를 만들어 보자.

아래와 같이 4개의 숫자를 담고 있는 number.txt 파일을 열어 모든 라인을 계산하여 값을 돌려주는 프로그램을 만든다.

number.txt

 

1
2
3
4

 

 

파일의 숫자를 계산하는 코드의 테스트 (CalcSumTest.java)

 

 

 

 

계산하는 클라이언트 클래스 콜백오브젝트를 생성/전달한다. (Calculator.java)

 

 

 

Calculator 클래스의 LineReadTemplate 함수 (Calculator.java)

 

 

 

콜백 오브젝트가 구현한 LineCallback 인터페이스 (LineCallback.java)

 

 

 

 

정리

일반적으로 템플릿은 콜백을 실행하기 위한 사전단계이거나 재사용이 가능한 코드일 가능성이 높다.

핵심인 비즈니스 로직은 콜백 오브젝트에 담아 템플릿에 전달하여 실행하도록 한다.

이렇게 한다면 관심사의 분리, 즉 부가적인 템플릿과 핵심 로직을 구분하여 재사용성을 용이하게 하며 코드를 명확하게 하여 알아보기 쉬우며 유지보수에 용이한 코드를 작성할 수 있다.

 

 

참고자료 : 모든 내용은 Toby의 스프링3에 나와있는 내용을 정리한 자료입니다.

FROM : http://elaia.tistory.com/70

728x90
반응형
LIST