데이터 액세스 공통개념
DAO패턴
데이터 액세스 계층은 DAO패턴을 적용하여 비즈니스로직과 데이터 액세스 로직을 분리하는 것이 원칙이다.
DAO패턴은 서비스계층에 영향을 주지 않고 데이터 액세스 기술을 변경할 수 있는 장점이 있다.
커넥션 풀링을 지원하는 DataSource
커넥션 풀링 : 미리 DB커넥션을 풀에 준비해두고 애플리케이션이 요청할 때마다 할당하여 사용하고 다시 풀로 돌려주는 기법이다.
다중 사용자를 갖는 엔터프라이즈 시스템에서는 반드시 DB커넥션풀링 기능을 지원하는 DataSource를 사용해야한다.
Spring에서는 DataSource를 공유 가능한 Spring Bean으로 등록하여 사용한다.
DataSource 구현 클래스 종류
SimpleDriverDataSource : Spring이 제공하는 가장 단순한 DataSource 구현 클래스이다. getConnection()을 호출할 때마다 DB커넥션을 새로 만들고 따로 풀을 관리하지 않으므로 테스트 용도로만 사용해야 한다.
SingleConnectionDriverDataSource : 매번 DB커넥션을 생성하지 않기 때문에 SimpleDriverDataSource보다 빠르게 동작한다.
Apache Commons DBCP : 오픈소스 DB커넥션 풀 라이브러리이다.
c3p0 JDBC/DataSource Resource Pool : c3p0는 JDBC 3.0스펙을 준수하는 Connection과 Statement 풀을 제공하는 라이브러리이다.
Spring JDBC 개요
JDBC : 자바의 데이터 액세스 기술의 근간. 엔티티 클래스와 어노테이션을 이용하는 ORM기술도 내부적으로는 DB와의 연동을 위해 JDBC를 이용한다. 안정적이고 유연한 기술이지만 로우 레벨 기술로 인식되고 있다. 간단한 SQL을 실행하는 데도 중복된 코드가 반복적으로 사용되며, DB에 따라 일관성 없는 정보를 가진 채로 Checked Exception으로 처리한다.
Spring JDBC : JDBC의 장점과 단순성을 그대로 유지하면서 단점을 극복하고, 간결한 형태의 API사용법을 제공한다.
1. Connection 열기와 닫기 : connection과 관련된 모든 작업을 Spring JDBC가 필요한 시점에 알아서 진행한다.
2. Statement 준비와 닫기 : Statement 또는 PreparedStatement를 생성, 준비, 반납 작업을 수행한다.
3. Statement 실행 : SQL이 담긴 Statement를 실행해준다. 실행결과를 다양한 형태로 받을 수 있다.
4. ResultSet Loop 처리 : ResultSet에 담긴 쿼리 실행 결과가 한 건 이상이면 ResultSet루프를 만들어서 반복해준다.
5. Exception 처리와 반환 : JDBC 작업 중 발생하는 모든 예외는 Spring JDBC 예외 변환기가 처리한다. 체크 예외인 SQLException을 런타임 예외인 DataAccessException으로 변환한다. (개발자가 try catch의 catch절에서 처리하지 않아도 됨)
6. Transaction 처리 : commit, rollback과 같은 트랜잭션 처리 작업을 해준다.
Spring JDBC의 JdbcTemplate 클래스
Spring JDBC가 제공하는 클래스 중 JdbcTemplate는 JDBC의 모든 기능을 최대한 활용할 수 있는 유연성을 제공하는 클래스이다.
실행 : insert, update와 같이 DB의 데이터에 변경이 일어나는 쿼리를 수행하는 작업
조회 : select를 이용해 데이터를 조회하는 작업
배치 : 여러 개의 쿼리를 한 번에 수행해야 하는 작업
JdbcTemplate 클래스 생성
JdbcTemplate는 DBconnection을 제공하는 DataSource를 파라미터로 받아서 생성한다.
DataSource는 보통 Bean으로 등록해서 사용하므로 JdbcTemplate이 필요한 DAO클래스에서 DataSource Bean을 DI하여 JdbcTemplate을 생성할 때 인자로 넘겨준다.
JdbcTemplate은 멀티스레드 환경에서도 안전하게 공유해서 쓸 수 있기 때문에 DAO클래스의 인스턴스 변수에 저장해두고 사용할 수 있다.
update()메서드
Insert, update, delete와 같은 sql을 실행할 때 update메서드를 사용한다.
: int update(String sql, [SQL 파라미터])
파라미터는 Object 타입 가변인자를 사용할 수 있다.
sql실행으로 영향을 받은 레코드의 개수를 리턴한다.
queryForObject()메서드
하나의 row을 가져올 때 사용한다.
: <T> T queryForObject(S tring sql, [SQL파라미터], RowMapper<T> rm)
실행 결과는 여러 개의 컬럼을 가진 하나의 로우이다.
T는 VO객체의 타입에 해당된다.
리턴된 하나의 로우를 RowMapper콜백을 이용해 VO객체로 매핑해준다.
query()메서드
select sql을 실행하여 여러 개의 row를 가져올 때 사용한다.
: <T> List<T> query(String sql, [SQL파라미터], RowMapper<T> rm)
실행결과로 리턴되는 여러 개의 컬럼을 가진 여러 로우를 RowMapper콜백을 이용해 VO객체로 매핑한다.
이 때 List형태로 받는다.
DataSource 설정
'공부 > 스프링프레임워크' 카테고리의 다른 글
[spring] MyBatis (0) | 2021.11.18 |
---|---|
[spring] aop (0) | 2021.11.18 |
[spring] 사용자 관리 프로젝트 아키텍쳐 (0) | 2021.11.11 |
[spring] 빈 등록 메타정보 구성 및 의존관계 설정 어노테이션 (0) | 2021.11.11 |
[spring] DI, DL (0) | 2021.11.11 |