T_era

JPA vs Spring Data JPA 본문

Programing/Spring

JPA vs Spring Data JPA

블스뜸 2025. 5. 16. 10:46

기존 JPA 코드 방식

  • 직접 EntityManagerFactory 및 EntityManager 생성 및 관리.
  • 각 트랜잭션 시작/종료(begin(), commit(), rollback()) 직접 관리.
  • 사용 후 EntityManager 및 EntityManagerFactory의 close() 메서드를 직접 호출하여 연결 종료 필요.
public static void main(String[] args) {
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("test");
    EntityManager em = emf.createEntityManager();
    EntityTransaction transaction = em.getTransaction();

    transaction.begin();

    try {
        Tutor tutor = new Tutor(1L, "wonuk", 100);
        em.persist(tutor);
        transaction.commit();
    } catch (Exception e) {
        e.printStackTrace();
        transaction.rollback();
    } finally {
        em.close();
    }

    emf.close();
}

Spring Boot와 JPA

  • JPA는 Spring에 종속적이지 않음.
  • Spring Boot에서 JPA 사용 시 spring-boot-starter-data-jpa 의존성 추가 필요 (build.gradle).
  • Spring Boot는 필요한 JPA 설정 및 Entity 관리를 자동 수행.
  • EntityManagerFactory를 내부적으로 싱글톤으로 생성 및 관리, Bean으로 자동 등록. 직접 생성 불필요.
  • EntityManager 직접 close() 불필요 (Spring Boot가 관리).
  • application.properties에 설정된 DB 정보EntityManagerFactory 생성.
  • @PersistenceContext 어노테이션을 통해 자동으로 생성된 EntityManager 주입받아 사용 가능. EntityManager는 Spring Data JPA에서 관리하므로 직접 관리 불필요.
  • EntityManager는 동시성 문제 방지를 위해 싱글톤으로 등록되지 않으나, Spring Boot는 프록시 객체를 싱글톤으로 등록하여 요청마다 독립적인 EntityManager 인스턴스를 제공.
@Repository
public class TutorRepository {

    @PersistenceContext
    private EntityManager em;

    public void save(Tutor tutor) {
        em.persist(tutor);
    }

    public Tutor findById(Long id) {
        return em.find(Tutor.class, id);
    }

    public List<Tutor> findAll() {
        return em.createQuery("SELECT * FROM tutor", Tutor.class).getResultList();
    }

    public void delete(Tutor tutor) {
        em.remove(tutor);
    }
}

JPA vs Spring Data JPA

기능 JPA Spring Data JPA
Repository 구현 @PersistenceContext를 이용한 EntityManager 직접 사용, CRUD 메서드 직접 구현
JpaRepository 인터페이스 상속을 통한 기본적인 CRUD 메서드 자동 제공, Query Methods 기능 활용으로 생산성 향상
생산성 낮음 (반복적인 CRUD 코드 작성 필요)
높음 (기본 CRUD 메서드 자동 제공, 메서드 이름 기반 쿼리 자동 생성)

Spring Data JPA

  • Spring Framework에서 JPA를 편리하게 사용할 수 있도록 지원하는 모듈.
  • CrudRepository, JpaRepository 인터페이스를 통한 JPA 추상화된 Repository 제공.
  • SQL이나 EntityManager 직접 호출 없이 기본적인 CRUD 기능 구현 용이.
  • JPA 구현체(일반적으로 Hibernate)와 통합되어 SQL 자동 생성.
  • Query Methods: 메서드 이름만으로 SQL 자동 생성.
  • @Query 어노테이션을 이용한 JPQL 또는 Native Query 정의 가능 (복잡한 SQL 직접 구현 시 사용).
  • 트랜잭션 관리 및 Lazy Loading 기능 Spring과 통합 제공.
  • SimpleJpaRepository: JpaRepository 인터페이스의 기본 구현체로 Spring Data JPA가 자동으로 생성하여 Bean으로 등록. 개발자는 직접 사용 또는 참조 불필요.

사용 방법:

public interface MemberRepository extends JpaRepository<Entity, PK_Type> {
    // 추가적인 Query Methods 정의 가능
}
  • Repository 인터페이스 선언 후 JpaRepository<Entity 클래스, PK 데이터 타입> 상속.
  • Spring 실행 시 해당 인터페이스 정보를 바탕으로 SimpleJpaRepository Bean 자동 생성.

SimpleJpaRepository 주요 메서드:

  • save(): Entity 저장.
  • findAll(): 모든 Entity 조회.
  • delete(): Entity 삭제.
  • 이외 페이징, 정렬 등 다양한 기능 제공.