전체 글501 7.4.11 가변인자를 활용해 쿼리에 인자 전달하기 쿼리에 값을 전달할 때 PreparedStatementSetter 를 활용할 수도 있지만 가변 인자를 활용해 값을 전달할 수도 있다. JdbcTemplate 에 가변인자를 활용하는 새로운 update() 메서드를 추가한다. - JdbcTemplate.javapublic class JdbcTemplate { public void update(String sql, Object... parameters) throws DataAccessException { try (Connection conn = ConnectionManager.getConnection(); PreparedStatement pstmt = conn.prepareStatement(sql)) { .. 2025. 7. 27. 7.4.10 제너릭(generic)을 활용한 개선 JdbcTemplate 을 사용해보니 데이터를 조회할 때 매번 캐스팅을 해야 한다는 점이 불편하다. 자바의 제너릭을 적용해 캐스팅 하지 않도록 개선한다. - RowMapper.javapublic interface RowMapper { T mapRow(ResultSet rs) throws SQLException;} 위와 같이 자바의 제너릭 문법을 사용하도록 RowMapper 를 수정한 후 JdbcTemplate 에도 제너릭 구문을 추가한다. - JdbcTemplate.javapublic abstract class JdbcTemplate { public void update(String sql, PreparedStatementSetter pss) throws DataAccessException {.. 2025. 7. 26. 7.4.9 런타임 Exception 추가 및 AutoClosable 활용한 자원 반환 UserDao 문제점 중의 하나는 모든 메서드가 컴파일타임 Exception 인 SQLException 을 throw 한다는 것이다. 런타임 Exception 을 추가해 이 문제점을 해결해 본다. 먼저 RuntimeException 을 상속하는 새로운 Exception 을 추가한다. - DataAccessException.javapackage core.jdbc;public class DataAccessException extends RuntimeException { private static final long serialVersionUID = 1L; public DataAccessException() { super(); } public DataAccessExceptio.. 2025. 7. 24. 7.4.8 인터페이스 추가를 통한 문제점 해결 이 같은 문제점이 생기는 원인은 JdbcTemplate 의 추상 메서드의 변화 시점이 다를 수 있는데, 항상 같이 변화하도록 의존관계가 생겼기 때문이다. setValues() 메서드와 mapRow() 메서드를 분리해 서로 간의 의존관계를 끊어버릴 수만 있다면 좀 더 유연한 개발이 가능하도록 지원할 수 있다. 이를 해결하려면 두 개의 추상 메서드를 같은 클래스가 가지도록 구현하지 말고, 각각의 추상 메서드를 인터페이스를 통해 분리할 수 있다. - PreparedStatementSetter.javapublic interface PreparedStatementSetter { void setValues(PreparedStatement pstmt) throws SQLException;} - RowMapper.. 2025. 7. 23. 7.4.7 JdbcTemplate 과 SelectJdbcTemplate 통합하기 지금까지 리팩토링 과정을 통해 UserDao 에 있던 많은 중복 코드를 제거했다. 이제 모든 SQL에 대한 처리를 공통 라이브러리를 활용해 해결할 수 있게 되었다. 그런데 개발자 입장에서 생각해보면 API를 사용할 때 여러 개의 클래스를 제공하는 것보다 클래스 하나를 제공하는 것이 학습 측면에서 더 좋을 것이다. JdbcTemplate 과 SelectJdbcTemplate 클래스의 구현 부분을 보니 중복 코드도 많아 클래스 하나로 통합하는 것이 좋겠다. 두 개의 클래스를 JdbcTemplate 하나로 통합한다. - JdbcTemplate.javapublic abstract class JdbcTemplate { public void update(String sql) throws SQLException.. 2025. 7. 22. 7.4.6 SELECT 문에 대한 리팩토링 SELECT 에 대해서도 앞의 과정과 같은 방법으로 리팩토링을 진행할 수 있다. 한 가지 다른 점이라면 SELECT의 경우 조회한 데이터를 자바 객체로 변환하는 부분이 추가적으로 필요하다. 자바 객체로 변환하는 부분은 mapRow() 라는 메서드를 추상 메서드로 추가해 구현한다. - SelectJdbcTemplate.javapublic abstract class SelectJdbcTemplate { @SuppressWarnings("rawtypes") public List query(String sql) throws SQLException { Connection con = null; PreparedStatement pstmt = null; ResultSet.. 2025. 7. 21. 7.4.5 User 의존관계 제거 및 SQL 쿼리 인자로 전달 JdbcTemplate 을 UserDao 가 아닌 곳에서도 사용하려면 User 에 대한 의존관계도 끊어야 한다. 그런데 JdbcTemplate 의 update() 메서드를 살펴보니 굳이 User 를 인자로 전달하지 않아도 된다. setValues() 메서드를 통해 User 인자를 전달하지 않고 UserDao 의 insert(), update() 메서드의 User 인스턴스에 직접 접근하도록 리팩토링 한다. 그러면 JdbcTemplate 의 User 와의 의존관계를 가지지 않아 다른 곳에서도 사용할 수 있다. - JdbcTemplate.javapublic abstract class JdbcTemplate { public void update() throws SQLException { Con.. 2025. 7. 19. 7.4.4 InsertJdbcTemplate 과 UpdateJdbcTemplate 통합 공통 라이브러리를 담당할 클래스를 분리하니 굳이 메서드 이름을 ForInsert, ForUpdate 와 같이 붙일 필요가 없어졌다. 메서드 이름을 createQuery(), setValue() 로 Rename 리팩토링을 진행한다. 메서드 이름을 변경한 후 InsertJdbcTemplate의 insert() 메서드와 UpdateJdbcTemplate 의 update() 메서드 구현부에 다른 부분이 없이 똑같다. 굳이 두 개의 클래스로 분리할 필요 없다. UpdateJdbcTemplate 클래스를 JdbcTemplate 으로 이름을 바꾸고, 메서드 이름은 update() 를 사용하도록 리팩토링 한다. - JdbcTemplate.javapublic abstract class JdbcTemplate { p.. 2025. 7. 18. 7.4.3 UserDao와 InsertJdbcTemplate의 의존관계 분리 새로운 클래스를 추가해 분리하니 공통 라이브러리에 대한 기본 뼈대가 만들어진 느낌이 든다. 그런데 새로 추가한 InsertJdbcTemplate 은 UserDao 와 의존관계를 가지고 있기 때문에 UserDao 가 아닌 다른 곳에서는 사용할 수 없다. 따라서 InsertJdbcTemplate 의 UserDao 에 의존관계를 가지지 않도록 해야 한다. 의존관계를 가지지 않도록 하는 방법은 createQueryForInsert(), setValuesForInsert() 메서드가 InsertJdbcTemplate 에 존재해야 한다. 하지만 InsertJdbcTemplate 이 메서드에 대한 구현을 담당하면 안 된다. 메서드 구현은 UserDao 가 담당해야 한다. 이와 같이 메서드는 존재하지만 구현을 담당하지.. 2025. 7. 17. 이전 1 2 3 4 5 6 7 8 ··· 56 다음