-
3장) 3.6 스프링의 JdbcTemplate~ 3.7 정리Java & Spring/토비의 스프링 3.1 2021. 6. 17. 17:10반응형
3장 템플릿
3.6 스프링의 JdbcTemplate
- 스프링 제공 템플릿/콜백
- JdbcContext를 JdbcTemplate로 수정
- update() 메소드
- createPreapredStatement() 메소드와 대응되는 메소드로, SQL 문장만 파라메터 전달함으로써 사용
- add 메소드와 대응되는 콜백으로 사용하는 경우, 바인딩할 파라미터를 순서대로 전달
- queryForInt() 메소드
- ResultSetExtractor는 PreparedStatement 쿼리를 실행해서 얻은 ResultSet을 전달받는 콜백
- 콜백을 만들고 익명 내부 클래스를 복잡하게 설정
- JdbcTemplate에서 제공하는 queryForInt 메소드를 사용
- 스프링에서 제공하는 클래스지만 DI 컨테이너를 필요로 하지 않음
- ResultSetExtractor는 PreparedStatement 쿼리를 실행해서 얻은 ResultSet을 전달받는 콜백
- queryForObject() 메소드
- get() 메소드 수정
- ResultSet의 결과를 User 오브젝트를 만들어 프로퍼티에 대입
- RowMapper 콜백을 사용
- SQL 실행 결과가 로우 하나에 대응
- ResultSet의 첫 번째 로우에 RowMapper를 적용하도록 수정
- queryForObject 메소드는 쿼리를 실행하면 한 개의 로우만 얻을 것이라고 기대
- 예외 상황에 대한 처리도 되어있음
- get() 메소드 수정
- query() 메소드
- 결과가 없는 경우에 크기아 0인 List
오브젝트를 반환 - 제네릭 설정으로 쿼리 실행 결과를 담을 오브젝트를 설정
- 테스트 코드 작성 시, 예외 상황에 대한 테스트가 중요
- 크기가 0인 경우, 원하던 기대값이 아니라면 테스트 코드를 설정하는 것도 좋은 방법
- 결과가 없는 경우에 크기아 0인 List
- 재사용 가능한 콜백의 분리
- DI를 위한 코드 정리
- DataSource 인스턴스 변수 제거
- 직접 DI 해주기 위해 필요한 DataSource를 전달 받는 수정자 메소드는 유지
- JdbcTemplate을 스프링 빈으로 등록하는 방식을 사용하고 싶다면, setDataSource 대신 setJdbcTemplate으로 바꿔 사용
- 중복 제거
- get 메소드와 getAll 메소드에서 사용하는 RowMapper 내용이 같음
- 다양한 조건으로 사용자를 조회하는 검색 기능이 추가될 것을 고려하여 확장을 위해 분리 및 재사용
- RowMapper 콜백 오브젝트는 상태 정보가 없기 때문에 싱글톤으로 사용
- get 메소드와 getAll 메소드에서 사용하는 RowMapper 내용이 같음
- DataSource 인스턴스 변수 제거
- 템플릿/콜백 패턴과 UserDao
- UserDao는 User 정보를 DB 조작 방법에 대한 핵심 로직만 있음 ~> 최적화
- 응집도가 높다
- JdbcTemplate은 JDBC API를 사용하는 방식, 리소스 반납, 예외 처리 DB 접근 등 관심
- 따라서, 낮은 결합도를 유치하면서도 템플릿/콜백 구현에 대한 강한 결합을 가짐
- JdbcTemplate을 DAO 안에서 직접 만들어 사용하는게 스프링의 관례이지만, JdbcOperations 인터페이스를 통해 DI를 받아 사용하는 방법이 존재
- UserDao 개선 사항
- userMapper가 인스턴스 변수로 설정되어 있고, 변경되지 않는 프로퍼티의 성격을 지님
- DI용 프로퍼티로 수정
- User 프로퍼티와 DB 단에 수정이 일어나도 UserDao 코드 수정 없이 매핑 정보 수정 가능
- SQL 문장을 외부 리소스에 담고 호출해서 사용
- userMapper가 인스턴스 변수로 설정되어 있고, 변경되지 않는 프로퍼티의 성격을 지님
- UserDao는 User 정보를 DB 조작 방법에 대한 핵심 로직만 있음 ~> 최적화
- DI를 위한 코드 정리
정리
- 안전한 리소스 반환, 객체지향 설계 원리, 디자인 패턴, DI 에 중점을 두고 학습했음
- 예외 발생 가능성에 대해 try/catch/finally 블록으로 관리
- 전략 패턴을 이용해서, 바뀌지 않는 부분은 컨텍스트로 / 바뀌는 부분은 전략으로 인터페이스를 통해 연결해서 사용
- 클라이언트 메소드 안에 익명 내부 클래스로 사용
- 컨텍스트 하나 이상의 클라이언트 오브젝트에서 사용된다면, 클래스를 분리해서 공유
- 컨텍스트는 DI 받거나 직접 생성
- 템플릿 / 콜백 패턴
- 콜백의 코드에 일정 패턴이 반복 ~> 템플릿에 넣고 재활용
- 템플릿과 콜백 사이에 주고받는 정보에 관심
반응형'Java & Spring > 토비의 스프링 3.1' 카테고리의 다른 글
4장) 4.2 예외 전환 ~ 4.3 정리 (0) 2021.06.21 4장) 4.1 예외 (0) 2021.06.17 3장) 3.4 컨텍스트와 DI ~ 3.5 템플릿과 콜백 (0) 2021.06.11 3장) 3.1 다시 보는 초난감 DAO ~ 3.3 JDBC 전략 패턴의 최적화 (0) 2021.06.11 2.4 스프링 테스트 적용 ~ 2.6 정리 (0) 2021.06.03 - 스프링 제공 템플릿/콜백