[SPRING] JDBCTemplate ❓

수경·2025년 3월 23일

SpringFrameWork

목록 보기
11/24
post-thumbnail

🌱JDBCTemplate 란?

JdbcTemplateSpring JDBC 모듈에서 제공하는 핵심 클래스로, 자동 관리가 핵심이다.

순수 JDBC 코드같은 경우 Connection 생성, PreparedStatement 생성, SQL 실행, ResultSet 처리, close() 처리 등을 모두 직접 처리해야 한다.
하지만 JdbcTemplate을 사용하면 위 과정들이 자동 관리되어 간결한 코드 작성이 가능합니다.

JDBCTemplate 역할

  • JDBC의 Connection , Statement , ResultSet 등을 자동으로 관리

  • SQL 실행과 트랜잭션을 쉽게 다룰 수 있음

  • 예외 처리를 단순화 (SQLExceptionDataAccessException 으로 변환)

  • 코드 중복을 줄이고 가독성을 향상

JdbcTemplate을 이용한 JDBC 동작 흐름

1. DataSource 설정

	<!-- 데이터에 대한 속성 -->
	<bean id="datasource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
		<property name="driverClass" value="${jdbc.driverClassName}"></property>
		<property name="url" value="${jdbc.url}"></property>
		<property name="username" value="${jdbc.username}"></property>
		<property name="password" value="${jdbc.password}"></property>
	</bean>
	
	<bean id="memberDAO" class="com.test.pro06.member.dao.MemberDAOImpl">
		<property name="dataSource" ref="datasource" />
	</bean>
</beans>

2. JdbcTemplate 객체 생성

public class MemberDAOImpl implements MemberDAO {
    public JdbcTemplate jdbcTemplate;  // JdbcTemplate 객체 선언 (SQL 실행 도우미 역할)
    
    // DataSource를 받아 JdbcTemplate을 생성하는 메서드
    public void setDataSource(DataSource dataSource) {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }

3. SQL 실행 (query(), update() 등 사용)

 public int memberDel(String id) {
        String sql = "delete from member where id=?";  // 특정 회원 삭제 SQL 쿼리
        
        // 회원 삭제 실행
        int result = jdbcTemplate.update(sql, id);
        return result;  // 삭제된 행 수 반환
    }

4. 결과 처리 (RowMapper 사용)

@Override
public MemberVO mapRow(ResultSet rs, int rowNum) throws SQLException {
    MemberVO m = new MemberVO();  // 새로운 MemberVO 객체 생성
    m.setId(rs.getString("id"));  // ID 값 설정
    m.setPwd(rs.getString("pwd"));  // 비밀번호 값 설정
    m.setName(rs.getString("name"));  // 이름 값 설정
    m.setEmail(rs.getString("email"));  // 이메일 값 설정
    m.setJoinDate(rs.getDate("joinDate"));  // 가입 날짜 값 설정
    return m;  // MemberVO 객체 반환
}

5. 자원 정리 자동 처리(close() 호출 안 해도 됨!)
자원 정리 자동 처리는 queryForObject() 가 실행된 후 자동으로 이루어진다!

  • 자원 정리 자동 처리 : 내부적으로 close() 를 자동으로 호출해서 개발자가 직접 자원 정리 안 해도 된다. close() 를 하는 이유는 메모리 누수를 방지 하기 위함이다.

📌 queryForObject()가 하는 일

  • SQL 실행 (SELECT * FROM member WHERE id = ?)

  • 데이터베이스 연결 (Connection 객체 생성)

  • 쿼리 실행 (PreparedStatement 생성 및 실행)

  • 결과 처리 (ResultSet 에서 데이터 가져오기)

  • 자원 정리 (자동으로 ResultSet , PreparedStatement , Connection 을 닫음!)

  • 변환된 MemberVO 객체를 반환


🔹 기존 JDBC 방식 (자원 정리 필요)

Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;

try {
    conn = DriverManager.getConnection(url, user, password);
    pstmt = conn.prepareStatement("SELECT * FROM member WHERE id = ?");
    pstmt.setString(1, id);
    rs = pstmt.executeQuery();
    
    if (rs.next()) {
        member = new MemberVO();
        member.setId(rs.getString("id"));
        member.setPwd(rs.getString("pwd"));
        member.setName(rs.getString("name"));
        member.setEmail(rs.getString("email"));
        member.setJoinDate(rs.getDate("joinDate"));
    }
} catch (SQLException e) {
    e.printStackTrace();
} finally {
    // **직접 자원 정리 필요!**
    try { if (rs != null) rs.close(); } catch (Exception e) {}
    try { if (pstmt != null) pstmt.close(); } catch (Exception e) {}
    try { if (conn != null) conn.close(); } catch (Exception e) {}
}

👉 기존 JDBC에서는 close() 를 직접 호출해야 메모리 누수를 방지 할 수 있다.

🔹 JdbcTemplate 방식 (자원 정리 자동)

MemberVO member = jdbcTemplate.queryForObject(sql, new RowMapper<MemberVO>() {
    @Override
    public MemberVO mapRow(ResultSet rs, int rowNum) throws SQLException {
        MemberVO m = new MemberVO();
        m.setId(rs.getString("id"));
        m.setPwd(rs.getString("pwd"));
        m.setName(rs.getString("name"));
        m.setEmail(rs.getString("email"));
        m.setJoinDate(rs.getDate("joinDate"));
        return m;
    }
}, id);
return member;

👉 queryForObject() 가 끝난 후, 자원이 자동으로 반환되기 때문에 개발자가 close()직접 호출할 필요가 없다.

profile
개발 공부중•••

0개의 댓글