본문 바로가기

스프링

[jdbc] Spring JdbcTemplate

스프링의 JdbcTemplate

UserDaoJdbcTemplate을 사용한 부분은 throws SQLException 지워도됨

 

만들어 쓰던 JdbcContext는 버리고 스프링의 jdbcTemplate로 변경

org.springframework.jdbc.core.JdbcTemplate

20. JdbcTemplate 생성자 파라미터로 DataSource 주입

48. JdbcTemplate의 콜백은 PreparedStatementCreator 인터페이스의 createPreparedStatement 메소드 이다.

23. 앞서 만들었던 excuteSql()과 같이 미리 준비된 콜백을 만들어서 템플릿을 호출하는 것까지 한번에 해주는 메소드가 존재함 update

요런식으로 jdbcTemplate를 이용할 수 있다.

 

 

 

UserDaoJdbcTemplate을 사용한 부분은 throws SQLException 지워도됨

 

 

51. ResultSetExtractor : PreparedStatement 쿼리를 실행해서 얻은 ResultSet 전달받는 콜백. 원하는 값을 추출해서 템플릿에 전달하면 템플릿은 나머지 작업을 수행한 뒤에 그 값을 query() 메소드의 리턴값으로 돌려준다. 또 하나 눈여겨볼 것 <Integer> 제네릭스 파라미터 타입을 갖는다는 점. ResultSetExtractor 제네릭 메소드에 적용되 query()의 리턴타입도 바뀌게됨.

 

UserDaoJdbcTemplate을 사용한 부분은 throws SQLException 지워도됨

 

 

44. query의 리턴타입 : List<T>. TRowMapper<T> 콜백 오브젝트에서 결정된다. 바인딩할 파라미터가 있다면 두번째 파라미터에 Object[]로 추가할 수 있고, 없다면 생략가능하다. 마지막 파라미터는 RowMapper 콜백이다. Query 템플릿은 SQL을 실행해서 얻은 ResultSet의 모든 로우를 열람하면서 로우마다 RowMapper 콜백을 호출한다. SQL 쿼리를 실행해 DB에서 가져오는 로우 개수만큼 호출 될 것이다. RowMapper는 현재 로우의 내용을 User 타입 오브젝트에 매핑해서 돌려주고, 미리 만들어진 List<User> 오브젝트가 리턴된다.

 

25. Get()43. getAll()을 보면 사용한 RowMapper가 같다는 것을 알 수 있다. ResultSet 로우 하나를 User 오브젝트 하나로 변환해주는 동일한 기능의 콜백이다.

겨우 두 번 나왔는데 이것도 중복일까??

로그인 등 조회 등 검색기능이 추가될 가능성 있으며, 개발 후 테이블의 필드가 추가되고 수정되게 되면 두 개 이상의 R0owMapper를 정확하게 수정해야하므로 중복제거

>  또한 하나의 콜백 오브젝트에는 상태정보가 없으므로, 멀티스레드에서 동시에 사용해도 문제가 되지 않으므로 하나만 만들어 공유해볼 것이다. 아래에서

 

네거티브 테스트 : 예외상황에 대한 테스트. Id가 없는 경우, 결과가 하나도 없는 경우 등, Id가 아닌 이상한 값을 주입하는 경우

53~55. Userid값의 알파벳순으로 빠른대로 비교한다.

57~61. 테스트에서 반복적으로 사용하므로 분리해놓음.(좋은 습관) 별도의 클래스로 빼놓는 것도 고려해보면 좋음

결과가 없는경우? 이상한 값이 들어오거나 값이 안들어오는 경우 등 네거티브 테스트부터 만드는 습관을 들여야 좋다.

>  UserDao getAll() query는 예외적인 경우 크기가 0인 리스트 오브젝트를 리턴한다. 이럴 때 굳이 검증 코드를 추가해야하는가? 그렇다. query 메소드에서 내부적으로 null로 바꿔서 리턴 및 다른 값으로 리턴할 수도 있기 때문. 결과가 없을 때 빈 리스트를 리턴하는지 직접 확인해보는 습관이 필요하다.

 

재사용 가능한 콜백의 분리

 

 

공통 콜백 익명내부클래스를 생성하고, get(), getAll()에서 사용한다.

1.     UserDao에는 User 정보를 DB에 넣거나 가져오는 조작하는 로직만 담겨있다.

2.     높은 응집도 : 테이블과 필드정보가 바뀌면 UserDao의 거의 모든 코드가 함께 바뀐다.

3.     낮은 결합도 : JDBC API, 예외처리, 리소스 반납, DB연결 가져오는 부분은 모두 JdbcTemplate에게 있다. 변경이 일어난다 해도 UserDao 코드에는 아무런 영향을 주지 않는다.

38. Integer.class 리턴 타입을 명시해준다.