☘️ λ°±μ—”λ“œ: Backend

[Spring] ν˜Όλ™λ˜λŠ” JPA κ°œλ… 정리 (Hibernate, Spring Data JPA)

🐀 쀀콩이 2023. 6. 27. 17:44

😱 μ΄ 글을 μ“°λŠ” 이유

 

μ·¨μ—… μ€€λΉ„λ₯Ό ν•˜λ©° 면접을 보닀보면 JPA 의 κ°œλ…μ€ 맀번 λ‚˜μ˜¬λ§ŒνΌ 단골 질문이라고 λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ, 맀번 Hibernate λŠ” JPA 의 κ΅¬ν˜„μ²΄μž…λ‹ˆλ‹€! λΌλŠ” λŒ€λ‹΅λ§Œ ν•΄μ™”κ³ , μ†”μ§νžˆ 차이λ₯Ό μ œλŒ€λ‘œ μ΄ν•΄ν•˜κ³  μžˆμ§€ μ•Šλ‹€κ³  λŠκΌˆμŠ΅λ‹ˆλ‹€. κ·Έλž˜μ„œ 이번 κΈ°νšŒμ— JPA, Hibernate, Spring Data JPA 의 차이에 λŒ€ν•΄ κ³΅λΆ€ν•˜κ³  μ •λ¦¬ν•΄λ³΄λŠ” μ‹œκ°„μ„ 가져보렀 ν•©λ‹ˆλ‹€. 😎

 

 

πŸ€” JPA λž€?

 

JPA λŠ” Java Persistence API 의 μ•½μžλ‘œ, μžλ°” μ• ν”Œλ¦¬μΌ€μ΄μ…˜κ³Ό κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€ μ‚¬μ΄μ˜ 데이터 μ˜μ†μ„±μ„ κ΄€λ¦¬ν•˜κΈ° μœ„ν•œ ν‘œμ€€ν™”λœ μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•˜λŠ” κΈ°μˆ μž…λ‹ˆλ‹€. JPA λŠ” 객체 μ§€ν–₯ ν”„λ‘œκ·Έλž˜λ°κ³Ό κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€ κ°„μ˜ 뢈일치λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 객체와 λ°μ΄ν„°λ² μ΄μŠ€λ₯Ό λ§€ν•‘ν•˜λŠ” κΈ°λŠ₯을 μ œκ³΅ν•©λ‹ˆλ‹€. μ΄λŸ¬ν•œ κΈ°μˆ μ„ ORM 이라고 ν•©λ‹ˆλ‹€.

 

μ—¬κΈ°μ„œ JPA λŠ” μΈν„°νŽ˜μ΄μŠ€λΌλŠ” 점을 μ£Όμ˜ν•΄μ•Ό ν•©λ‹ˆλ‹€. 이 μΈν„°νŽ˜μ΄μŠ€λŠ” javax.persistence νŒ¨ν‚€μ§€μ— μ •μ˜λ˜μ–΄ 있으며, λ°μ΄ν„°λ² μ΄μŠ€μ™€μ˜ μƒν˜Έμž‘μš©μ„ μœ„ν•œ λ©”μ„œλ“œλ“€μ„ ν¬ν•¨ν•˜κ³  μžˆμŠ΅λ‹ˆλ‹€. κ·Έλ ‡κΈ° λ•Œλ¬Έμ— JPA 에 λͺ…μ„Έλœ κΈ°λŠ₯듀을 μ‹€μ œλ‘œ λ™μž‘ν•˜κ²Œ ν•˜κΈ° μœ„ν•΄μ„œλŠ” 이λ₯Ό κ΅¬ν˜„ν•œ ORM ν”„λ ˆμž„μ›Œν¬λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€. λŒ€ν‘œμ μΈ JPA κ΅¬ν˜„μ²΄λ‘œ Hibernate, EclipseLink, OpenJPA 등이 μ‘΄μž¬ν•©λ‹ˆλ‹€.

 

 

πŸ€” ORM μ΄λž€?

 

ORM 은 Object-Relational Mapping 의 μ•½μžλ‘œ, 객체와 κ΄€κ³„ν˜• λ°μ΄ν„°λ² μ΄μŠ€ κ°„μ˜ 맀핑을 μžλ™ν™”ν•˜λŠ” κΈ°μˆ μž…λ‹ˆλ‹€. ORM 은 κ°œλ°œμžκ°€ 직접 SQL 쿼리λ₯Ό μž‘μ„±ν•˜μ§€ μ•Šκ³ λ„ 객체λ₯Ό λ°μ΄ν„°λ² μ΄μŠ€μ— μ €μž₯ν•˜κ³  μ‘°νšŒν•  수 있게 ν•΄μ€λ‹ˆλ‹€. JPA λŠ” μ΄λŸ¬ν•œ ORM 기술의 ν•œ μ’…λ₯˜λ‘œ, 객체와 λ°μ΄ν„°λ² μ΄μŠ€ κ°„μ˜ 맀핑을 μœ„ν•œ κΈ°λŠ₯을 μ œκ³΅ν•˜λŠ” μΈν„°νŽ˜μ΄μŠ€μž…λ‹ˆλ‹€.

 

 

πŸ€” Hibernate λž€?

 

Hibernate λŠ” μœ„μ—μ„œ μ–ΈκΈ‰ν–ˆλ˜ κ²ƒμ²˜λŸΌ JPA 의 κ΅¬ν˜„μ²΄ 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€.

 

JPA μΈν„°νŽ˜μ΄μŠ€μ™€ Hibernate κ΅¬ν˜„μ²΄ κ°„μ˜ μ—°κ΄€ 관계

 

μœ„ 사진은 Hibernate κ³΅μ‹λ¬Έμ„œμ—μ„œ μ œκ³΅ν•˜λŠ” JPA μΈν„°νŽ˜μ΄μŠ€μ™€ Hibernate κ΅¬ν˜„μ²΄ κ°„μ˜ 상속 및 κ΅¬ν˜„ 관계λ₯Ό λ‹€μ΄μ–΄κ·Έλž¨μœΌλ‘œ λ‚˜νƒ€λ‚Έ λͺ¨μŠ΅μž…λ‹ˆλ‹€. λ‹€μ΄μ–΄κ·Έλž¨μ„ μ‚΄νŽ΄λ³΄λ©΄ JPA 의 μΈν„°νŽ˜μ΄μŠ€μΈ EntityManagerFactory, EntityManager, EntityTransaction 을 Hibernate κ΅¬ν˜„μ²΄μ—μ„œ 상속받아 κ΅¬ν˜„ν•˜κ³  μžˆλŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

Hibernate λŠ” JPA 의 κ΅¬ν˜„μ²΄ 쀑 ν•˜λ‚˜μ΄κΈ° λ•Œλ¬Έμ—, JPA λ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄μ„œ λ°˜λ“œμ‹œ Hibernate λ₯Ό μ‚¬μš©ν•  ν•„μš”λŠ” μ—†μŠ΅λ‹ˆλ‹€. ν”„λ‘œμ νŠΈμ˜ μš”κ΅¬μ‚¬ν•­κ³Ό 상황에 따라 EclipseLink, OpenJPA 와 같은 λ‹€λ₯Έ κ΅¬ν˜„μ²΄λ₯Ό μ‚¬μš©ν•  μˆ˜λ„ 있고, μ‹¬μ§€μ–΄λŠ” 직접 JPA 의 κ΅¬ν˜„μ²΄λ₯Ό κ΅¬ν˜„ν•΄μ„œ μ‚¬μš©ν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€. ν•˜μ§€λ§Œ, Hibernate κ°€ κ°€μž₯ 많이 μ‚¬μš©λ˜λŠ” μ΄μœ λŠ” 였랜 κΈ°κ°„ λ™μ•ˆ λ§Žμ€ κ°œλ°œμžλ“€μ—κ²Œ μ‚¬μš©λ˜λ©° μ„±μˆ™ν•΄μ§„ 라이브러리이기 λ•Œλ¬Έμ΄λΌλŠ” 것을 μ΄ν•΄ν•˜λ©΄ 쒋을 것 κ°™μŠ΅λ‹ˆλ‹€.

 

 

πŸ€” Spring Data JPA λž€?

 

Spring Data JPA λŠ” Hibernate 와 JPA λ₯Ό κΈ°λ°˜μœΌλ‘œν•œ 데이터 μ—‘μ„ΈμŠ€ κΈ°μˆ μ„ 보닀 κ°„νŽΈν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ„λ‘ μ§€μ›ν•˜λŠ” Spring Framework 의 ν”„λ‘œμ νŠΈ 쀑 ν•˜λ‚˜μž…λ‹ˆλ‹€.

 

SimpleJpaRepository 의 클래슀 λ‹€μ΄μ–΄κ·Έλž¨

 

Spring Data JPA μ—μ„œλŠ” JPA λ₯Ό ν•œλ‹¨κ³„ 더 μΆ”μƒν™”μ‹œν‚¨ Repository λΌλŠ” μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ œκ³΅ν•΄μ„œ κ°œλ°œμžκ°€ JPA λ₯Ό 더 쉽고 κ°„νŽΈν•˜κ²Œ μ‚¬μš©ν•  수 μžˆλ„λ‘ 도와주고 μžˆμŠ΅λ‹ˆλ‹€. Repository μΈν„°νŽ˜μ΄μŠ€μ˜ κΈ°λ³Έ κ΅¬ν˜„μ²΄μΈ SimpleJpaRepository 의 μ½”λ“œλ₯Ό 보면 λ‚΄λΆ€μ μœΌλ‘œ JPA 의 μΈν„°νŽ˜μ΄μŠ€ 쀑 ν•˜λ‚˜μΈ EntityManager λ₯Ό μ‚¬μš©ν•˜κ³  μžˆλŠ” 것을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€.

 

package org.springframework.data.jpa.repository.support;

import ...

@Repository
@Transactional(readOnly = true)
public class SimpleJpaRepository<T, ID> implements JpaRepositoryImplementation<T, ID> {

	...

	private final EntityManager em;

	...

	@Override
	public Optional<T> findById(ID id) {

		...

	}
	
	// Other methods
}