템플릿: 고정된 작업 흐름을 가진 코드를 재사용할 수 있게 함 콜백: 템플릿 안에서 호출되는 것을 목적으로 만들어진 오브젝트
전략 패턴의 전략 - 여러 메서드를 가진 일반적인 인터페이스를 사용할 수 있다.
템플릿/콜백 패턴의 콜백 - 보통 단일 메소드 인터페이스를 사용한다.
jdbcContext
.workWithStatementStategy
() 메서드 내에서 makePreparedStatement
() 메서드 실행을 위해 Connection
오브젝트를 파라미터로 넘겨준다.public void jdbcContextWithStatementStrategy(StatementStrategy strategy) throws SQLException{
Connection c = null;
PreparedStatement ps = null;
try{
c = dataSource.getConnection();
ps = strategy.makePreparedStatement(c);
ps.executeUpdate();
} catch (SQLException e){
throw e;
}finally {
if (ps!= null) { try {ps.close();} catch (SQLException e){}}
if (c != null) { try { c.close();} catch (SQLException e){}}
}
}
public void add(final User user) throws SQLException {
jdbcContextWithStatementStrategy(
new StatementStrategy() {
@Override
public PreparedStatement makePreparedStatement(Connection c) throws SQLException {
PreparedStatement ps = c.prepareStatement("insert into users(id, name, password) values(?,?,?)");
ps.setString(1, user.getId());
ps.setString(2, user.getName());
ps.setString(3, user.getPassword());
return ps;
}
}
);
}
클라이언트의 역할
템플릿 안에서 실행될 로직을 담은 콜백 오브젝트 생성
콜백이 참조할 정보 제공
만들어진 콜백
클라이언트가 템플릿의 메서드를 호출할 때 파라미터로 전달
: 클라이언트는 템플릿 메서드를 호출하면서 콜백 오브젝트를 전달한다. (메서드 레벨에서 일어나는 DI)
⇒ 템플릿이 사용할 콜백 인터페이스를 구현한 오브젝트를 메소드를 통해 주입해주는 DI 작업이 클라이언트가 템플릿 기능을 호출하는 것과 동시에 일어난다. (앞문장이랑같은말아닌가)
템플릿의 동작
정해진 작업 흐름을 따라 진행
내부에서 생성한 참조 정보를 가지고 콜백 오브젝트의 메서드 호출
콜백
클라이언트 메소드에 있는 정보와 템플릿이 제공한 참조정보를 이용해서 작업수행 후 결과를 템플릿에 반환
템플릿
<aside> 💡
일반적인 DI: 템플릿에 인스턴스 변수를 만들어두고 사용할 의존 오브젝트를 수정자 메서드로 받아 사용 템플릿/콜백 방식: 매번 메서드 단위로 사용할 오브젝트를 새롭게 전달받는다.
</aside>