어 나 갱수.

[JPA] JPA와 Hibernate에 대해 알아보자 😏 본문

JPA

[JPA] JPA와 Hibernate에 대해 알아보자 😏

김경수 2024. 3. 17. 00:47
728x90

ORM이란

JPA와 Hibernate에 대해 알아보기 전에 먼저 ORM이라는 개념을 알아보겠습니다.

ORM이란 Object Reational Mapping의 약자로, 객체와 관계형 데이터베이스를 매핑해 주는 기술입니다.

ORM은 개발자가 직접 sql 쿼리문을 작성하지 않아도 알아서 데이터베이스에 값을 저장해 주고 삭제해 주는 sql 쿼리문을 작성해 줍니다.

 

예를 들어, Member 테이블의 데이터를 출력하기 위해서 MySQL에서는 SELECT * FROM Member;라는 쿼리를 실행해야 하지만, 

ORM을 사용하면 Member 테이블과 매핑된 객체를 member라 할때, member.findAll();이라는 메서드로 데이터 조회가 가능합니다.

JPA는 이러한 ORM 종류 중 하나입니다.

JPA는 기술 명세이다.

JPA는 Java Persistence API의 약자로 Java ORM 기술에 대한 명세를 해놓을 때 사용되는 인터페이스이다.

간단하게 말하면 ORM기술을 명시해 놓은 인터페이스입니다. 특정 기능을 하는 라이브러리가 아닙니다. JPA는 자바 애플리케이션이 관계형 데이터베이스를 어떻게 사용해야 하는지 정의해 놓은 방법입니다. 

JPA는 명세이기 때문에 구현이 없습니다. JPA르르 정의한 javax.persistence 패키지는 대부분 interface, enum 등으로 이루어져 있습니다. JPA의 핵심인 EntityManager는 인터페이스로 구성돼 있습니다.

package javax.persistence;

import ...

public interface EntityManager {

    public void persist(Object entity);

    public <T> T merge(T entity);

    public void remove(Object entity);

    public <T> T find(Class<T> entityClass, Object primaryKey);

    // More interface methods...
}

 

Hibernate는 JPA의 구현체이다.

Hibernate는 JPA라는 명세의 구현체입니다. javax.persistence.EntityManager와 같은 인터페이스의 직접 구현한 라이브러리입니다. JPA와 Hibernate의 관계는 인터페이스와 인터페이스를 구현한 클래스와 같습니다.

 

JPA를 사용하기 위해서는 JPA를 구현한 Hibernate, EclipseLink, DataNucleus와 같은 ORM 프레임워크를 사용해야 합니다.

Hibernate는 개발자가 sql를 직접 짜지 않고 코드로 sql를 구현합니다. sql를 짜지 않는다고 해서 JDBC API를 작동하지 않는 것이 아닙니다. Hibernate 메서드 내부에서 직접 JDBC API가 동작하고 있습니다. 

 

 

JPA에서 중요한 EntityManagerFactory, EntityManager, EntityTransaction을 Hibernate에서 상속받고 각각 Impl클래스로 구현하고 있음을 확인할 수 있습니다.

 

 

 

차이점

JPA와 Hibernate의 차이점을 생각해 보면 생각보다 간단하다 JPA는 인터페이스라고 생각하면 쉽고, Hibernate는 JPA라는 인터페이스의 구현체라고 생각하면 된다. 

 

Spring Data JPA

저는 Spring으로 개발을 해보면서 EntityManager로 CRUD작업을 해본 적이 없습니다. DB에 접근해야 하는 상황이 온다면 Repository인터페이스를 상속받아서 메서드를 만들어서 사용하였습니다. 여기서 나온 Repository도 Hibernate와 같은 구현체가 아니라 인터페이스입니다.

 

Spring Data JPA는 spring에서 제공하는 모듈입니다. JPA를 간편하게 사용하기 위해 JPA를 한 번 더 추상화한 인터페이스입니다.

Repository에서 메서드를 작성하면 메서드에 맞는 sql query문을 발생시키는 메서드를 만들어줍니다.

 

Repository 인터페이스의 기본 구현체인 SimpleJpaRepository의 코드를 보면 내부적으로 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
}

 

정리

JPA는 ORM이라는 객체와 관계형 데이터베이스를 자동으로 매핑해 주는 기술 중 하나입니다. JPA는 인터페이스로 구성되었으며, JPA라는 인터페이스의 구현체가 바로 Hibernate입니다. Spring Data JPA는 Spring에서 제공하는 모듈로 JPA를 한 번 더 추상화해서 명시해 놓은 인터페이스입니다. Spring Data JPA에서 제공하는 방식으로 메서드를 작성하면 구현체인 Hibernate에서 sql문을 발생시켜 주는 메서드를 만들어줍니다.

가장 중요한 점은 Spring Data JPA도 결국 인터페이스이기 때문에 Hibernate와 같은 구현체 클래스가 필요합니다.

728x90

'JPA' 카테고리의 다른 글

[JPA] 더티 체킹 (Dirty Checking)  (0) 2024.08.09
[JPA] 페이징 처리, JPA Pagination 이란 🦫  (1) 2024.02.25
[JPA] 즉시로딩과 지연로딩 🐥  (0) 2024.02.01