노트@Transactional
@Transactional (Declarative Transaction Management)
백엔드#spring#jpa · 연결된 개념 11개
쉽게 말하면
@Transactional은 메서드 하나를 '전부 되거나 전부 없던 일'로 묶어 주는 표시예요. 문서를 끝까지 고친 뒤에만 저장하고, 중간에 문제가 생기면 통째로 되돌리는 것과 비슷해요.
비유가 깨지는 곳 실제로는 모든 오류에 되돌리지 않아요. 기본 롤백 대상은 런타임 예외와 Error라 체크 예외는 그대로 커밋되고, 프록시가 여는 거라 private 메서드나 같은 클래스 안 호출엔 적용되지 않아요.
메서드 하나를 트랜잭션 하나로 묶는 선언. 프록시가 호출 앞에서 트랜잭션을 열고, 정상 종료면 커밋, 런타임 예외면 롤백한다.
- 기본 롤백 대상은
RuntimeException과 Error다. 체크 예외(checked exception)는 커밋되므로 필요하면 rollbackFor로 바꾼다
- 트랜잭션 동안 영속성 컨텍스트가 유지되고, 커밋 직전 flush 때 변경 감지 결과가 SQL로 나간다
readOnly = true면 Hibernate가 flush를 하지 않아 조회가 가벼워진다
- private 메서드나 같은 클래스 안의 호출(자기 호출 문제)에는 적용되지 않는다(스프링 AOP)
책: 7장. 영속성 컨텍스트라는 출석부
출처: Spring Framework 문서: Using @Transactional · Method visibility · Rolling Back a Declarative Transaction
연결된 개념
이 노트를 가리키는 문서
뜻이 가까운 노트
- 영속성 전이 (cascade)
영속성 전이(cascade, transitive persistence)는 부모 엔티티에 한 영속성 작업(저장·병합·삭제 등)을 연관된 자식 엔티티에도 자동으로 적용하는 JPA 옵션이다. 기본값은 아무것도 전이하지 않는 것이다.
- Spring Data 리포지터리와 쿼리 메서드
Spring Data는 인터페이스만 선언하면 구현체를 런타임에 만들어 주는 영속성 추상화(persistence abstraction)다. JpaRepository<엔티티, ID타입>을 상속하면 저장·조회·삭제·페이징이 바로 생기고, 메서드 이름 규칙만으로 쿼리를 만들 수도 있다.
- JDBC와 JdbcTemplate
JDBC(Java Database Connectivity)는 자바가 여러 DB와 통신하기 위한 표준 API이고, Hibernate·MyBatis·스프링 JDBC 모두 그 위에 있다. JdbcTemplate은 스프링이 JDBC의 반복 작업(연결 열고 닫기, 예외 변환, 결과 순회)을 대신해 주는 클래스다.
- 예외 삼키기
예외를 잡아 놓고 아무 처리 없이 흘려보내는 안티패턴(Anti-pattern). 빈 catch뿐 아니라 debug 레벨로만 찍고 정상인 척 진행하는 것도 마찬가지다.
- 최종 일관성
최종 일관성(eventual consistency)은 "지금 당장은 저장소마다 값이 다를 수 있지만, 새 변경이 멈추면 결국 같아진다"는 보장이다. 원본 DB와 검색 색인·캐시·다른 서비스처럼 물리적으로 분리된 저장소를 한 트랜잭션으로 묶을 수 없을 때 받아들이는 일관성 모델(consistency model)이다.