노트

@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)이다.

보기 옵션