JPA

Jeong Gyejin·2023년 3월 27일
0

스프링 프레임워크

목록 보기
10/17

JPA

JPA란 자바 ORM(Object Relational Mapping) 기술에 대한 API 표준 명세를 의미합니다. 즉, JPA는 특정 기능을 하는 라이브러리가 아니라, ORM을 사용하기 위한 인터페이스를 모아둔 것으로 자바 어플리케이션에서 관계형 데이터베이스를 어떻게 사용해야 하는지를 정의하는 방법 중 한가지 입니다.
또한, JPA는 단순히 명세이기 때문에 구현이 없습니다. JPA를 정의한 javax.persistence 패키지의 대부분은 interface, enum, Exception, 그리고 Annotation들로 이루어져 있습니다.

JPA의 핵심이 되는 EntityManager는 아래와 같이 javax.persistence 패키지 안에 interface 로 정의되어 있습니다.

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...
}

JPA를 사용하기 위해서는 JPA를 구현한 Hibernate, EclipseLink, DataNucleus 같은 ORM 프레임워크를 사용해야 합니다.
그 중 우리가 Hibernate를 많이 사용하는 이유는 가장 범용적으로 다양한 기능을 제공하기 때문입니다.

Hibernate

JPA의 구현체 중 하나를 의미하며, Hibernate는 SQL을 사용하지 않고 직관적인 코드를 이용해 데이터를 조작할 수 있습니다. 다만 SQL을 직접 사용하지 않는다고 해서 JDBC API를 이용하지 않는 것은 아닙니다. Hibernate가 지원하는 메소드 내부에서는 JDBC API가 동작하고 있으며, 단지 개발자가 직접 SQL을 작성하지 않을 뿐 입니다.

JPA와 Hibernate는 마치 자바의 interface와 해당 interface를 구현한 class와 같은 관계입니다.

JPA의 핵심인 EntityManagerFactory, EntityManager, EntityTransaction을 Hibernate에서는 각각 SessionFactory, Session, Transaction으로 상속받고 각각 Impl로 구현하고 있음을 확인할 수 있습니다.

Hibernate의 장점

  • 생산성: SQL을 직접 사용하지 않고 메소드 호출만으로 query가 수행되므로 반복적인 SQL작업과 CRUD 작업을 직접 하지앟으므로 생산성이 매우 높아집니다.
  • 유지보수: 테이블 컬럼이 변경되었을 경우, Mybatis에서는 관련 DAO의 파라미터, 결과, SQL등을 모두 확인하여 수정해야 하지만 JPA에서는 JPA가 이런 일들을 대신해주어 유지보수가 쉽습니다.
  • 객체지향적 개발: 객체지향적으로 데이터를 관리할 수 있기 때문에 비즈니스 로직에 집중할 수 있으며, 로직을 쿼리에 집중하기보다 객체 자체에 집중할 수 있습니다.
  • 특정 벤더에 종속적이지 않음: 여러 DB마다 SQL사용이 조금씩 다르기 때문에 애플리케이션 개발 시 처음 선택한 DB를 바꾸는 것은 매우 어려우나, JPA는 추상화된 데이터 접근 계층을 제공하기 때문에 특정벤더에 종속적이지 않고 변경할 수 있습니다.

Hibernate의 단점

  • 사용하기 어렵다: 많은 내용이 감싸져 있기 때문에 JPA를 잘 사용하기 위해서는 알아야할 것들이 많고 잘 이해하지 않으면 데이터의 손실이 발생할 수 있습니다.
  • 성능: 메소드 호출로 쿼리를 실행하는 것은 내부적으로는 많은 동작이 있다는 것을 의미하므로, 직접 SQL을 호출하는 것보다 성능이 떨어질 수 있습니다.
  • 세밀함이 떨어짐: 메소드 호출로 SQL을 실행하기 때문에 세밀함이 떨어지고, 객체간의 매핑이 잘못되거나 JPA를 잘못 사용하여 의도하지 않은 동작을 할 수도 있습니다.

Spring Data JPA

Spring Data JPA는 Spring에서 제공하는 모듈 중 하나로 JPA를 쉽고 편하게 사용할 수 있도록 도와줍니다. 기존에 JPA를 사용하기 위해서는 EntityManager를 주입받아 사용해야 하지만 Spring Data JPA는 JPA를 한단계 더 추상화 시킨 Repository 인터페이스를 제공합니다.
Spring Data JPA가 JPA를 추상화 했다는 말은, Spring Data JPA의 Repository의 구현에서 JPA를 사용하고 있다는 것입니다.

즉, 사용자가 Repository 인터페이스에 정해진 규칙대로 메소드를 입력하면, Spring이 알아서 해당 메소드 이름에 적합한 쿼리를 날리는 구현체를 만들어서 Bean으로 등록해줍니다.

Hibernate와 Spring Data JPA의 차이점

  • Hibernate는 JPA의 구현체이고, Spring Data JPA는 JPA에 대한 데이터 접근의 추상화라고 말할 수 있습니다. Spring Data JPA는 GenericDAO라는 커스텀 구현체를 제공하는데, 이것이 메소드의 명칭으로 JPA쿼리들을 생성할 수 있습니다.

  • Spring Data를 사용하면 Hibernate, Eclipse Link 등의 JPA 구현체를 사용할 수 있으며, @Transaction 어노테이션을 통해 트랜잭션 영역을 선언하여 관리할 수 있습니다.

  • Hibernate는 낮은 결합도의 이점을 살린 ORM 프레임워크로써 API 레퍼런스를 제공합니다.여기서 반드시 기억해야할 점은 Spring Data JPA는 항상 Hibernate와 같은 JPA 구현체가 필요합니다.

profile
항상 더 나은 개발자가 되기 위해서 끊임없이 공부하고 학습하면서 성장하는 사람이 되겠습니다.

0개의 댓글