토비의 스프링 3.1 책을 읽으며 일부분을 정리한 내용입니다. 
개념 이해를 위한 내용들 중 일부분을 정리했으므로 이해를 돕기위한 예시 코드들 및 자세한 전체적인 내용은 책을 통해 확인하시길 바랍니다.
포스팅 내용이 저작권의 문제가 발생할 경우 게시물은 바로 삭제/비공개 처리됩니다.

템플릿/콜백 패턴

전략 패턴의 기본 구조에 익명 내부 클래스를 활용한 방식

템플릿: 전략패턴의 컨텍스트, 고정된 흐름의 코드 재사용

콜백: 익명 내부 클래스로 만들어지는 오브젝트, 템플릿 안에서 호출되는 것을 목적으로 만들어진다.

 

템플릿

어떤 목적을 위해 미리 만들어둔 모양이 있는 틀

콜백

실행을 목적으로 다른 오브젝트의 메소드에 전달되는 오브젝트

파라미터로 전달되지만 값 참조용이 아니라 메소드를 실행시키기 위해 사용

왜냐, 자바에선 메소드 자체를 파리미터로 전달하지 못하기 때문에 메소드가 담긴 오브젝트를 전달

 

템플릿/콜백의 특징

일반적인 DI 방식: 템플릿에 인스턴스 변수 만든  후 수정자 메소드로 의존 오브젝트 받아서 사용

템플릿/콜백 DI 방식: 매번 메소드 단위로 사용할 오브젝트를 새롭게 전달 받는다.

-보통 단일 메소드 인터페이스 사용

-콜백: 단일 메소드 인터페이스를 구현한 익명 내부 클래스로 만들어진다.

-전략 패턴, DI의 장점, 익명 내부 클래스 사용 전략의 결합

 

템플릿/콜백 작업 흐름

책 p.242

클라이언트 역할: 템플릿 안에서 실행될 로직 담은 콜백 오브젝트 만들기, 콜백이 참조할 정보 제공, 만들어진 콜백은 클라이언트가 템플릿의 메소드를 호출할 때 파라미터로 전달(메소드 레벨  DI)

템플릿 역할: 흐름을 따라 작업을 진행하다가 내부에서 생성한 참조정보를 가지고 콜백 오브젝트의 메소드 호출, 콜백이 돌려준 정보를 사용해서 작업을 마저 수행, 경우에 따라 결과 클라이언트에게 반환

 

콜백 역할: 클라이언트 메소드에 있는 정보와 템플릿이 제공한 참조정보를 이용해서 작업을 수행, 그 결과를 템플릿에 반환

 

템플릿/콜백 방식의 단점

DAO메소드에서 매번 익명 내부 클래스를 이용하는데 익명 내부 클래스는 상대적으로 작성/해석에 용이하지 않다.

->복잡한 익명 내부 클래스의 사용을 최소화할 수 없을까?

 

콜백의 분리와 재활용, 템플릿과의 결합

재사용이 가능한 코드를 분리를 해내 익명 내부 클래스 코드를 간결하게 만들면 된다.

재사용 가능한 콜백을 담고 있는 메서드라면 DAO가 공유할 수 있는 템플릿 클래스 안으로 옮겨도 된다.

책 p.247 그림
public class JdbcContext {
...
	public void executeSql(final String query) throws SQLException{
		workWithStatementStrategy(
				new StatementStrategy() {
					public PreparedStatement makePreparedStatement(Connection c) throws SQLException {
						return c.prepareStatement(query);
					}
				}
		);
	}
public void deleteAll() throws SQLException {
	this.jdbcContext.executeSql("delete from users");
}

하나의 목적을 위해 긴밀한 관계를 형성하고 있는 코드들은 응집력이 강하기 때문에 위  JdbcContext 예시처럼 한 곳에 작성하는 게 좋다.

 

템플릿/콜백의 응용법

고정된 로직이 자주 반복되는 코드를 가지고 있다면 이를 분리할 방법을 생각해보자.

중복된 코드는 먼저 메소드로 분리하는 시도

그중 일부 작업이 필요에 따라 바뀐다면 인터페이스를 사이에 두고 분리해서 전략 패턴 적용/DI 의존관계 관리

바뀌는 부분이 한 어플리케이션 안에서 동시에 여러 종류가 만들어질 수 있다면 템플릿/콜백 패턴 적용 고려

 

템플릿과 콜백의 경계를 정하고 템플릿이 콜백에게, 콜백이 템플릿에게 전달하는 정보가 무엇인지 판단하는 게 가장 중요

 

제네릭스를 이용한 콜백 인터페이스

제네릭스를 이용하면 다양한 오브젝트 타입을 지원하는 인터페이스나 메소드 정의 가능

제네릭 타입 파라미터  T

 

 

+ Recent posts