What is Hibernate?

Hibernate 는 Java 의 objects 를 Database 에 저장 및 보존하도록 하는 framework 이다. Hibernate 를 사용하는 이유 및 장점에는 다음 세 가지 정도를 들 수 있다.
- Hibernate 는 모든 low-level 의 SQL 에 대하여 다룬다.
- 개발자가 작성해야 하는 JDBC 의 코드량을 최소화한다.
- ORM(Object-to-Relational Mapping) 을 제공한다.
ORM(Object-to-Relational Mapping)

ORM 은 OOP(Object-Orientied Programming) 언어의 object 와 Relational Database 의 데이터를 mapping 하여 RDB table 을 객체 지향적으로 사용하게 해주는 기술이다. 개발자가 직접 SQL query 등을 작성하지 않더라도 Database 를 조작할 수 있도록 돕는 기술인 것이다.
What is JPA?
JPA 는 Jarkarta Persistence API, 이전에는 Java Persistence API 라고 불리던 것으로, ORM 의 표준 API 이다.
JPA 는 specification, 즉 interface 들만을 제공하기 때문에, 반드시 사용을 위하여는 implementation 을 필요로 한다. JPA 는 단지 표준화된 specification 을 제공하는 것뿐이다.

이에 여러 vendor 들이 JPA 에 대한 implementation 을 하였는데, 대표적으로 위와 같이 Hibernate 와 EclipseLink 가 있다. Spring Boot 에서는 Hibernate 를 default 로 사용하고 있으며, 설정에 따라 다른 vendor 의 JPA implementation 을 사용할 수 있다.
Benefits of JPA
JPA 는 standard API 를 제공하기 때문에 특정 vendor 에 묶여있을 필요가 없다. JPA Spec 에 따라서 flexible 하게 code 를 유지보수하면 되기 때문에, 사용하고 있는 vendor 가 서비스 제공을 중단하더라도 vendor 만 단순하게 바꾸면 된다.
Saving a Java Object with JPA
// create Java object
Student theStudent = new Student("James", "Doe", "lucvs.pages.dev");
// save it to database
entityManager.persist(theStudent);Java object 를 하나 생성하고, JPA Helper Object 인 entityManager 를 통하여 자동으로 database 에 data 를 등록한다.
Entity Manger 에 대한 자세한 내용은 이 부분을 참고하자.
JDBC(Java Database Connectivity) 를 주로 사용하던 예전에는 개발자가 직접 SQL query 를 작성하여 수동으로 database 를 관리해야 했다. 하지만 JPA 는 이를 대신해주고, 내부적으로는 insert query 가 실행되는 것이다.
Retrieving a Java Object with JPA
// retrieve from database using the primary key
int theId = 1;
Student myStudent = entityManager.find(Student.class, theId);JPA 를 통하여 Java object 를 database 로부터 가져올 때는 위와 같이 작성하면 된다. 물론 여러가지 방법이 존재하겠지만 간단하게만 먼저 살펴보자.
entityManager.find() 를 통해, 내부적으로는 Student 라는 table 에서, 주어진 theId 를 갖고 있는 object 를 찾는다.
Querying for Java Objects
TypedQuery<Student> theQuery = entityManager.createQuery("from Student", Student.class);
List<Student> students = theQuery.getResultList();만약 database 에서 모든 Student object 를 가져오고 싶다면 위와 같이 JPQL(Jakarta Persistence Query Language) query object 를 생성하고, 이를 통하여 해당 query 를 실행해 결과를 List type 반환하게 만들면 된다.
JPQL 및 자세한 작동 원리는 추후에 다시 살펴보자.
Hibernate / JPA and JDBC

위의 그림을 살펴보자. 실제로 JPA Hibernate 는 JDBC 를 사용하는 하나의 Abstraction 이다. 따라서 Hibernate 의 모든 database 접근은 JDBC 를 내부적으로 사용한다.
JPA Hibernate 의 API 들은 data 를 save 하거나 retrieve 하는 등에 있어서 모든 low level code 를 담당하는 것처럼 보이지만, 실제 내부에서는 JDBC 를 사용하여 해당 작업들을 수행한다.