Home > Spring > πŸƒ[Spring] JPA와 HibernateλŠ” μ–΄λ–€ κ΄€κ³„μΈκ°€μš”?

πŸƒ[Spring] JPA와 HibernateλŠ” μ–΄λ–€ κ΄€κ³„μΈκ°€μš”?
Spring Framework

πŸƒ[Spring] JPA와 HibernateλŠ” μ–΄λ–€ κ΄€κ³„μΈκ°€μš”?

  • JPA(Java Persistence API)와 HibernateλŠ” λ°€μ ‘ν•œ 관계가 μžˆμ§€λ§Œ μ„œλ‘œ λ‹€λ₯Έ κ°œλ…μž…λ‹ˆλ‹€.
    • κ·Έλ“€μ˜ 관계λ₯Ό μ΄ν•΄ν•˜κΈ° μœ„ν•΄μ„œλŠ” 각각의 μ •μ˜μ™€ 역할을 μ‚΄νŽ΄λ³Ό ν•„μš”κ°€ μžˆμŠ΅λ‹ˆλ‹€.

1️⃣ JPA(Java Persistence API).

  • JPA(Java Persistence API)λŠ” μžλ°” ν‘œμ€€ λͺ…μ„Έ(Java Specification)둜, μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€(Relational Database, RDB)λ₯Ό μ‰½κ²Œ μ‚¬μš©ν•  수 μžˆλ„λ‘ ORM(Obeject-Relational Mapping)을 μ œκ³΅ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€(Interface) λͺ¨μŒμž…λ‹ˆλ‹€.
  • JPA(Java Persistence API)λŠ” μžλ°” κ°œλ°œμžμ—κ²Œ ORM(Object-Relational Mapping) κΈ°λŠ₯을 μ œκ³΅ν•˜κΈ° μœ„ν•΄ λ„μž…λœ ν‘œμ€€ API둜, νŠΉμ • κ΅¬ν˜„μ²΄κ°€ μ•„λ‹™λ‹ˆλ‹€.
    • 즉, JPA(Java Persistence API) μžμ²΄λŠ” κΈ°λŠ₯을 μ œκ³΅ν•˜μ§€ μ•Šκ³ , ORM(Object-Relational Mapping)의 ν‘œμ€€ 규격만 μ •μ˜ν•©λ‹ˆλ‹€.
  • JPA(Java Persistence API)λ₯Ό μ‚¬μš©ν•˜λ©΄ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œκ°€ νŠΉμ • κ΅¬ν˜„μ²΄μ— μ’…μ†λ˜μ§€ μ•Šλ„λ‘ 좔상화(Abstraction)된 μΈν„°νŽ˜μ΄μŠ€(Interface)λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

2️⃣ Hibernate

  • HibernateλŠ” JPA(Java Persistence API) ν‘œμ€€μ„ κ΅¬ν˜„ν•œ ORM(Object-Relational Mapping) ν”„λ ˆμž„μ›Œν¬ 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€.
    • 즉, JPA(Java Persistence API)κ°€ μ •μ˜ν•œ κ·œκ²©μ„ μ—¬λŸ¬ κ΅¬ν˜„μ²΄ 쀑 ν•˜λ‚˜λ‘œ, κ°€μž₯ 널리 μ‚¬μš©λ˜λŠ” κ΅¬ν˜„μ²΄μž…λ‹ˆλ‹€.
  • HibernateλŠ” JPA(Java Persistence API)λ₯Ό κ΅¬ν˜„ν•˜λ©΄μ„œ, 좔가적인 κΈ°λŠ₯도 μ œκ³΅ν•˜λŠ” κ°•λ ₯ν•œ ORM(Object-Relational Mapping) ν”„λ ˆμž„μ›Œν¬μž…λ‹ˆλ‹€.
    • 예λ₯Ό λ“€μ–΄, 캐싱, μŠ€ν‚€λ§ˆ μžλ™ 생성, HQL(Hibernate Query Language) λ“±μ˜ κ³ μœ ν•œ κΈ°λŠ₯을 ν¬ν•¨ν•©λ‹ˆλ‹€.
  • HibernateλŠ” JPA(Java Persistence API)의 ν‘œμ€€ μΈν„°νŽ˜μ΄μŠ€(Interface)λ₯Ό μ§€μ›ν•˜λ©΄μ„œλ„, 자체적인 API(Application Programming Interface)도 ν•¨κ»˜ μ œκ³΅ν•˜μ—¬ 더 λ§Žμ€ κΈ°λŠ₯을 μ‚¬μš©ν•  수 있게 ν•©λ‹ˆλ‹€.

3️⃣ 관계 μš”μ•½.

  • JPA(Java Persistence API)λŠ” ORM(Object-Relational Mapping)의 ν‘œμ€€ μΈν„°νŽ˜μ΄μŠ€(Interface)λ‘œμ„œ, κ΅¬ν˜„μ²΄κ°€ ν•„μš”ν•©λ‹ˆλ‹€.
  • HibernateλŠ” JPA(Java Persistence API) ν‘œμ€€μ„ κ΅¬ν˜„ν•œ κ΅¬ν˜„μ²΄ 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€.
    • 즉, HibernateλŠ” JPA(Java Persistence API)의 κ·œκ²©μ„ λ”°λ₯΄λ©΄μ„œλ„ 자체적인 ν™•μž₯ κΈ°λŠ₯을 μ œκ³΅ν•˜λŠ” ORM(Object-Relational Mapping) ν”„λ ˆμž„μ›Œν¬(Framework)μž…λ‹ˆλ‹€.

4️⃣ JPA와 Hibernate의 μ‚¬μš© 방식.

1️⃣ JPA(Java Persistence API) μ‚¬μš©.

  • JPA(Java Persistence API)λŠ” μΈν„°νŽ˜μ΄μŠ€(Interface)이기 λ•Œλ¬Έμ— μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μ½”λ“œκ°€ νŠΉμ • ORM(Object-Relational Mapping) κ΅¬ν˜„μ²΄μ— μ˜μ‘΄ν•˜μ§€ μ•Šλ„λ‘ ν•©λ‹ˆλ‹€.
    • κ°œλ°œμžλŠ” JPA(Java Persistence API) ν‘œμ€€μ„ λ”°λ₯΄λ©΄μ„œ, Hibernate 같은 κ΅¬ν˜„μ²΄λ₯Ό 선택해 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ‘‰ μ˜ˆμ‹œ

@PersistenceContext
private EntityManager entityManager;

public void saveUser(User user) {
    entityManager.persist(user); // JPA ν‘œμ€€ API μ‚¬μš©
}

2️⃣ Hibernate μ‚¬μš©

  • HibernateλŠ” JPAλ₯Ό κ΅¬ν˜„ν•˜λ©΄μ„œ 자체적인 API(Application Programming Interface)도 μ œκ³΅ν•©λ‹ˆλ‹€.
    • κ°œλ°œμžλŠ” JPA(Java Persistence API) ν‘œμ€€ API(Application Programming Interface)λ₯Ό μ‚¬μš©ν•˜κ±°λ‚˜, Hibernate의 κ³ μœ ν•œ κΈ°λŠ₯을 μ‚¬μš©ν•˜κΈ° μœ„ν•΄ Hibernate의 API(Application Programming Interface)λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

πŸ‘‰ μ˜ˆμ‹œ

Session session = sessionFactory.openSession();
session.save(user); // Hibernate 고유 API μ‚¬μš©

5️⃣ κ²°λ‘ .

  • JPA(Java Persistence API)λŠ” ORM(Object-Relational Mapping)을 μœ„ν•œ ν‘œμ€€ API이고, HibernateλŠ” κ·Έ ν‘œμ€€μ„ κ΅¬ν˜„ν•œ ꡬ체적인 κ΅¬ν˜„μ²΄μž…λ‹ˆλ‹€.
  • JPA(Java Persistence API)λŠ” λ…λ¦½μ μ΄μ§€λ§Œ, HibernateλŠ” JPAλ₯Ό λ”°λ₯΄λ©° 좔가적인 κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€.
    • Hibernateλ₯Ό μ‚¬μš©ν•˜λ©΄ JPA(Java Persistence API) ν‘œμ€€ μΈν„°νŽ˜μ΄μŠ€λ‘œ κ°œλ°œν•˜λ©΄μ„œλ„ ν•„μš”ν•œ 경우 Hibernate의 고유 κΈ°λŠ₯을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.