Spring, Hibernate(영속 객체 관리)
Hibernate에서의 영속 객체 관리
Hibernate는 Java 기반의 ORM(Object-Relational Mapping) 프레임워크로, 객체와 관계형 데이터베이스 간의 매핑을 편리하게 처리해줍니다. 이를 통해 개발자는 객체 지향적인 코드로 데이터베이스를 다룰 수 있습니다. Hibernate에서는 객체의 상태를 세 가지로 구분하며, 이 글에서는 영속 객체 관리에 대해 다루겠습니다. 영속 객체는 비영속, 영속, 준영속 세 가지 상태를 가지며, 각각의 특징과 상태 이전에 대해 알아보겠습니다.
비영속(Transient) 상태
비영속 상태는 new 연산자로 객체를 생성한 후, 단순한 자바 객체입니다. 이 객체는 데이터베이스와 매핑되지 않은 상태이며, 영속 객체로 전환되어야 합니다. 비영속 객체는 Session의 save() 메서드를 통해 영속화하거나, 다른 영속 객체로부터 참조되는 경우에도 영속 상태로 전이됩니다.
ex)
Person person = new Person();
person.setName(“”);
person.setAddress(“서울시 강남구 역삼동”);
person.setEmail(“gurum@yahoo.com”);
person.setAge(20);
영속(Persistent) 상태
영속 상태는 데이터베이스와 매핑되는 객체로, 식별자를 가지고 테이블의 행과 연결되어 있습니다. 영속 상태는 Session의 save(), saveOrUpdate(), persist() 메서드를 사용하여 저장되거나, 이미 영속 상태에 있는 객체에 의해 참조될 때 생성됩니다. 또한, Hibernate의 조회 기능인 get()이나 load() 메서드를 사용하여 객체를 생성하면 영속 상태가 됩니다.
ex)
Person person = new Person();
person.setName(“”);
person.setAddress(“서울시 강남구 역삼동”);
person.setEmail(“gurum@yahoo.com”);
person.setAge(20);
Session session = sessionFactory.getCurrentSession();
session.save(person);
영속 객체는 트랜잭션이 종료될 때까지 데이터베이스와 동기화됩니다. 따라서 트랜잭션이 커밋될 때 객체의 상태 정보가 SQL 쿼리를 통해 데이터베이스와 동기화되는 것을 의미합니다.
준영속(Detached) 상태
준영속 상태는 Session의 close() 메서드가 호출되거나, 데이터베이스 연결이 끊어진 상태입니다. 또한, 객체가 직렬화되어 다른 원격 애플리케이션으로 전송된 경우에도 준영속 상태가 됩니다. 준영속 상태의 객체는 데이터베이스와의 연관이 사라지고, 현재 메모리의 객체 상태는 데이터베이스와 동기화되어 있지 않습니다. 이후에 다시 영속 상태로 전이시키기 위해서는 update() 메서드를 사용해야 합니다.
Hibernate에서는 객체의 상태를 비영속, 영속, 준영속 세 가지로 구분하여 관리합니다. 비영속 상태는 단순한 자바 객체이며, 영속화를 통해 영속 상태로 전환됩니다. 영속 상태는 데이터베이스와 매핑되는 상태로, 트랜잭션이 커밋될 때까지 동기화됩니다. 준영속 상태는 데이터베이스 연결이 끊어진 상태로, 객체가 직렬화되거나 데이터베이스와의 연관이 사라진 경우에 해당합니다.
Hibernate API
Hibernate API는 Hibernate 프레임워크에서 제공하는 클래스와 인터페이스의 집합입니다. 이 API를 사용하여 데이터베이스와 상호 작용하고 객체의 영속성을 관리할 수 있습니다.
Hibernate의 객체와 간단한 설명
SessionFactory: Session 객체를 생성하는 공장 역할을 합니다. 데이터베이스 처리와 관련된 정보를 사용하여 Session 객체를 생성합니다.
Session: 데이터베이스 Connection과 연결되며, 자바 객체의 영속성을 관리합니다. 데이터베이스에 대한 CRUD(Create, Read, Update, Delete) 작업을 수행할 수 있습니다.
TransactionFactory: Transaction 객체에 대한 공장 역할을 합니다. 기본 JDBC, JTA, 또는 CORBA 트랜잭션으로부터 어플리케이션을 추상화시킵니다.
Transaction: 트랜잭션을 추상화하여 기본 JDBC, JTA 등의 트랜잭션과 상호 작용할 수 있게 해줍니다.
ConnectionProvider: JDBC Connection에 대한 공장 역할을 수행합니다. DataSource 또는 DriverManager를 사용하여 Connection을 획득하고, 어플리케이션에 추상화된 인터페이스를 제공합니다.
Hibernate API를 사용하여 객체의 영속성을 관리하고 데이터베이스와 상호 작용할 수 있으며, 이를 통해 객체 지향적인 방식으로 데이터베이스 액세스를 수행할 수 있습니다.
Session 객체를 얻는 방법
private static final SessionFactory sessionFactory;
static {
String config = "config/hibernate/hibernate.cfg.xml";
try {
sessionFactory = new Configuration().configure(config).buildSessionFactory();
} catch (Throwable ex) {
throw new ExceptionInInitializerError(ex);
}
}
public static Session getCurrentSession() {
return sessionFactory.getCurrentSession();
}
SessionFactory를 생성합니다. 이는 Hibernate 설정 파일(hibernate.cfg.xml)을 기반으로 생성됩니다.
Configuration 클래스를 사용하여 Hibernate 설정 파일을 로드하고, buildSessionFactory() 메서드를 호출하여 SessionFactory를 생성합니다.
getCurrentSession() 메서드를 호출하여 현재의 Session을 얻습니다. 이 메서드는 트랜잭션이 종료되기 전까지 동일한 Session을 반환합니다.
Session API
메서드 | 설명 |
---|---|
getTransaction() | 현재 Session에 해당하는 Transaction 객체를 반환합니다. |
beginTransaction() | Transaction을 시작하고 Transaction 객체를 반환합니다. |
save(Object obj) | 매개변수로 전달된 객체를 영속화하고 식별자를 반환합니다. |
persist(Object obj) | 매개변수로 전달된 객체를 영속화합니다. |
get(Object obj) | 테이블로부터 데이터를 읽어옵니다. |
load(Object obj) | 테이블로부터 데이터를 읽어옵니다. |
update(Object obj) | 수정된 데이터를 테이블에 적용합니다. |
merge(Object obj) | Detached 상태의 객체를 다시 영속화합니다. |
saveOrUpdate(Object obj) | 객체를 데이터베이스에 저장하거나 업데이트합니다. |
delete(Object obj) | 테이블의 데이터를 삭제합니다. |
데이터 입력, 조회
ex)
public static void main(String[] args) throws Exception {
HibernateUtil.beginTransaction();
Session session = HibernateUtil.getCurrentSession();
// 데이터 조회 (단건)
Board board = (Board) session.get(Board.class, 1);
if (board == null) {
System.out.println(“검색 결과가 없습니다.”);
} else {
System.out.println(“검색된 글 정보: ” + board.toString());
}
// 데이터 입력
Board newBoard = new Board();
newBoard.setTitle(“가입인사”);
newBoard.setWriter(“”);
newBoard.setContent(“잘 부탁드립니다.”);
int boardNum = (Integer) session.save(newBoard);
System.out.println(boardNum + “번 게시물 저장 성공!!!”);
HibernateUtil.commitTransaction();
HibernateUtil.closeSession();
}
위 내용은 데이터베이스에서 게시글을 조회하고, 새로운 게시글을 저장하는 예시를 보여줍니다. 조회된 결과가 없을 경우 “검색 결과가 없습니다.”를 출력하고, 새로운 게시글을 저장하면 해당 게시글의 식별자를 출력합니다. 코드 실행 후 트랜잭션을 커밋하고 세션을 닫습니다.
get()
호출과 동시에 쿼리가 실행되며, 검색 결과가 없으면 null을 반환합니다.
session.get(Board.class, 1)과 같이 사용하여 Board 클래스의 식별자가 1인 객체를 조회합니다.
load()
호출 시에 쿼리가 실행되지 않고, 객체가 사용되는 시점에서 실행됩니다.
검색 결과가 없으면 예외(Exception)가 발생합니다.
session.load(Board.class, 1)과 같이 사용하여 Board 클래스의 식별자가 1인 객체를 로드합니다.
데이터 입력:
save()
데이터를 영속화(저장)하고, 식별자를 반환합니다.
session.save(board)와 같이 사용하여 board 객체를 저장합니다. 저장 후 해당 객체의 식별자를 반환합니다.
persist()
식별자를 반환하지 않고, 데이터를 영속화합니다.
session.persist(board)와 같이 사용하여 board 객체를 영속화합니다.
Spring프레임워크 와 Java
이전 글 – Spring 프레임워크(경량, IoC, AOP를 통한 애플리케이션 개발의 혁신)
이전글 – 자바(Java) 프로그램 개발 6단계에 대해서 이해하기 쉽게 알아보자
이전글 – 자바(Java)의 다양한 버전에 대해 알아보자
이전글 – 자바(Java)의 역사
이전글 – 프로그래밍 언어의 종류
1 thought on “Spring, Hibernate(영속 객체 관리, Hibernate API, Session API)”