[Spring] Spring Data JPA (1)

이연우·2025년 7월 29일

TIL

목록 보기
71/100

🌱 Spring Boot와 JPA

  • Spring Boot는 JPA 설정을 자동 구성해 줌
  • 개발자는 직접 EntityManagerFactory나 트랜잭션을 만들지 않고,
    application.properties에 설정만 하면 바로 사용 가능

🧾 전통적인 JPA 코드 (순수 JPA)

EntityManagerFactory emf = Persistence.createEntityManagerFactory("test");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();

tx.begin();

Tutor tutor = new Tutor(1L, "wonuk", 100);
em.persist(tutor); // 영속화
tx.commit();

em.close();
emf.close();

EntityManagerFactory, EntityManager, Transaction을 직접 생성
close()도 직접 처리
→ 트랜잭션을 수동으로 시작하고 종료

☕ Spring Boot + JPA 통합 구조

  • spring-boot-starter-data-jpa 의존성 추가로 설정 자동화

  • application.properties에 DB 설정만 해 주면 작동

  • ✅ 내부적으로 EntityManagerFactory, TransactionManager가 자동 Bean 등록됨

  • @PersistenceContextEntityManager 주입

🔐 동시성 처리 방식

  • EntityManager는 싱글톤처럼 보이지만,
    실제 요청마다 프록시 객체를 통해 별도 인스턴스가 생성되어 Thread-Safe하게 작동

📘 예시: Spring 환경에서의 JPA 사용

@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);
    }
}

@Repository + @PersistenceContext로 Spring이 관리
→ 직접 em.close()begin/commit 필요 없음
→ 트랜잭션은 @Transactional 어노테이션으로 처리


📝 Spring Data JPA

  • Spring Framework에서 JPA를 더욱 쉽게 사용할 수 있도록 만든 모듈
  • CRUD 반복 코드를 줄이고, 인터페이스만으로 SQL 없이 DB 접근이 가능해짐

📚 JPA vs Spring Data JPA 비교

⚙️ 기존 JPA

@PersistenceContext
private EntityManager em;

public void save(Member member) { em.persist(member); }

반복되는 코드 많음
→ SQL을 직접 작성하거나 JPQL 필요

🌿 Spring Data JPA

public interface MemberRepository extends JpaRepository<Member, Long> {
    Member findById(Long id);
}

JpaRepository 상속만으로 CRUD 기본 기능 자동 제공
→ 메서드 이름만으로 쿼리 생성 (Query Method)

🔧 Spring Data JPA 주요 기능

기능설명
Repository 추상화 제공CrudRepository, JpaRepository 등 기본 인터페이스 제공
⚙️ JPA 구현체와 통합Hibernate 등과 연동하여 SQL 자동 생성
🔍 Query Methods메서드 이름만으로 JPQL 자동 생성
복잡한 경우 @Query 사용 가능
🔄 트랜잭션 + 지연로딩(Lazy)Spring과 트랜잭션 통합, 연관 객체는 필요할 때 로딩

🧱 SimpleJpaRepository란?

  • JpaRepository 인터페이스의 기본 구현체
  • Spring이 이 클래스를 자동으로 생성하여 내부에서 CRUD 수행

📦 내부 구조

  • Bean으로 자동 등록됨
  • EntityManager를 내부에서 사용

📘 사용 방법

public interface MemberRepository extends JpaRepository<Member, Long> {
}
  • 상속만 해도:
    - save(), findById(), delete() 등 사용 가능
    - 페이징, 정렬, Query Method 등 추가 기능도 지원

🧪 내부 메서드 예시

메서드설명
save(entity)엔티티 저장 (insert or update)
findAll()전체 데이터 조회
delete(entity)데이터 삭제
findById(id)단건 조회
+ 페이징, 정렬 등 추가 지원

☝️ 직접 구현할 필요 없이 Spring이 자동으로 생성해 줌


🧠 요약 정리

구분순수 JPASpring Boot + JPASpring Data JPA
설정수동 구성자동 구성자동 구성 + 기능 확장
트랜잭션직접 관리@Transactional 사용 가능완전 자동 처리
EntityManager직접 생성자동 주입내부적으로 자동 주입
코드 작성량많음줄어듦극단적으로 줄어듦
장점세밀한 제어편리한 관리빠른 생산성, 간결함

0개의 댓글