[Spring.4-3] Data Access Layer
Data Access Layer
정의
비즈니스 레이어에서 비즈니스 로직을 제외한, 순수데이터베이스 관련 로직을 기능 컴포넌트로 뺀 레이어.
Request로부터의 조건에 따라 Data Access를 수행하며, 그 결과를 비즈니스 레이어로 반환한다.
DAO(Data Access Object)를 구성하는 기준으로는 테이블을 기준으로 오브젝트를 구성할 수도 있고, 비즈니스 기능별로 구성할 수도 있다.
속성/특성
데이터베이스에 접근하는 ‘datasource’ 객체와 datasource를 이용해서 DAO 구성을 용이하게 해주는 JDBC, JPA, Hibernate, Mybatis 등의 도구가 필요하다.
1. Datasource
datasource 객체는 DB properties가 담겨있는 객체이다.
datasource 객체는 Factory의 개념이고, 인스턴스 객체를 생성하여 논리적 접속 상태를 만든 후 그 객체로부터 실제 물리적 접속 상태인 connection객체를 받아 사용한다.
또한, Connection pooling을 구현한 datasource object는 겉으로는 일반 connection과 동일하게 사용하나 내부적으로는 실제 물리적 접속이 아닌 PooledConnection object 객체를 받아 사용 후 다시 Connection pool에 반환한다.
datasource object에는 4가지 정보: driverClassName, 데이터베이스 주소, username, password 가 필요하다.
1) dbcp(org.apache.commons.dbcp.BasicDataSource) 사용.
- 오픈소스 데이터베이스 커넥션 풀이다. 간편하여 개발용 또는 소규모 프로젝트용으로 많이 사용된다.
- but, 운영 환경에서는 다음과 같은 이유로 권장하지 않는다.
1) Connection Pool에서 connection을 유지하기 위해서 각종 설정(check query, connection time out 등)을 해야 하는데 주로 하지 않아서 Exception이 많이 발생한다.
2) 또한, DB 정보를 주로 암호화하지 않고 사용하는 경우가 많기 때문에 안전하지 않다.
3) 마지막으로, 모니터링이 되지 않는다. 외부 모니터링 Tool을 사용해야 한다.
이런 단점 때문에 dbcp보다는 2) WAS의 datasource를 이용하는 방식이 선호된다.
2) WAS에 datasource 정의 및 사용
- WAS에서 datasource를 생성하고 application에서는 JNDI(Java Naming and Directory Interface) look-up으로 datasource 객체를 가져와 사용한다. 예)
2. DAO 구성 Framework
Java에서 제공하는 데이터베이스 접근 Api인 JDBC와 Hibernate, Mybatis, JPA 등의 외부 Framework이 재하는데 이것들은 Spring과의 연계를 위한 Spring-JDBC, Hibernate-Spring, Mybatis-Spring등을 지원한다.
Framework을 사용하면 좀 더 편하게 DAO를 구현할 수 있고 각 Framework 별로 성격이 다르기 때문에 특성에 맞는 것을 선택해서 사용한다.
- Spring-JDBC
Template기반으로, queryForObject 등의 다양한 템플릿을 지원한다.
- Hibernate
ORM(Object Relational Mapping) Framework로 Java Object와 Query를 1:1(혹은 1:多) 매핑시켜 준다. SQL문을 직접 작성하는 것이 아니라 자바 언어로 구현하면, Hibernate가 SQL 문을 생성해준다.
강한 결합이기 때문에 DB 또는 Java Object가 수정되면 그 각각을 모두 수정해주어야 한다.
SQL몰라도 됨. 단순한 쿼리 처리에 좋음. Join할 경우 복잡. - MyBatis-Spring(MyBatis = iBatis)
SQL은 독립적으로 작성하며, 도메인과 레코드 간 변환을 자동화함.
기타
Spring 연계 JDBC/JPA/MyBatis 등을 사용하면 좋은 점은
1) Connection 관리를 해준다.
2) Spring Transaction을 지원한다.
Spring Transaction 설정에 맞게 connection을 open/rollback/commit/close 해준다.
3) Spring 범용 exception을 지원한다.
Database에 따라 다양한 error code를 Spring 범용 exception code로 바꿔 DB에 독립적인 exception처리가 가능하게 한다.