Study/Spring

[Spring] spring JDBC

개발개발개발 2021. 10. 4. 16:34

JDBC 는 자바의 데이터 액세스 기술의 기본이 되는 로우레벨의 API다. 

JDBC는 표준 인터페이스를 제공하고 개발자가 이 인터페이스를 구현한 드라이버를 제공하는 방식으로 사용된다. 그 덕분에 SQL의 호환성만 유지한다면 JDBC로 개발한 코드는 DB가 변경돼도 그대로 재사용할 수 있다는 장점이 있다. 

 

그렇다면 단점은?

간단한 SQL을 하나 실행하는 데도 복잡한 코드가 필요하다. DB에 따라 일관성 없는 정보를 가진 채로 던져지는 예외 처리를 해야하며 SQL은 코드 내에서 문자로 제공해야 한다. 

 

스프링 JDBC 기술과 동작 원리 

- 스프링의 JDBC 접근 방법

1. SimpleJdbcTemplate

-> 가장 많이 사용되는 기능을 통합하였다. 방대한 템플릿 메소드와 내장된 콜백을 제공하며 jdbc의 모든 기능을 활용할 수 있는 유용성을 갖고 있다.

 

2. SimpleJdbcInsert, SimpleJdbcCall

-> DB가 제공하는 메타 정보를 활용해서 최소한의 코드만으로 단순한 JDBC 코드를 작성하게 해준다. 메타 정보에서 컬럼 정보와 파라미터 정보를 가져와 SQL과 프로시저 호출 작업에 사용하기 때문에 편리한 장점이 있다. 

 

- 스프링의 JDBC가 해주는 작업

스프링 JDBC가 이런 대부분의 작업을 해주기 때문에 개발자는 로직마다 달라지는 부분만 정의해주면 된다. SQL과 바인딩할 파라미터를 넘겨주거나 쿼리의 실행 결과를 어떻게 처리할 지 지정해 주는 정도면 충분하다. 

하지만, 찾기 힘든 버그를 발생시키기도 한다. 

 

1. Connection 열기와 닫기

-> Connection과 관련된 모든 작업은 스프링 JDBC가 필요한 시점에 알아서 진행해준다. 예외가 발생하더라도 모든 Connection을 닫아 준다. Connection을 열고 닫는 시점은 스프링 트랜잭션 기능과 맞물려서 결정된다. 

 

2. Statement 준비와 닫기

-> statement 또는 PreparesStatement를 생성하고 준비하는 작업을 한다. statement 역시 사용이 끝나면 스프링 JDBC가 알아서 반환하기 때문에 신경쓰지 않아도 된다. 

 

3. Statement 실행

-> SQL이 담긴 statement를 실행한다.

 

4. ResultSet 루프

-> ResultSet에 담긴 쿼리 실행 결과가 한 건 이상이라면 각각의 행을 처리해야 한다. 루프를 만들어 반복해주는 것도 스프링 JDBC가 해주는 작업이다. 

 

5. 예외처리와 변환

-> JDBC 작업 중 발생하는 모든 예외는 스프링 JDBC의 예외 변환기가 처리해준다. DB별 에러 코드를 참고해서 일관된 의미를 가진 DataAccessException 계층 구조 내의 예외로 변환한다. 

 

6. 트랜잭션 처리

-> 스프링 JDBC는 트랜잭션 동기화 기법을 이용해 선언적 트랜잭션 기능과 맞물려서 돌아간다. 트랜잭션 시작 후에 스프링 JDBC의 작업을 요청하면 진행 중인 트랜잭션에 참여한다. 스프링 JDBC를 사용하면 트랜잭션과 관련된 모든 작업에 대해서는 신경 쓰지 않아도 된다. 

 

 

 

 

 

 

 

 

 

 

 

 

'Study > Spring' 카테고리의 다른 글

[Spring] RestTemplate  (0) 2021.09.23
[Spring] Handler Method(ResponseEntity)  (0) 2021.09.12
[Spring] @ModelAttribute  (0) 2021.09.08
[Spring] Spring IoC Container 그리고 Bean  (0) 2021.08.29
[Spring] Dispatcher Servlet  (0) 2021.08.24