[디자인패턴]”템플릿-컬백”패턴 실습

최근에 토비의 스프링3를 열독하면서 소개된 “템플릿-컬백” 디자인패턴의 예제를

실습하면서 스스로도 다시 한번 블로그 포스팅을 통해 되새겨야 겠다고 생각하고

실습예제를 간단히 만들어 보았습니다.

토비님과 다른 예제를 만들려고 하였으나, 여력이 되지 않아 토비님 예제에서 살짝만

바꿔 사칙연산을 할 내용을 “파일“에서 “HTML페이지“로 바꾸어 실습해 보았습니다.

================================================================

1. 먼저 “템플릿-컬백“을 적용하기 전에 클래스 파일입니다.

public class Calculator {

	public int sum() {
		String[] arrList = new String[4];
		int result = 0;

		try {
			URL url = new URL("http://bluepoet.dothome.co.kr/test.html");
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();

			BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
			String line = null;
			String str = "";

			while((line = br.readLine()) != null) {
				str += line;
			}

			arrList = str.split("<br>");

			for(String s : arrList) {
				result += Integer.valueOf(s);
			}

			return result;
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

		return result;
	}

	public int multi() {
		String[] arrList = new String[4];
		int result = 1;

		try {
			URL url = new URL("http://bluepoet.dothome.co.kr/test.html");
			HttpURLConnection conn = (HttpURLConnection) url.openConnection();

			BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
			String line = null;
			String str = "";

			while((line = br.readLine()) != null) {
				str += line;
			}

			arrList = str.split("<br>");

			for(String s : arrList) {
				result *= Integer.valueOf(s);
			}

			return result;
		} catch (MalformedURLException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}

		return result;
	}
}

보면 아시겠지만, HTML 페이지에서 3,4,5,6을 가져와 더하고 빼는 기능을 하는 부분 이외는

나머지 부분이 모두 동일하다는 것을 알 수 있습니다.

================================================================

2. Calculator 클래스에서 바뀌는 부분, 즉 컬백을 적용할 부분은

int result = 0;
int result = 1;

result += Integer.valueOf(s);
result *= Integer.valueOf(s);

처음에 초기값을 설정해주는 부분과 사칙연산을 하는 부분입니다.

그럼, “템플릿-컬백“을 적용하여 “인터페이스“를 두어 컬백을 수행할 부분을

추상화하여 분리하고, 나머지 공통적인 템플릿부분은 별도의 메소드로 분리하여

리팩토링을 진행하였습니다.

public int sum() {
	Operation oper = new Operation() {

		@Override
		public int exec(int result, String s) {
			result += Integer.valueOf(s);
			return result;
		}
		};

	return templateLine(oper)-1;
}

public int multi() {
	Operation oper = new Operation() {

		@Override
		public int exec(int result, String s) {
		    result *= Integer.valueOf(s);
			return result;
		}
	};

	return templateLine(oper);
}

public int templateLine(Operation oper) {
	String[] arrList = new String[4];
	int result = 1;

	try {
		URL url = new URL("http://bluepoet.dothome.co.kr/test.html");
		HttpURLConnection conn = (HttpURLConnection) url.openConnection();

		BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
		String line = null;
		String str = "";

		while((line = br.readLine()) != null) {
			str += line;
		}

		arrList = str.split("<br>");

		for(String s : arrList) {
   		    result = oper.exec(result, s);
		}

		return result;
	} catch (MalformedURLException e) {
		e.printStackTrace();
	} catch (IOException e) {
		e.printStackTrace();
	}

	return result;
}

인터페이스로 컬백부분을 분리하고 각기 사칙연산을 수행하는 메서드 안에서

익명내부클래스“로 정의해서 컬백에 대한 내용을 수행하고 마지막에 공통적인 부분을

수행하는 템플릿메서드에 해당 인터페이스를 구현한 익명의 객체를 파라미터로 전달하면

됩니다.

위에 리팩토링한 클래스를 테스트하는 테스트 클래스를 만들었습니다.

public class CalculatorTest {
	Calculator calculator;

	@Before
	public void setup() {
		calculator = new Calculator();
	}

	@Test
	public void sumTest() {
		assertThat(calculator.sum(), is(18));
	}

	@Test
	public void multiTest() {
		assertThat(calculator.multi(), is(360));
	}
}

테스트를 돌려보면 기분좋은 녹색막대가 나오게 됩니다.

전에 공통적인 부분을 중복으로 사용하여 코드가 지저분했다면 간단하게 “템플릿-컬백

패턴을 사용하여 리팩토링한 결과, 깔끔하고 가독성 좋은 코드로 환골탈태하였습니다.

토비의 스프링3에 책을 보며 알게 된 사실이지만, 스프링에서 무심코 편하게 썼던

jdbcTemplate class도 사실 스프링 내부에서 “템플릿-컬백”패턴을 적용하여 돌아가고

있었다고 합니다. 사실, 생각해보니 connection을 얻어오는 부분부터 예외처리나

close처리 등이 빠져있어 그런 부분을 도대체 어디서 처리했는지 궁금증을 가져본 분이라면,

새벽에 해가 떠오르는 것처럼 “아~!“하는 감동(?)을 맛보실 수 있지 않을까 싶습니다.

================================================================

이번에 스타리그 앱을 이 “템플릿-컬백“을 적용하여 리팩토링 하였는데, 그 포스팅도

시간되는대로 올리도록 하겠습니다^^

Advertisements

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Google+ photo

Google+의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Twitter 사진

Twitter의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중