토비의 스프링 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' 카테고리의 다른 글
[Spring] 예외(Exception) 처리 (0) | 2021.08.08 |
---|---|
[Spring] 전략패턴(Strategy Pattern) (0) | 2021.07.31 |
[Spring] 자바 테스팅 프레임워크 JUnit (기본편) (0) | 2021.07.20 |
[Spring] 자바 테스팅 프레임워크 JUnit (개념편) (0) | 2021.07.16 |
[Spring] 스프링 XML 설정 (0) | 2021.07.02 |