JDBC 템플릿 패턴이란?
JDBC 템플릿 패턴은 템플릿 메소드 패턴을 JDBC 코드에 적용하여 반복적인 코드를 제거하고 개발자의 생산성을 향상시키는 디자인 패턴입니다.
핵심 개념
템플릿 메소드 : JDBC 작업의 공통적인 부분을 담당하는 메소드입니다. 예를 들어, 데이터베이스 연결, 쿼리 실행, 결과 처리 등을 수행합니다.
콜백 : 템플릿 메소드에서 특정 작업을 수행하도록 정의된 인터페이스입니다. 개발자는 템플릿 메소드에 콜백을 전달하여 특정 쿼리나 업데이트 작업을 구현합니다.
장점
코드 중복 감소 : 반복적인 JDBC 코드를 템플릿 메소드에 추출하여 코드의 간결성과 가독성을 향상시킵니다.
유지 관리 용이 : 템플릿 메소드를 통해 코드 변경 및 유지 관리가 용이해집니다.
확장성: 콜백 인터페이스를 통해 새로운 기능을 쉽게 추가할 수 있습니다.
예외 처리: 템플릿 메소드에서 예외 처리를 중앙적으로 관리하여 코드의 안정성을 높입니다.
구현 방법
템플릿 메소드 정의: JDBC 작업의 공통적인 부분을 담당하는 메소드를 정의합니다.
콜백 인터페이스 정의: 템플릿 메소드에서 특정 작업을 수행하도록 정의된 인터페이스입니다.
콜백 구현: 쿼리 실행, 결과 처리 등 특정 작업을 수행하는 콜백 클래스를 구현합니다.
템플릿 메소드 사용: 템플릿 메소드에 콜백 클래스를 전달하여 JDBC 작업을 수행합니다.
JDBC 템플릿 패턴 활용 예시
데이터 조회: query 메소드를 사용하여 데이터베이스에서 데이터를 조회합니다.
데이터 추가: update 메소드를 사용하여 데이터베이스에 데이터를 추가합니다.
데이터 수정: update 메소드를 사용하여 데이터베이스의 데이터를 수정합니다.
데이터 삭제: update 메소드를 사용하여 데이터베이스의 데이터를 삭제합니다.
package com.spring.biz.member;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.stereotype.Repository;
// DAO → DAO02
// JDBCTemplate 을 활용한 버전업
// JDBCTemplate : 템플릿 패턴을 활용한 클래스
// 반복되는 JDBC 의 로직을 캡슐화한 클래스
// : 기존 DAO 에 템플릿 패턴을 활용한 클래스를 구현해서 가독성 증가
// ※ 템플릿 패턴 이란?
// ▶ 주로 반복되거나, 복잡한 로직을 캡슐화한 클래스
@Repository("memberDAO")
public class MemberDAO2 {
@Autowired // ★ @Autowired 는 만능이아니다...
private JdbcTemplate jdbcTemplate; // 의존관계 ▶ DI(의존주입)
private static final String SELECTALL="SELECT * FROM MEMBER";
private static final String SELECTONE="SELECT * FROM MEMBER WHERE MID=? AND PASSWORD=?";
private static final String INSERT="INSERT INTO MEMBER (MID,PASSWORD,NAME,ROLE) VALUES(?,?,?,?)";
private static final String UPDATE="";
private static final String DELETE="";
// ※ ArrayList 보다는 List 를 훨씬 많이 사용
// ※ ArrayList ▶ List 변경할것!!!
public ArrayList<MemberDTO> selectAll(MemberDTO mDTO) {
return (ArrayList<MemberDTO>)jdbcTemplate.query(SELECTALL, new MemberRowMapper());
}
public MemberDTO selectOne(MemberDTO mDTO) {
Object[] args= { mDTO.getMid(), mDTO.getPassword() };
return jdbcTemplate.queryForObject(SELECTONE, args, new MemberRowMapper());
}
public boolean insert(MemberDTO mDTO) {
int result=jdbcTemplate.update(INSERT, mDTO.getMid(), mDTO.getPassword(), mDTO.getName(), mDTO.getRole());
if(result<=0) {
return false;
}
return true;
}
public boolean update(MemberDTO mDTO) {
int result=jdbcTemplate.update(UPDATE, mDTO.getMid(), mDTO.getPassword(), mDTO.getName(), mDTO.getRole());
if(result<=0) {
return false;
}
return true;
}
public boolean delete(MemberDTO mDTO) {
int result=jdbcTemplate.update(DELETE, mDTO.getMid(), mDTO.getPassword(), mDTO.getName(), mDTO.getRole());
if(result<=0) {
return false;
}
return true;
}
}
class MemberRowMapper implements RowMapper<MemberDTO> {
@Override
public MemberDTO mapRow(ResultSet rs, int rowNum) throws SQLException {
MemberDTO data=new MemberDTO();
data.setMid(rs.getString("MID"));
data.setPassword(rs.getString("PASSWORD"));
data.setName(rs.getString("NAME"));
data.setRole(rs.getString("ROLE"));
return data;
}
}
댓글