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 을 사용할 수 있다.