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 λ₯Ό μ‚¬μš©ν•˜μ—¬ ν•΄λ‹Ή μž‘μ—…λ“€μ„ μˆ˜ν–‰ν•œλ‹€.