[파워유저가 알려주는 스트럿츠 프로그래밍] Chapter 20. Hibernate :: struts1버젼[SSISO Community]
 
SSISO 카페 SSISO Source SSISO 구직 SSISO 쇼핑몰 SSISO 맛집
추천검색어 : JUnit   Log4j   ajax   spring   struts   struts-config.xml   Synchronized   책정보   Ajax 마스터하기   우측부분

struts1버젼
[1]
등록일:2008-03-21 09:47:20 (0%)
작성자:
제목:[파워유저가 알려주는 스트럿츠 프로그래밍] Chapter 20. Hibernate

자바 개발자들이 가장 많이 사용하는 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 작성 : 만들어진 객체를 통해 데이터를 조회하거나 저장

[본문링크] [파워유저가 알려주는 스트럿츠 프로그래밍] Chapter 20. Hibernate
[1]
코멘트(이글의 트랙백 주소:/cafe/tb_receive.php?no=2942
작성자
비밀번호

 

SSISOCommunity

[이전]

Copyright byCopyright ⓒ2005, SSISO Community All Rights Reserved.