티스토리 뷰

Java/Spring

Spring JDBC

작은 거인 2017. 1. 8. 21:42

DAO 패턴


 - 데이터 액세스 계층은 DAO 패턴을 적용하여 비지니스 로직과 데이터 액세스 로직을 분리하는 것이 원칙.

 - 비지니스 로직이 없거나 단순하면 DAO와 서비스 계층을 통합할 수도 있지만, 의미 있는 비지니스 로직을 가진 어플리케이션이라면 데이터 액세스 계층을 DAO 패턴으로 분리해야 함.

 - DAO 패턴은 서비스 계층에 영향을 주지 않고 데이터 액세스 기술을 변경할 수 있는 것이 장점.



커넥션 풀링을 지원하는 DataSource


커넥션 풀링은 미리 정해진 갯수만큼의 DB 커넥션을 풀에 준비해두고, 어플리케이션이 요청할 때마다 Pool에서 꺼내서 하나씩 할당해주고 다시 돌려받아서 Pool에 넣는 식의 기법.

 - 다중 사용자를 갖는 엔터프라이즈 시스템에서라면 반드시 DB 커넥션 풀링 기능을 지원하는 DataSource를 사용해야 함.

 - Spring에서는 DataSource를 공유 가능한 Spring Bean으로 등록해주어 사용할 수 있도록 해줌.



JDBC란?


JDBC는 모든 자바의 데이터 액세스 기술의 근간이 됨. 엔티티 클래스와 애노테이션을 이용하는 최신 ORM기술도 내부적으로는 DB와의 연동을 위해 JDBC를 이용.

 - 안정적이고 유연한 기술이지만, 로우 레벨 기술로 인식되고 있다.

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

 장점

 단점

 대부분의 개발자가 잘 알고 있는 친숙한 데이터 액세스 기술로

 별도의 학습 없이 개발이 가능.

 Connection과 같은 공유 리소스를 제대로 릴리즈(반환)

 해주지 않으면 시스템의 자원이 바닥나는 버그가 발생.



Spring JDBC란?


JDBC의 장점과 단순성을 그대로 유지하면서도 기존 JDBC의 단점을 극복할 수 있게 해주고, 간결한 형태의 API 사용법을 제공하며, JDBC API에서 지원되지 않는 편리한 기능을 제공.

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

 - Spring JDBC를 사용할 때는 실행할 SQL과 바인딩 할 파라미터를 넘겨주거나, 쿼리 실행 결과를 어떤 객체에 넘겨 받을지를 지정만 하면 된다.

 - Spring JDBC를 사용하려면 먼저, DB 커넥션을 가져오는 DataSource를 Bean으로 등록해야 한다.



Spring JDBC가 해주는 작업


Connection 열기와 닫기

 - Connection과 관련된 모든 작업을 Spring JDBC가 필요한 시점에서 알아서 진행.

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


Statement 준비와 닫기

 - SQL 정보가 담긴 Statement 또는 PreparedStatement를 생성하고 필요한 준비 작업을 해주는 것도 Spring JDBC가 한다.

 - Statement도 Connection과 마찬가지로 사용이 끝나고 나면 Spring JDBC가 알아서 객체를 닫아줌.


Statement 실행

 - SQL이 담긴 Statement를 실행하는 것도 Spring JDBC가 해줌.

 - Statement의 실행 결과는 다양한 형태로 가져올 수 있다.


ResultSet Loop처리

 - ResultSet에 담긴 쿼리 샐행 결과가 한 건 이상이면 ResultSet 루프를 만들어서 반복해주는 것도 Spring JDBC가 해주는 작업.


Exception 처리와 반환

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

 - Checked Exception인 SQLException을 Runtime Exception인 DataAccessException 타입으로 변환.


Transaction 처리

 - Spring JDBC를 사용하면 transaction과 관련된 모든 작업에 대해서는 신경 쓰지 않아도 됨.

  * Transaction과 관련된 작업 : Commit, Rollback 등 작업의 단위



JdbcTemplate 클래스


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

 - JdbcTemplate이 제공하는 기능은 실행, 조회, 배치의 세가지 작업.

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

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

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


JdbcTemplate 클래스 생성

 - JdbcTemplate은 DateSource를 파라미터로 받아서 아래와 같이 생성할 수 있다.

JdbcTemplate template = new JdbcTemplate(dateSource);

 - DateSource는 보통 Bean으로 등록해서 사용하므로 JdbcTemplate이 필요한 DAO 클래스에서 DateSource Bean을 DI 받아서 JdbcTemplate을 생성할 때 인자로 넘겨주면 됨.

 - JdbcTemplate은 멀티스레드 환경에서도 안전하게 공유해서 쓸 수 있기 때문에 DAO 클래스의 인스턴스 변수에 저장해두고 사용할 수 있다.


JdbcTemplate 클래스의 update() 메서드

 - INSERT, UPDATE, DELETE와 같은 SQL을 실행할 때는 JdbcTemplate의 update() 메서드를 사용.

int update (String sql, [SQL 파라미터])

 - update() 메서드를 호출할 때는 SQL과 함께 바인딩 할 파라미터는 Object 타입 가변인자 (Object ... args)를 사용할 수 있다.

 - update() 메서드의 리턴되는 값은 SQL 실행으로 영향을 받은 레코드의 개수를 리턴.


JdbcTemplate 클래스의 queryForObject() 메서드

 - SELECT SQL을 실행하여 하나의 Row를 가져올 때는 JdbcTemplate의 queryForObject() 메서드를 사용

<T> T queryForObject (String sql, [SQL 파라미터], RowMapper<T> rm)

 - SQL 실행 결과는 여러 개의 Column을 가진 하나의 Row

 - T는 VO 객체의 타입에 해당.

 - SQL 실행 결과로 돌아온 여러개의 Column을 가진 한 개의 Row를 RowMapper 콜백을 이용해 VO 객체로 매핍.


JdbcTemplate 클래스의 query() 메서드

 - SELECT SQL을 실행하여 여러 개의 Row를 가져올 때는 JdbcTemplate의 query() 메서드를 사용

<T> List<T> query (String sql, [SQL 파라미터], RowMapper<T> rm)

 - SQL 실행 결과로 돌아온 여러 개의 Column을 가진 여러개의 Row를 RowMapper 콜백을 이용해 VO 객체로 매핑.

 - 결과 값은 매핑한 VO 객체를 포함하고 있는 List 형태로 받는다. List의 각 요소가 하나의 Row에 해당



<<Give it a Shot>>


테이블 생성


DataSource 설정 - bean.xml


DataSource 설정 - value.properties


* 테스트 결과는 생략



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

예제 보고 따라하다 겪는 LifeCycleException  (6) 2017.01.13
AOP 개요와 용어  (0) 2017.01.09
사용자 관리 프로젝트 아키텍쳐  (0) 2017.01.08
Annotation을 이용한 Bean 등록  (0) 2017.01.07
Bean 의존 관계 설정 방법  (0) 2017.01.07
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함