티스토리 뷰
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 |