자바 개발자들이 가장 많이 사용하는 OR-매핑 프레임워크
하나의 작업 그룹에서 정의하고 구현한 것으로 자바 표준 스펙은 아니지만 안정성이나 성능면에서 검증된 프레임워크이다.
Hibernate
- Hibernate는 자바 환경을 위한 객체/관계형 매핑 도구이다(Hibernate is an object/relational mapping tool for Java environments.)
object/relational mapping (ORM) - ORM은 객체 모형으로부터 SQL 기반의 스키마를 가진 관계형 데이터 모형으로 데이터 표현을 매핑하는 테크닉
(technique of mapping a data representation from an object model to a relational data model with a SQL-based schema)
- 객체/관계형 매핑은 객체들과 데이터베이스 사이의 매핑을 설명하는 메타데이터를 사용함으로써,
자바 어플리케이션 내의 객체들을 관계형 데이터베이스에 있는 테이블로의 자동화된(그리고 투명한) 영속화이다.
1. Hibernate의 구조
1-1. Hibernate의 주요 컴포넌트 구성
[application 서비스를 제공하기 위한 persistance 객체를 지원하는 데이터 베이스와 configration]
[Lite Edition]
[Full Cream]
- SessionFactory(org.hibernate.SessionFactory)
단일 DB에 대한 매핑을 멀티 쓰레드에 안전한 캐시를 통해 관리
Session과 ConnectionProvider의 클라이언트를 위한 팩토리 클래스의 역할
- Session(org.hibernate.Session)
애플리케이션과 영속 저장소 사이의 데이터 교환을 처리해주는 단일 쓰레드 객체
JDBC 커넥션 관리, Transaction 객체를 생성하는 팩토리 역할도 수행
ID를 통해 영속객체를 검색하는데 사용하는 첫번째 레벨 캐시를 관리
웹 애플리케이션의 세션과는 관계없다!!
- 영속 객체(Persistent Object)
Session에 의해 DB 테이블에서 조회된 데이터가 일반 자바 객체에 담겨 관리되는 동안의 상태(Persistent)
- 전이 객체(Transient Object)
Session에 의해 관리되던 영속 객체가 Session이 종료되서 detached상태로 변경된 것
애플리케이션에 의해 생성되어 아직 Session에 할당되지 않은 객체
애플리케이션에서 일반 자바빈즈와 동일하게 사용 가능
- 트랜잭션(org.hiernate.Transaction)
트랜잭션 관리를 위해 애플리케이션에 의해 사용되는 단일 쓰레드 객체
JDBC, JTA, CORBA 트랜잭션을 추상화함
- ConnectionProvider(ofg.hibernate.connection.ConnectionProvider)
JDBC 커넥션에 의한 팩토리로 DataSource, JDBC DriverManager를 추상화한다.
- TransactionFactory(org.hibernate.TransactionFactory)
Transaction 인스턴스에 대한 팩토리
- Extension Interfaces
애플리케이션의 퍼시스턴스 계층의 특성을 최적화시키기 위해 개발자가 구현 가능한 선택적 확장 인터페이스 제공
1-2. 자바 객체와 데이터베이스 테이블 매핑
- hibernate-mapping
모든 매핑 사항들이 hibernate-mapping 요소 안에 선언
주로 사용되는 사항은 class 요소와 package 속성
- package
hibernate-mapping 요소 안에 선언된 class 요소들에 지정된 클래스 패키지 지정
- class
실제 자바 객체와 테이블의 매핑을 정의
속성 : name, table, mutable, dynamic-update, dynamic-insert, where
-id, composite-id
영속 객체의 ID, DB의 프라이머리 키를 지정
id : 테이블의 프라이머리 키 칼럼이 한개일 때 프라이머리 키 칼럼과 영속 객체의 프로퍼티 매핑
(프라이머리 키 값을 자동 생성 할 경우 generator 요소를 가질 수 있다)
composite-id : 여러개의 칼럼이 프라이머리 키를 구성할 때 키 칼럼과 영속 객체의 프로퍼티 매핑
- property
영속 객체의 프로퍼티와 테이블 칼럼을 매핑
속성 : name, type, column, length, precision, scale, not-null, unique, insert
1-3. HQL
- SQL 과 유사하지만 상속, 다형성, 연관 등의 객체지향적 특성을 갖는 Query Language
- from
영속 객체의 클래스에 매핑된 DB 테이블로부터 모든 데이터를 조회
auto-import="false"인 경우 패키지 명을 포함한 클래스명을 지정해줘야 한다.
- select
질의 결과속에서 어느 객체들과 프로퍼티들을 반환할지 골라내야 한다면 select 구문 사용
집계 함수들의 결과를 조회하기 위해 사용할 수도 있다.(avg, sum, min, amx, count...)
- where
조회할 데이터의 범위를 줄여주기 위한 조건을 지정할 때
조인(Join) 조건을 지정하기 위해 사용할 수도 있다.
- order by
조회된 데이터의 순서를 지정할 때 이용
오름차순, 내림차순 지정을 위해 asc, desc 옵션 지정 가능
- group by
집계 합수를 사용할 때 주로 이용
2. Session 객체
2-1. 영속 객체의 상태
- Hibernate에서 DB로 부터 가져온 객체의 상태
Hibernate에서는 DB와 객체사이를 Session을 통하여 연결한다.
그러므로 Session이 open, close때 마다 그 가져온 객체나 생성된 객체는 상태가 Transient, Persistent, Detached의 세가지로 변하게 되며 각각의 상태는 아래와 같다.
a) Transient
객체가 막 새로 생성된 상태. 아직 Hibernate Session과 연관되어 있지 않다.
객체의 인스턴스가 임의의 HibernateContext와 연관되지 않은상태이며 인스턴스의 프라이머 키 값을 가지지 않으며 데이터 베이스의 행과는 관계가 없다.
b) Persistent
DB 내의 데이터와 매핑되고 ID 값을 갖는다.
Session의 관리하에 있으며, Hibernate는 변경 사항을 검출하여 작업이 완료될 때 DB와 상태를 동기화함.
인스턴스가 Context와 연관되어 있는 상태이며 인스턴스의 프라이머 키 값을 가지며
영속 Context의 프라미어 키 값과의 관계를 Hibernate가 보증하며 데이터 베이스 내에 대응하는 행을 가지고 있다.
c) Detached
Session이 종료된 상태 : 인스턴스가 Context와 연관이 되었었지만 지금 현재 Context가 닫혔거나, 다른 프로세스로 직렬화 된 상태
참조는 여전히 유효하고 나중에 새로운 Session에 다시 할당 가능
인스턴스의 프라이머 키 값이 영속 Context의 프라이머 키 값과의 관계를 보증 하지 않으며 DB 내에 대응하는 행을 가지고 있으나 그 데이터의 관계는 다를 수 있다.
2-2. 영속 객체 저장
Integer id = (Integer)session.save(객체);
ID 지정방법이 "native"인 경우 short, int, lon 타입의 ID 생성 (래퍼 클래스가 리턴)
ID 지정방법이 "uuid"인 경우 String 타입 ID 생성
ID 지정방법이 "assigned"이거나 ID가 여러칼럼이라 composite-id를 통해 지정한 경우 save()하기 전에 ID 초기화해야 됨.
2-3. 영속 객체 조회
객체 = session.load(객체.class, id);
일반적인 경우 특정 ID의 단일 영속객체의 조회보다는 특정 조건을 만족하는 영속 객체의 집합을 조호
이런 경우 HQL과 creatQuery()를 통해 Query 객체 생성 (오직 하나의 객체만 리턴한다면 uniqueResult() 이용)
DBMS별로 페이지 처리 기능 제공 (setFirsetResult(첫번째row), setMaxREsults(페이지당row))
2-4. SQL 사용
List list = session.createSQLQuery("select {p.*} from people p").addEntity(...),addMaxResults(...).list();
특정 DBMS에서만 지원하는 특징을 이용할 경우 Session 객체의 CreateSQLQuery()를 이용
2-5. Transaction 객체 생성과 사용
beginTransaction()으로 트랜잭션의 시작 지점 지정
commit()과 rollback()으로 트랜잭션을 커밋하거나 롤백한다.
Session.flush()를 임의로 호출하지 말아야 한다. (commit()이 호출될 때 Hibernate가 알아서 수행)
3. Hibernate 설치
http://www.hibernate.org에서 다운로드
웹 애플리케이션의 WEB-INF/classes 에 설정파일인 hibernate.cfg.xml 파일을 작성
JTA/JTS 뿐 아니라 DataSource도 이용할 수 없는 환경이라면 Hibernate가 직접 커넥션 풀을 관리하도록 설정 가능
mapping 요소를 통해 자바 객체와 DB 테이블의 매핑을 정의하는 파일의 위치 지정(hbm.xml파일)
20-4. Hibernate 예제
4-1. 영속 객체 작성 : DB 테이블과 매핑할 자바 클래스를 선언
4-2. 매핑 파일 정의 : 앞서 선언한 영속 객체와 DB 테이블 간의 매핑 정의
4-3. HibernateBase 생성 :
영속 객체를 이용하기 위해 Session 생성
HibernateBase : SessionFactory 객체를 통해 Session 객체를 생성, 멀티 쓰레드 환경에서 하나의 쓰레드당 하나의 Session 객체가 생성되도록 관리
DAO에서는 이 클래스를 상속받아 쉽게 Session 객체를 생성
4-4. PersonDAO 작성 : 만들어진 객체를 통해 데이터를 조회하거나 저장 |