Spring

[Spring] JdbcTemplate의 기본

kimjihoon 2024. 4. 19. 22:44

Spring에서 SQL을 사용할때 JdbcTemplate는 간단하면서 좋은 선택지이다. JdbcTemplate은 트랜잭션 관리 및 리소스 관리등을 자동으로 해주는 등 매우 편리하게 JDBC를 사용할 수 있게 도와준다.

 

 

Jdbc Template이란?

  • JdbcTemplate은 JDBC 코어 패키지의 중앙 클래스로 JDBC의 사용을 단순화하고 일반적인 오류를 방지하는데 도움이 된다. 개발자가 JDBC를 직접 사용할 때 발생하는 다음과 같은 반복 작업을 대신 처리해준다.

 

JdbcTemplate을 사용하는 이유

  • JdbcTemlate룰 사용하지 않은 기존의 방법
@Override
    public Member save(Member member) {
        String sql = "INSERT INTO MEMBER(member_id, money) VALUES (?, ?)";

        Connection con = null;
        PreparedStatement pstmt = null;

        try {
            con = getConnection();
            pstmt = con.prepareStatement(sql);
            pstmt.setString(1, member.getMemberId());
            pstmt.setInt(2, member.getMoney());
            pstmt.executeUpdate();
            return member;
        } catch (SQLException e) {
            throw exceptionTranslator.translate("save", sql, e);
        } finally {
            // TCP/IP 커넥션으로 연결되기 때문에 자원 해제해줘야 함
            close(con, pstmt, null); // 현재 코드에는 없지만 자원을 해제해주는 사용자 정의 메서드
        }
    }

 

  • save() 뿐만 아니라 DB에 접근하는 모든 메서드에서 Connection을 가져오고, PreparedStatement를 가져와서 sql을 수행하고 자원을 해제해주는 로직을 작성해 주어야 한다.
  • 중복 코드가 난무하고 너무 복잡하다

 

  • JdbcTemplate 사용
		...
        private final JdbcTemplate template;		
        public MemberRepository(DataSource dataSource) {
        	this.template = new JdbcTemplate(dataSource);
    	}
		...
 
		@Override
   		public Member save(Member member) {
            String sql = "INSERT INTO MEMBER(member_id, money) VALUES (?, ?)";
            template.update(sql, member.getMemberId(), member.getMoney());
        return member;
    }
  • JdbcTemplate을 사용하지 않은 코드보다 사용한 코드가 훨씬 간단해졌다.
  • JdbcTemplate을 사용하면 사용하지 않는 자원(커넥션 등)을 자동으로 해지해준다.

JdbcTemplate의 장점

  • 설정이 편리함
    -spring-jdbc 라이브러리에 포함되어 있기 때문에 jdbc를 사용한다면 기본적으로 사용할 수 있다.
    • 반복 문제 해결
      -JdbcTemplate은 템플릿 콜백 패턴을 사용해서, JDBC를 직접 사용할 때 발생하는 대부분의 반복작업을 대신 처리해준다.
      -개발자는 SQL을 작성하고, 전달할 파라미터를 정의하고, 응답 값을 매핑하기만 하면 된다.
      -우리가 생각할 수 있는 대부분의 반복 작업을 대신 처리해준다.
          ▫️ 커넥션 획득
          ▫️ statement를 준비하고 실행
          ▫️ 결과를 반복하도록 루프를 실행
          ▫️ 커넥션 종료, statement, resultset 종료
          ▫️ 트렌잭션 다루기 위한 커넥션 동기화

          ▫️ 예외 발생시 스프링 예외 변환기 실행

 

JdbcTemplate의 단점

  • 동적 쿼리문을 해결하기 어렵다

단점을 해결하기위해

  • 동적 쿼리문의 수얼한 작성을 위해 다른 DB 접근 기술을 사용할수있다.
  • 예를 들어 MyBatis와 JPA + QueryDSL 을 사용할 수 있다.