노트

@Transactional

@Transactional (Declarative Transaction Management)

백엔드#spring#jpa · 연결된 개념 14개

쉽게 말하면

@Transactional은 메서드 하나를 '전부 되거나 전부 없던 일'로 묶어 주는 표시예요. 문서를 끝까지 고친 뒤에만 저장하고, 중간에 문제가 생기면 통째로 되돌리는 것과 비슷해요.

비유의 한계 실제로는 모든 오류에 되돌리지 않아요. 기본 롤백 대상은 런타임 예외와 Error라 체크 예외는 그대로 커밋되고, 프록시가 여는 거라 private 메서드나 같은 클래스 안 호출엔 적용되지 않아요.

메서드 하나를 트랜잭션 하나로 묶는 선언. 프록시가 호출 앞에서 트랜잭션을 열고, 정상 종료면 커밋, 런타임 예외면 롤백한다.

  • 기본 롤백 대상은 RuntimeException과 Error다. 체크 예외(checked exception)는 커밋되므로 필요하면 rollbackFor로 바꾼다
  • 트랜잭션 동안 영속성 컨텍스트가 유지되고, 커밋 직전 flush 때 변경 감지 결과가 SQL로 나간다
  • readOnly = true면 Hibernate가 flush를 하지 않아 조회가 가벼워진다
  • private 메서드나 같은 클래스 안의 호출(자기 호출 문제)에는 적용되지 않는다(스프링 AOP)

책: 7장. 영속성 컨텍스트라는 출석부 · 8장. 데이터베이스: 인덱스와 트랜잭션

출처: Spring Framework 문서: Using @Transactional · Method visibility · Rolling Back a Declarative Transaction

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • 영속성 전이 (cascade)

    영속성 전이(cascade, transitive persistence)는 부모 엔티티에 한 영속성 작업(저장·병합·삭제 등)을 연관된 자식 엔티티에도 자동으로 적용하는 JPA 옵션이다. 기본값은 아무것도 전이하지 않는 것이다.

  • JDBC와 JdbcTemplate

    JDBC(Java Database Connectivity)는 자바가 여러 DB와 통신하기 위한 표준 API이고, Hibernate·MyBatis·스프링 JDBC 모두 그 위에 있다. JdbcTemplate은 스프링이 JDBC의 반복 작업(연결 열고 닫기, 예외 변환, 결과 순회)을 대신해 주는 클래스다.

  • Spring Data 리포지터리와 쿼리 메서드

    Spring Data는 인터페이스만 선언하면 구현체를 런타임에 만들어 주는 영속성 추상화(persistence abstraction)다. JpaRepository<엔티티, ID타입>을 상속하면 저장·조회·삭제·페이징이 바로 생기고, 메서드 이름 규칙만으로 쿼리를 만들 수도 있다.

  • 예외 삼키기

    예외를 잡아 놓고 아무 처리 없이 흘려보내는 안티패턴(Anti-pattern). 빈 catch뿐 아니라 debug 레벨로만 찍고 정상인 척 진행하는 것도 마찬가지다.

보기 옵션