Spring의 트랜잭션
- Spring 프레임워크에서는 DB의 트랜잭션 개념을 애플리케이션에 적용할 수 있도록 트랜잭션 관리자를 제공합니다.
@Transactional(readOnly = true)
public class SimpleJpaRepository<T, ID> implements JpaRepositoryImplementation<T, ID> {
...
@Transactional
@Override
public <S extends T> S save(S entity) {
Assert.notNull(entity, "Entity must not be null");
if (entityInformation.isNew(entity)) {
em.persist(entity);
return entity;
} else {
return em.merge(entity);
}
}
...
}
예시 코드 처럼 @Transactional 애너테이션을 클래스나 메서드에 추가하면 쉽게 트랜잭션 개념을 적용할 수 있습니다.
- 메서드가 호출되면, 해당 메서드 내에서 수행되는 모든 DB 연산 내용은 하나의 트랜잭션으로 묶입니다.
- 해당 메서드가 정상적으로 수행되면 트랜잭션을 커밋하고, 예외가 발생하면 롤백합니다.
- 클래스에 선언한 @Transactional은 해당 클래스 내부의 모든 메서드에 트랜잭션 기능을 부여합니다.
- save 메서드는 @Transactional 애너테이션이 추가되어있기 때문에 클래스의 readOnly = true 옵션인 @Transactional을 덮어쓰게 되어 readOnly = false 옵션으로 적용됩니다.
readOnly = true 옵션
- 트랜잭션에서 데이터를 읽기만 할 때 사용됩니다.
- 이 속성을 사용하면 읽기 작업에 대한 최적화를 수행할 수 있습니다.
- 만약, 해당 트랜잭션에서 데이터를 수정하려고 하면 예외가 발생하기 때문에 주의해야합니다.

- 스프링 컨테이너 환경에서는 트랜잭션과 영속성 컨텍스트의 생명주기가 일치합니다.
- 쉽게 설명하자면 트랜잭션이 유지되는 동안은 영속성 컨텍스트도 계속 유지가 되기 때문에 영속성 컨텍스트의 기능을 사용할 수 있습니다.
- 즉 영속성 컨텍스트의 기능-1차 캐시, 쓰기 지연 저장소, 변경 감지가 트랜잭션이 유지되는 동안 작동되는 것입니다.
⚠️ Spring은 어떻게 Service 부터 Repository 까지 Transaction을 유지할 수 있는 걸까요?
- Spring에서는 이러한 상황에서 트랜잭션을 제어할 수 있도록 트랜잭션 전파 기능을 제공하고 있습니다.
- 부모 메서드가 끝날 때, 부모와 자식 메서드에서 생성된 모든 SQL이 DB에 요청됩니다.(1차 캐시)
- 당연히 쓰기 지연 저장소, 변경 감지 기능도 작동합니다.
'Spring > 팀스파르타' 카테고리의 다른 글
22. JPA Auditing (3) | 2024.11.07 |
---|---|
21. Spring Data JPA란 무엇일까? (0) | 2024.11.06 |
19. 영속성 컨텍스트의 기능 (1) | 2024.11.05 |
18-1. Persistence Context 와 Transaction (1) | 2024.11.05 |
18. 영속성 컨텍스트(Persistance Context)와 트랜잭션(Transaction) (1) | 2024.11.02 |