MyJdbcTemplate에서 Connection을 받는 메소드 제거하기

Jang990·2026년 3월 24일

변경 이유

MyJdbcTemplate에서 Connection을 받도록 만들어놨다.
하지만 MyDataSource에서 트랜잭션 감지 기능이 추가된 DataSource가 추가되면서
Connection을 직접 주고 받을 필요없이 MyDataSource에서 커넥션을 뽑아 쓸 수 있게됐다.

MyJdbcTemplate에서 Connection을 받는 메소드 제거하고
MyDataSourceConnection을 받는 방식으로 바꿀 것이다.

변경된 코드

public class MyJdbcTemplate {
    private final MyDataSource myDataSource; // 추가됨

	// 추가됨
    public MyJdbcTemplate(MyDataSource myDataSource) {
        this.myDataSource = myDataSource;
    }

	// 제거됨
    /* public int update(Connection conn, MyPreparedStatementCreator psc, MyKeyHolder myKeyHolder) {
    	// 커넥션을 직접 받는다.
        try(PreparedStatement ps = psc.createPreparedStatement(conn)) {
            int result = ps.executeUpdate();
            myKeyHolder.setId(findGeneratedId(ps));
            return result;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    } */

	// 추가됨
    public int update(MyPreparedStatementCreator psc, MyKeyHolder myKeyHolder) {
        try(
        		// 커넥션을 직접 뽑아 쓴다.
                Connection conn = myDataSource.getConnection();
                PreparedStatement ps = psc.createPreparedStatement(conn)
        ) {
            int result = ps.executeUpdate();
            myKeyHolder.setId(findGeneratedId(ps));
            return result;
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }
    ...
}

변경 - 사용코드

MyJdbcTemplate 내부적으로 Connection을 얻어오면서,
Repository에서 Connection 의존성이 제거됐다.

public class UsersRepository {
    // private final MyDataSource myDataSource; 제거됨 - 1
    private final MyJdbcTemplate myJdbcTemplate;

	// 제거됨 - 1
    /* public UsersRepository(MyDataSource myDataSource, MyJdbcTemplate myJdbcTemplate) {
        this.myDataSource = myDataSource;
        this.myJdbcTemplate = myJdbcTemplate;
    } */
    
    // 추가됨 - 1
    public UsersRepository(MyJdbcTemplate myJdbcTemplate) {
        this.myJdbcTemplate = myJdbcTemplate;
    }

	// 제거됨 - 2
    /* public Users findById(long id) {
        try (Connection conn = myDataSource.getConnection()) {
            try {
                return myJdbcTemplate.queryForObject(conn, """
                            SELECT id, name, balance
                            FROM USERS
                            WHERE id = ?
                            """,
                        userRowMapper, id);
            }  catch(EmptyResultException e) {
                throw new IllegalArgumentException("음식을 찾을 수 없습니다. userId=%d".formatted(id), e);
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    } */ 
    
    // 추가됨 - 2
    public Users findById(long id) {
        try {
            return myJdbcTemplate.queryForObject("""
                            SELECT id, name, balance
                            FROM USERS
                            WHERE id = ?
                            """,
                    userRowMapper, id);
        }  catch(EmptyResultException e) {
            throw new IllegalArgumentException("음식을 찾을 수 없습니다. userId=%d".formatted(id), e);
        }
    }
	
    // 제거됨 - 3
    /* public void updateBalance(long userId, int balance) {
        try (Connection conn = myDataSource.getConnection()) {
            myJdbcTemplate.update(conn, """
                    UPDATE users
                    SET balance = ?
                    WHERE id = ?
                    """, balance, userId);
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    } */
    
    // 추가됨 - 3
    public void updateBalance(long userId, int balance) {
        myJdbcTemplate.update("""
                    UPDATE users
                    SET balance = ?
                    WHERE id = ?
                    """, balance, userId);
    }
    
    ...
}
profile
개발 기록 아카이브

0개의 댓글