-
[Spring] JdbcTemplate의 기본Spring 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 을 사용할 수 있다.
'Spring' 카테고리의 다른 글
[Spring] Lombok 개념 및 사용법 (1) 2024.04.22 [Spring] Spring Data JPA(Java Persistence API)란? (1) 2024.04.21 [Spring] Controller, Service, Repository 가 무엇일까? (0) 2024.04.20 [Spring] DAO, DTO, VO, Entity 개념 및 차이점 (0) 2024.04.19 [Spring] 스프링 MVC란 무엇인가? (1) 2024.04.18