JPA
JPA에서 트랜젝션
초코너무조코
2025. 4. 24. 16:23
728x90
1. 트랜잭션 기본 개념
- JPA에서 모든 데이터 변경 작업(CREATE, UPDATE, DELETE) 은 반드시 트랜잭션 안에서 이루어져야 해.
- 트랜잭션 생명주기
- 시작: tx.begin();
- 작업 수행: persist, find, remove, 등.
- 성공 시 커밋: tx.commit();
- 오류 시 롤백: 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