Everyday Dev System

JPA와 Spring Data JPA 차이 본문

백엔드 개발자 필수 요소

JPA와 Spring Data JPA 차이

chaeyoung- 2023. 6. 29. 17:38

 

 

 

ORM의 표준 명세인 JPA는 인터페이스이고, Hibernate는 JPA를 구현하는 구현체이다.

 

 

<< 목표 >>

ORM과 JPA, Hibernate, Spring Data JPA에 대해서 살펴보자.
JPA와 Hibernate, Spring Data JPA 이 세 가지의 차이점을 설명할 수 있어야 한다.

 

 

1. ORM 이란?

 

가장 먼저 ORM이 뭔지 알아보자

 

Object-Relational Mapping의 약자로,

객체와 관계형 데이터베이스의 데이터를 자동으로 매핑(연결)해주는 것이다.

객체 지향 프로그래밍(OOP) 에서는 Class를 사용하고, 관계형 데이터베이스는 테이블을 사용한다.

그렇다면, 객체 모델과 관계형 모델을 매핑 할 수 있을까? 이러한 궁금증을 해결해주는 도구가 ORM 이다.

 

ORM을 사용하면 비즈니스 로직에 더욱 집중할 수 있고, 재사용 및 유지보수의 편리성이 증가한다.

 

 

우리는 JPA에서 DB에 대한 접근을 시도할 때 직접 SQL 쿼리문을 만들지 않는다. 

다만 객체를 이용한 메소드를 통해 이를 관리할 뿐이다.

 

SELECT  *  FROM users  → user.findAll()

상단의 예시는 users 라는 Table에서 모든 정보를 조회하는 기능을 한다.
그러나 우리는 JPA를 활용하면 user.findAll()을 통해 조회할 수 있다.

user라는 객체와 user테이블을 맵핑한 후, findAll() 메서드를 통해 정보를 가져오는 것이다.

 

 

 

 

 

2. JPA란? 

 

JPA는 영속성 컨텍스트인 EntityManager를 통해 Entity를 관리하고 이러한 Entity가 DB와 매핑되어 사용자가 Entity에 대한 CRUD를 실행을 했을 때 Entity와 관련된 테이블에 대한 적절한 SQL 쿼리문을 생성하고 이를 관리하였다가 필요시 JDBC API를 통해 DB에 날리게 된다.

 

JDBC는 Java Database Connectivity의 약자로 자바에서 데이터 베이스에 접속 할 수 있도록 해주는 자바 API이다.

그러므로, JPA에서도 JDBC API를 통해 DB에 접속한다.

 

 

JPA 예시 코드 :

@Repository
@RequiredArgsConstructor
public class OrderRepository {

    private final EntityManager em;

    public void save(Order order){
        em.persist(order);
    }

    public Order findOne(Long id){
        return em.find(Order.class, id);
    }

    public List<Order> findAll() {
        return em.createQuery("select o from Order o", Order.class)
                .getResultList();
    }
    
    public List<Order> findAllWithItem() {
        return em.createQuery(
                "select distinct o from Order o" +
                        " join fetch o.member m" +
                        " join fetch o.delivery d" +
                        " join fetch o.orderItems oi" +
                        " join fetch oi.item i", Order.class)
                .getResultList();
    }
}

 

  • 클래스에 @Repository 어노테이션을 기재한다.
  • 멤버변수로 EntityManager를 갖고, 생성자 메서드를 통해 주입받는다.
    • 엔티티 매니저 팩토리는 META-INF/persistence.xml에 있는 정보를 바탕으로 생성한다.
    • 이 엔티티 매니저 팩토리에서 엔티티 매니저를 생성하여 동작하게 되는 것이다. 

               emf = Persistence.createEntityManagerFactory("memo");
               em = emf.createEntityManager(); 

 

  • [resources] - [META-INF] - persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2"
             xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
    <persistence-unit name="memo">
        <class>com.sparta.entity.Memo</class>
        <properties>
            <property name="jakarta.persistence.jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
            <property name="jakarta.persistence.jdbc.user" value="root"/>
            <property name="jakarta.persistence.jdbc.password" value="1234"/>
            <property name="jakarta.persistence.jdbc.url" value="jdbc:mysql://localhost:3307/memo"/>

            <property name="hibernate.hbm2ddl.auto" value="update" />

            <property name="hibernate.show_sql" value="true"/>
            <property name="hibernate.format_sql" value="true"/>
            <property name="hibernate.use_sql_comments" value="true"/>
        </properties>
    </persistence-unit>
</persistence>
@Repository
public class dsf {

    EntityManagerFactory emf;
    EntityManager em;

    public void dsf() {
        emf = Persistence.createEntityManagerFactory("memo");
        em = emf.createEntityManager();
    }
}

 

 

 

 

 

 

3. JPA와 Spring Data JPA 차이

 

Spring Data JPA는 Spring Data JPA에서 제공하는 JpaRepository를 상속하여 Repository 인터페이스를 구현한다.

JPARepository 클래스에 @Repository을 추가, 멤버변수로 EntityManager를 사용한다.

JPA에서 제공하는 EntityManager로 데이터 베이스에 접근할 수 있는 것이다.

다시 말해 JPA는 Application과 JDBC 사이에서 동작한다.

 

 

Spring Data JPA란 JPA를 추상화시킨 Repository Interface를 제공하여 (JpaRepository)

개발자가 JPA 를 더 편하게 사용할 수 있게 하는 모듈이다.

 

 

 

Spring Data JPA 예시 코드:

package com.sparta.myblog.repository;

import com.sparta.myblog.entity.Comment;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.List;

public interface CommentRepository extends JpaRepository<Comment,Long> {
    List<Comment> findAllByPostIdOrderByCreatedAtDesc(long id);
}

Spring Data JPA의 Repository Interface (SimpleJpaRepository)에는 EntityManager가 포함되어 있기 때문에 직접 작성하지 않아도 내부에서 자동으로 호출된다. 또한 @Repository를 작성하지 않아도 Bean으로 등록된다. 

 

 

 

4. Hibernate 란,

 

Hibernate란 JPA 인터페이스를 구현한 구현체이다.

자바에서 Interface와 Class 관계로 보면 이해가 빠르다.

 

 

 

 

 

 

 

 

EntityManager를 통해서 영속성 컨텍스트에 접근한다.
스프링에서 EntityManager를 주입 받아서 쓰면, 
같은 트랜잭션의 범위에 있는 EntityManager는 동일 영속성 컨텍스트에 접근한다.

100명 한테 요청 100개 오면, 엔티티 매니저 100개 생기고 1차캐시도 100개 생긴다. 스레드 종료되면, 그때 다 사라진다.
트랜잭션의 범위 안에서만 사용하는 굉장히 짧은 캐시 레이어이다.
전체에서 쓰는 글로벌 캐시는 2차 캐시라고 한다.

즉 고객의 요청이 들어오면 -> 하나의 스레드를 생성하여 EntityManager를 만들고 

-> Transaction이 종료되면 해당 스레드를 종료합니다.

 

 

스프링 데이터 JPA는 JPA를 편리하게 사용하도록 도와주는 기술입니다.
따라서 JPA를 먼저 학습한 후에 스프링 데이터 JPA를 학습해야 한다.


Spring Data JPA를 사용하지 않는다면 클래스에 @Repository를 작성하고 JPA를 
적용한 다음 EntityManager의 API 를 직접 호출해야 Entity에 대한 CRUD가 처리된다.

 

ORM의 표준 명세인 JPA는 인터페이스이다. Hibernate는 이러한 JPA를 구현하는 구현체이다.

 

 

 

 

 


references :

 

https://velog.io/@evelyn82ny/JPA-vs-Spring-Data-JPA

 

JPA와 Spring Data JPA의 차이 (feat. Hibernate)

JPA의 핵심인 EntityManager를 통해 Entity CRUD를 처리하며 EntityManager와 EntityManagerFactory는 라이브러리로 존재한다. 하지만 EntityManager를 직접 작성하는 경우는 거의 없고, 주로 Repository int

velog.io

 

https://me-analyzingdata.tistory.com/entry/Spring-JPA-ORM%EA%B3%BC-JPA

 

[Spring JPA] ORM과 JPA

[Spring JPA] ORM과 JPA Status: Done ✨ ORM이란? ORM은 객체와 DB 테이블이 매핑을 이루는 것을 의미한다. 즉, 내가 코드 상에서 생성한 객체가 DB상에 어떤 테이블과 연결이 된다는 것을 의미한다. 이렇게

me-analyzingdata.tistory.com

 

https://ict-nroo.tistory.com/130

 

[JPA] 영속성 컨텍스트와 플러시 이해하기

영속성 컨텍스트JPA를 공부할 때 가장 중요한게객체와 관계형 데이터베이스를 매핑하는 것(Object Relational Mapping) 과영속성 컨텍스트를 이해하는 것 이다. 두가지 개념은 꼭 알고 JPA를 활용하자.

ict-nroo.tistory.com

 

'백엔드 개발자 필수 요소' 카테고리의 다른 글

CS : CPU와 메모리  (0) 2023.08.17
REST 하다는 것  (0) 2023.06.21