T_era
JPA vs Spring Data JPA 본문
기존 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 삭제.
- 이외 페이징, 정렬 등 다양한 기능 제공.
'Programing > Spring' 카테고리의 다른 글
| Spring Data JPA 인터페이스 메서드 자동 실행 원리 (0) | 2025.05.16 |
|---|---|
| Spring Data JPA Query Methods 및 JPA Auditing 정리 (0) | 2025.05.16 |
| 연관관계 매핑 (0) | 2025.05.16 |
| JPA 기본 키(Primary Key) 매핑 (0) | 2025.05.15 |
| JPA 필드 매핑 상세 정리 (0) | 2025.05.15 |