해당 게시글은 하이버네이트 공식문서를 읽으면서 정리해 놓은 글이다.
https://docs.jboss.org/hibernate/orm/6.6/quickstart/html_single/#modules
https://www.marcobehler.com/guides/java-databases
자바 클래스와 테이블사이에 매핑을 할수 있는 방법은 3가지가 있다.
1. JDBC
2. jooQ, myBatis 같은 Spring의 JDBC 추상화
3. 하이버네이트 또는 JPA 구현과 같은 ORM
1. JDBC
low-level way to accessing databases 라고 표현한다. 그런데 왜 low-level 이라고 표현하는지 살펴보면,
1) 직접적인 SQL 쿼리 처리와 리소스 관리를 모두 개발자가 수동으로 해야 하기 때문이다.
SQL 쿼리를 직접 작성하게 되면, 유연성이 크지만, 모든 쿼리를 수동으로 처리해야하므로 오류 발생 가능성도 높다. 그리고 데이터베이스가 변경때마다 다른 SQL 문법을 사용해야한다.
JDBC를 사용할 때는 데이터베이스 연결(Connection), 명령문(Statement), 결과 집합(ResultSet) 등을 모두 수동으로 열고 닫아야한다. 제대로 닫지 않으면 리소스 누수가 발생할 수 있다. 반면에, 상위 수준의 프레임워크에서는 이러한 리소스 관리를 자동 관리된다.
2) JDBC는 SQL에서 Java 개체로 변환하는 데 전혀 도움이 되지 않는다. SQL 데이터베이스의 데이터 간의 변환을 개발자가 직접 관리해야한다.
Java 객체를 SQL코드로 변환
User user = new User("Jarvis");
String sql = "INSERT INTO users (name) VALUES ('" + user.getName() + "')";
SQL 코드 결과를 Java 객체로 변환
String sql = "SELECT * FROM users WHERE id = 1";
ResultSet resultSet = statement.executeQuery(sql);
if (resultSet.next()) {
User user = new User(resultSet.getString("name"));
}
위와 같이 자바의 객체와 SQL 데이터간의 변환을 직접 관리해야하며, 코드의 복잡성이 증가할 수 있다.
ORM (Object-Relational Mapping)
JDBC와는 달리, 자바 객체와 SQL 데이터베이스 간의 변환을 자동으로 처리해주는 도구이다. ORM을 사용하면 개발자는 데이터베이스와의 상호작용을 더 직관적으로 처리할 수 있으며, 많은 수동 변환 작업을 피할 수 있다.
대표적으로 ORM 라이브러리인 하이버네이트는 2001년 출시되었으며, 아래와 같은 기능을 사용할 수 있다.
- 자동 변환:
- ORM 프레임워크는 자바 객체와 SQL 데이터 간의 매핑을 자동으로 수행한다. 즉, 개발자가 직접 SQL 쿼리를 작성할 필요 없이 자바 객체를 생성하거나 수정하는 것만으로 데이터베이스에 데이터를 저장하거나 조회할 수 있다.
- 추상화된 데이터베이스 작업:
- ORM은 SQL 쿼리를 추상화하여 더 직관적인 객체 지향 접근 방식으로 데이터베이스 작업을 수행한다. 개발자는 객체를 조작하는 것처럼 데이터를 처리할 수 있다.
- 편리한 트랜잭션 관리:
- ORM 프레임워크는 트랜잭션 관리와 관련된 작업을 쉽게 처리할 수 있도록 지원한다. 예를 들어, 여러 객체를 한 번에 저장할 때 필요한 트랜잭션을 자동으로 관리한다.
- 데이터베이스 독립성:
- ORM을 사용하면 데이터베이스 벤더에 의존하지 않는 코드 작성을 할 수 있다. ORM 프레임워크가 지원하는 다양한 데이터베이스에 대해 동일한 코드로 접근할 수 있다.
public void saveUser(User user) {
Session session = sessionFactory.openSession();
Transaction transaction = null;
try {
transaction = session.beginTransaction();
session.save(user); // 객체를 저장하면 자동으로 SQL INSERT 쿼리가 생성됨
transaction.commit();
} catch (Exception e) {
if (transaction != null) transaction.rollback();
System.err.println("사용자 저장 중 오류 발생: " + e.getMessage());
} finally {
session.close();
}
}
public User getUser(Long id) {
Session session = sessionFactory.openSession();
User user = null;
try {
user = session.get(User.class, id); // 자동으로 SQL SELECT 쿼리가 생성됨
} finally {
session.close();
}
return user;
}
ORM 기술을 사용하면 개발자는 자바 객체와 SQL 데이터베이스 간의 변환을 자동으로 처리할 수 있어, 코드의 복잡성이 줄어들고 생산성이 향상된다. SQL 쿼리를 직접 작성할 필요가 없고, 객체 지향적으로 데이터베이스 작업을 수행할 수 있기 때문에, 유지보수성과 가독성 또한 높아진다.