3. Template
3장 템플릿
3.1. 다시보는 초난감 DAO
3.1.1. 예외처리 기능을 갖춘 DAO
fun deleteAll() {
var connection: Connection? = null
var preparedStatement: PreparedStatement? = null
try {
connection = dataSource.connection
preparedStatement = connection.prepareStatement("delete from users")
preparedStatement.executeUpdate()
} catch (e: SQLException) {
throw e
} finally {
if (preparedStatement != null) {
try {
preparedStatement.close()
} catch (e: SQLException) {
// close 실패 시 별도 처리 없음
}
}
if (connection != null) {
try {
connection.close()
} catch (e: SQLException) {
// close 실패 시 별도 처리 없음
}
}
}
}JDBC 조회 기능의 예외 처리
getCount() 메서드의 예외 처리
3.2. 변하는 것과 변하지 않는 것
3.2.1. JDBC try/catch/finally 코드의 문제점
3.2.2. 분리와 재사용을 위한 디자인 패턴 적용
메서드 추출
템플릿 메서드 패턴
전략 패턴
3.3 JDBC 전략 패턴의 최적화
3.3.1. 전략 클래스의 추가 정보
3.3.2. 전략과 클라이언트의 동거
로컬 클래스 적용
익명 내부 클래스
3.4. 컨텍스트와 DI
3.4.1. JdbcContext의 분리
JdbcContext를 분리하는 이유
JdbcContext 클래스
UserDao는 어떻게 바뀌는가
의존관계 변화
3.4.2. JdbcContext의 특별한 DI
그럼에도 DI를 사용하는 이유
스프링 설정 관점에서의 의미
3.5. 템플릿과 롤백
try/catch/finally의 중복
템플릿/콜백의 기본 구조
3.5.1. 템플릿과 콜백의 역할 분리
콜백 인터페이스 (초기 형태)
3.5.2. 라인 단위로 더 잘개 쪼개기
3.5.3. 제네릭 도입의 이유
concatenate 예제가 왜 중요한가
3.6. 스프링의 JdbcTempalte
3.6. JdbcTemplate 도입 배경
3.6.1. JdbcContext -> JdbcTemplate로 변경
기존 코드
문제점
변경 후 코드 (JdbcTemplate 적용)
변화 요약
항목
기존
변경
3.6.2. update() 메서드 적용
기존 add 메서드 (콜백 기반)
변경 후 add 메서드
핵심 변화
3.6.3. queryForInt -> queryForObject
기존 getCount
3.6.4. RowMapper 적용 (get, getAll)
RowMapper 정의 (공통)
get 메서드
getAll 메서드
3.6.5. 최종 UserDao
정리
마무리
JDBC → Template → Callback → JdbcTemplate
UserDao 코드 진화 전체 과정 정리
요약
0단계. 초난감 DAO
특징
코드
1단계. try / finally 도입
목적
코드
문제점
2단계. 변하는 부분 분리 (메서드 추출)
목적
코드
한계
3단계. Template Method 패턴 (상속 기반)
목적
코드
문제점
4단계. Strategy 패턴 도입 (상속 → 조합)
전략 인터페이스
템플릿 메서드
deleteAll 적용
5단계. 익명 내부 클래스 → 람다
코드
의미
6단계. JdbcContext 클래스로 템플릿 분리
JdbcContext
UserDao
7단계. 콜백 더 단순화 (executeSql)
JdbcContext
UserDao
8단계. query / RowMapper / ResultSetExtractor 추가
getCount (ResultSetExtractor)
get (RowMapper)
9단계. JdbcTemplate 도입 (모든 템플릿 제거)
핵심 전환점
최종 UserDao (Kotlin, JdbcTemplate)
전체 변화 한 줄 요약
Last updated