ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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 컨테이너를 필요로 하지 않음
    • queryForObject() 메소드
      • get() 메소드 수정
        • ResultSet의 결과를 User 오브젝트를 만들어 프로퍼티에 대입
        • RowMapper 콜백을 사용
          • SQL 실행 결과가 로우 하나에 대응
          • ResultSet의 첫 번째 로우에 RowMapper를 적용하도록 수정
        • queryForObject 메소드는 쿼리를 실행하면 한 개의 로우만 얻을 것이라고 기대
        • 예외 상황에 대한 처리도 되어있음
    • query() 메소드
      • 결과가 없는 경우에 크기아 0인 List 오브젝트를 반환
      • 제네릭 설정으로 쿼리 실행 결과를 담을 오브젝트를 설정
      • 테스트 코드 작성 시, 예외 상황에 대한 테스트가 중요
        • 크기가 0인 경우, 원하던 기대값이 아니라면 테스트 코드를 설정하는 것도 좋은 방법
    • 재사용 가능한 콜백의 분리
      • DI를 위한 코드 정리
        • DataSource 인스턴스 변수 제거
          • 직접 DI 해주기 위해 필요한 DataSource를 전달 받는 수정자 메소드는 유지
          • JdbcTemplate을 스프링 빈으로 등록하는 방식을 사용하고 싶다면, setDataSource 대신 setJdbcTemplate으로 바꿔 사용
        • 중복 제거
          • get 메소드와 getAll 메소드에서 사용하는 RowMapper 내용이 같음
            • 다양한 조건으로 사용자를 조회하는 검색 기능이 추가될 것을 고려하여 확장을 위해 분리 및 재사용
            • RowMapper 콜백 오브젝트는 상태 정보가 없기 때문에 싱글톤으로 사용
      • 템플릿/콜백 패턴과 UserDao
        • UserDao는 User 정보를 DB 조작 방법에 대한 핵심 로직만 있음 ~> 최적화
          • 응집도가 높다
        • JdbcTemplate은 JDBC API를 사용하는 방식, 리소스 반납, 예외 처리 DB 접근 등 관심
        • 따라서, 낮은 결합도를 유치하면서도 템플릿/콜백 구현에 대한 강한 결합을 가짐
        • JdbcTemplate을 DAO 안에서 직접 만들어 사용하는게 스프링의 관례이지만, JdbcOperations 인터페이스를 통해 DI를 받아 사용하는 방법이 존재
        • UserDao 개선 사항
          • userMapper가 인스턴스 변수로 설정되어 있고, 변경되지 않는 프로퍼티의 성격을 지님
            • DI용 프로퍼티로 수정
            • User 프로퍼티와 DB 단에 수정이 일어나도 UserDao 코드 수정 없이 매핑 정보 수정 가능
          • SQL 문장을 외부 리소스에 담고 호출해서 사용

    정리

    • 안전한 리소스 반환, 객체지향 설계 원리, 디자인 패턴, DI 에 중점을 두고 학습했음
    • 예외 발생 가능성에 대해 try/catch/finally 블록으로 관리
    • 전략 패턴을 이용해서, 바뀌지 않는 부분은 컨텍스트로 / 바뀌는 부분은 전략으로 인터페이스를 통해 연결해서 사용
    • 클라이언트 메소드 안에 익명 내부 클래스로 사용
    • 컨텍스트 하나 이상의 클라이언트 오브젝트에서 사용된다면, 클래스를 분리해서 공유
    • 컨텍스트는 DI 받거나 직접 생성
    • 템플릿 / 콜백 패턴
    • 콜백의 코드에 일정 패턴이 반복 ~> 템플릿에 넣고 재활용
    • 템플릿과 콜백 사이에 주고받는 정보에 관심
    반응형

    댓글

Designed by Tistory.