상세 컨텐츠

본문 제목

[3.5] 템플릿과 콜백

토비의스프링

by kwanghyup 2020. 10. 29. 01:42

본문

#편리한 콜백의 재활용

 

콜백의 분리와 재활용

 

복잡한 익명 내부 클래스의 사용을 최소화할 수 있는 방법을 찾아보자.

 

deleteAll()메소드의 내용을 통틀어서 바뀔 수 있는 것은 

오직 "truncate users"라는 문자열 뿐이다.

 

그렇다면 SQL 문장만 파라미터로 받아서 바꿀 수 있게하고

메소드 내용 전체를 분리해 별도의 메소드로 만들어보자.

 

deleteAll()메서드를 다음과 같이 분리하였다.

private void executeSql(String query) throws SQLException {
	this.jdbcContext.workWithStatementStrategy(
		new StatementStrategy() {
			
			@Override
			public PreparedStatement makePreparedStatement(Connection c) throws SQLException {
				return c.prepareStatement(query);
			}
		});
	
}

// ... 생략 

public void deleteAll() throws SQLException {
	executeSql("truncate users");
}

 

콜백과 템플릿의 결합

 

executeSql()메소드는 재사용 가능한 콜백을 담고 있는 메소드이므로

DAO가 공유할 수 있는 템플릿 클래스로 옮겨도 된다. 

JdbcContext클래스 안으로 executeSql()메소들 옮겨보자.

public class JdbcContext {
	
    // ... 생략
    
    // 접근 제어자를 public으로 변경한다. 
	public void executeSql(String query) throws SQLException {
		workWithStatementStrategy(
			new StatementStrategy() {
				
				@Override
				public PreparedStatement makePreparedStatement(Connection c) throws SQLException {
					return c.prepareStatement(query);
				}
			});	
	}
}

 

UserDao클래스도 수정한다.

public void deleteAll() throws SQLException {
	this.jdbcContext.executeSql("truncate users");
}

테스트를 수행하여 확인한다. 

 

관련글 더보기

댓글 영역