프로그래밍/Spring

Spring JDBC & JdbcTemplate

Jay Tech 2017. 1. 2. 12:48
반응형

JDBC는 모든 자바의 데이터 액세스 기술의 근간이 된다.

ORM 기술들도 (Mybatis hibernate) 내부적으로는 DB와 연동을 위해 JDBC를 이용한다.


안정적이고 유연한 기술이지만 , low level 기술로 인식 되고 있다.

간단한 SQL을 실행하는 데도 중복된 코드가 반복적으로 사용되며, DB에 따라 일관성 없는 정보를 가진 채로 Checked Exception으로 처리한다.

장점 : 대부분의 개발자가 잘 알고 있는 친숙한 데이터 액세스 기술로 별도의 학습 없이 개발이 가능하다.

단점 : Connection과 같은 공유 리소스들을 제대로 릴리즈 해주지 않으면 시스템 자원이 바닥나는 버그를 발생시킨다.


Spring JDBC


JDBC의 장점과 단순성을 유지하면서 기존의 단점을 보완하고 간결한 api를 제공하며 원래의 JDBC에서 지원되지 않는 편리한 기능을 제공ㅇ한다.


Spring JDBC는 반복적으로 해야 하는 많은 작업들을 대신 해준다.

Spring JDBC를 사용할 때는 실행할 SQL과 바인딩할 매개변수를 넘겨주거나, 쿼리의 실행결과를 어떤 객체에게 넘겨 받을 지를 지정해주는 것만 하면된다.

우선적으로는 DB 커넥션을 가져오는 DataSource를 Bean으로 등록해야 한다.


Spring JDBC가 해주는 작업


1. Connection 열기와 닫기

진행중에 예외가 발생했을 때도 열린 모든 Connection 객체를 닫아준다.


2. Statement 준비와 닫기

SQL정보가 담긴 Statement 등을 생성하고 필요한 준비 작업을 한다.


3. Statement 실행

SQL이 담긴 Statement를 실행해 준다.


4. ResultSet Loop 처리

ResultSet에 담긴 쿼리 실행 결과가 한 건 이상이면 ResultSet 루프를 만들어서 반복해주는 것도 해준다.


5. Exception 처리와 반환

JDBC작업 중 발생하는 모든 예외는 Spring JDBC 예외 변환기가 처리한다.

런타임 Exception인 DataAccessExcpetion 타입으로 변환한다.


6. Transaction 처리 

transaction과 관련된 모든 작업에 대해서는 신경 쓰지 않아도 된다. (ex commit, rollback)


JdbcTemplate 클래스


JDBC의 모든 기능을 최대한 활용할 수 있는 유연성을 제공하는 클래스이다.

이 3가지를 수행한다.

실행 : Insert 나 Update같이 DB의 데이터에 변경이 일어나는 쿼리를 수행하는 작업

조회 : Select를 이용해 데이터를 조회하는 작업

배치 : 여러 개의 쿼리를 한 번에 수행해야 하는 작업


JdbcTemplate클래스 생성


DataSource는 보통 Bean으로 등록해서 사용함로 JdbcTemplate이 필요한 DAO 클래스에서 DataSource Bean을 DI받아서 생성할 떄 인자로 넘겨준다.

멀티쓰레드 환경에서도 공유해서 쓸 수 있다.


코드 작성법






update() 메소드




INSERT UPDATE DELETE SQL문을 실행할 떄는 JDBCTemplate의 update()를 사용한다 



작성예시







queryForObject() 메소드


SELECT로 SQL을 조져서 하나의 ROW를 가져올 때 사용한다.




- T는 VO객체의 타입

- RowMapper는 VO에 맵핑하는 작업을 한다


예시






pk로 지정한 값이므로 하나만 넘어온다

세번 째 파라메터에서 id name password칼럼을 읽어와서 user(VO)객체에 담아서 리턴해준다 => rowMapper의 기능



query() 메소드


SELECT로 여러 개의 row를 가져올 때 사용한다.




VO객체로 맵핑하는것은 같은 방식이지만 리턴타입이 위와 다르다.

queryForObject는 하나의 객체를 리턴하므로 리턴타입이 T 이다. (이미 결정되어져 나온다)

하지만  query()는 여러놈들이 나오므로 List로 받아준다.

List각각의 요소가 하나의 ROW에 맵핑된다고 볼 수 있다.





반응형

'프로그래밍 > Spring' 카테고리의 다른 글

[SpringOneTour] 스프링을 만든 Pivotal사가 한국을 방문했다!  (0) 2018.11.08
[IntelliJ] 스프링 프로젝트 초기 세팅하기 - (1)  (3) 2017.04.30
Spring MVC  (0) 2017.01.03
AOP  (0) 2017.01.02
IOC(제어의 역전)  (0) 2017.01.02