지난번 SSE 를 적용하면서 다시 공부하게 된 JPA 와 지연로딩 등...
생각 이상으로 내가 잘 알지도 못한 채로 JPA 를 이제껏 사용한 듯 해서 이를 다시 공부해서 정리하고자 한다...
JPA
JPA 는 Java Persistence API 의 약자로, 자바 어플리케이션에서 관계형 DB 를 사용하는 방식을 정의한 인터페이스를 말한다. (자바 ORM - Object Relational Mapping / 기술에 대한 API 표준 명세)
즉, JPA 는 말 그대로 인터페이스 라는 점이 중요한 포인트
JPA 는 특정 기능을 하는 라이브러리가 아니다. JPA 는 자바 어플리케이션에서 관계형 DB 를 어떻게 사용해야 하는지를 정의하는 하나의 방법이다.
JPA 는 단순히 기술 명세이기 때문에 구현이 없다.
JPA 를 정의한 javax.persistence 패키지의 대부분은 interface, enum, Exception, 그리고 각종 Annotation 으로 이루어져 있다. 예를 들어, JPA 의 핵심이 되는 EntityManager 는 아래와 같이 javax.persistence.EntityManager 라는 파일에 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
Hibernate 는 JPA 라는 명세의 구현체 이다. 위에서 언급한 javax.persistence.EntityManager 와 같은 인터페이스를 직접 구현한 라이브러리이다.
JPA 와 Hibernate 는 마치 자바의 interface 와 해당 interface 를 구현한 class 와 같은 관계이다.\
Hibernate 는 SQL 을 사용하지 않고 직관적인 코드(메소드)를 사용해 데이터를 조작 가능하며, SQL 을 직접 사용하지 않는다지만 JDBC API 를 사용하지 않는 것은 아니다.
Hibernate 가 지원하는 메소드 내부에서는 JDBC API 가 동작하고 있으며, 단지 개발자가 직접 SQL 을 작성하지 않을 뿐이다.
즉, Hibernate 는 구현체일 뿐이라서 JPA 를 사용하기 위해서 반드시 Hibernate 를 사용할 필요는 없다.
다만, SLQ 을 직접 사용하지 않고도 메소드 호출만으로 query 가 수행되기 때문에 개발자가 작업하기가 매우 편하며 Hibernate 가 굉장히 성숙한 라이브러리이기 때문일 뿐이다.
Spring Data JPA
Spring 에서 제공하는 모듈 중 하나로 JPA 를 쉽고 편하게 사용할 수 있도록 도와준다.
기존에 JPA 를 사용하려면 EntityManager 를 주입받아 사용해야 하지만, Spring DataJ PA 가 JPA 를 한단계 더 추상화 시킨 Repository 인터페이스를 제공한다.
즉, Spring Data JPA 의 Repository 의 구현에서 JPA 를 사용하고 있다.
따라서 Repository 인터페이스에 정해진 규칙대로 메소드를 입력하면, Spring 이 알아서 해당 메소드 이름에 적합한 쿼리를 날리는 구현체를 만들어서 Bean 으로 등록해준다.
즉, 사용하되 이 셋을 혼동하지 말고 사용하자
Hibernate 는 JPA 구현체 이고, Spring Data JPA 는 JPA 에 대한 데이터의 접근의 추상화 라고 말할 수 있다.
Spring Data JPA 는 GenericDao 라는 커스텀 구현체를 제공하는데 이것의 메소드의 명칭으로 JPA 쿼리들을 생성할 수 있다.
Spring Data JPA 를 사용하면 Hibernate, Eclipse Link 등의 JPA 구현체를 사용이 가능하며, @Transaction 어노테이션을 통해 트랜잭션 영역을 선언하며 관리할 수 있다,
Hibernate 는 낮은 결합도의 이점을 살린 ORM 프레임워크로서 API 레퍼런스를 제공하며,
위의 내용중 중요한 결론은 Spring Data JPA 는 항상 Hiberante 와 같은 JPA 구현체가 필요하다.
'일기' 카테고리의 다른 글
2023-02-10 (0) | 2023.02.10 |
---|---|
2023-02-09 (0) | 2023.02.09 |
2023-02-07 (0) | 2023.02.07 |
2023-02-06 (0) | 2023.02.06 |
2023-02-04 (0) | 2023.02.04 |