JPA

JPA에서 트랜젝션

초코너무조코 2025. 4. 24. 16:23
728x90

 1. 트랜잭션 기본 개념

  • JPA에서 모든 데이터 변경 작업(CREATE, UPDATE, DELETE) 은 반드시 트랜잭션 안에서 이루어져야 해.
  • 트랜잭션 생명주기
    1. 시작: tx.begin();
    2. 작업 수행: persist, find, remove, 등.
    3. 성공 시 커밋: tx.commit();
    4. 오류 시 롤백: tx.rollback();

 2. 매번 트랜잭션을 직접 만드는 방식 (지금처럼)

  • EntityManager 를 사용할 때 매 작업마다 트랜잭션을 시작하고 종료해야 해.
  • 이 방식은 단순한 자바 SE 환경 (Spring 없이 순수 JPA) 에서 많이 씀.

예시:

EntityTransaction tx = em.getTransaction();
tx.begin();
try {
    // 작업
    em.persist(...);
    tx.commit();
} catch (Exception e) {
    tx.rollback();
}

3. 트랜잭션을 매번 만드는 이유

  • JPA에서는 트랜잭션이 없으면 DB에 아무 작업도 적용되지 않음.
  • 트랜잭션 단위 = 하나의 비즈니스 로직을 처리하는 단위로 보는 게 좋아.
    • 예: 회원가입, 주문 처리, 게시글 작성 등.

4. Spring에서는 더 편하게 관리 가능

  • Spring 프레임워크에서는 @Transactional 을 사용해서 자동으로 트랜잭션을 관리할 수 있어.
  • 이 경우 직접 tx.begin() / tx.commit() 안 해도 돼.

예시 (Spring)

@Service
public class MemberService {

    @Transactional  // 이 메서드 실행 시 트랜잭션 시작 → 끝나면 자동 커밋/롤백
    public void join(Member member) {
        em.persist(member);
    }
}
  • 메서드 단위로 트랜잭션을 묶을 수 있어서 편리하고 실수도 줄어듦.

 5. 상황 별 정리

상황 트랜잭션 관리 방식
순수 JPA (Java SE) 직접 tx.begin() / tx.commit()
Spring 사용 @Transactional 으로 자동 관리

6. 정리

  • 순수 JPA에서는 작업마다 트랜잭션 수동 관리.
  • Spring에서는 @Transactional로 선언적 트랜잭션 관리.
  • 단일 트랜잭션 = 하나의 비즈니스 작업 단위.
  • 읽기만 하는 작업에도 트랜잭션 권장 (읽기 일관성 보장).

 

728x90