Replies: 2 comments
-
내부 동작 원리저는 “내부 동작 원리”를
|
| 구분 | @Transactional 없음 |
@Transactional 있음 |
|---|---|---|
| 트랜잭션 경계 | SQL 단위에 가까움 | 메서드 단위로 묶임 |
| auto commit | 보통 true |
false로 두고 마지막에 commit |
| 커넥션 | SQL 실행마다 얻고 반납 가능 | 트랜잭션 동안 같은 커넥션 사용 |
| 예외 발생 시 | 이전 SQL은 이미 commit됐을 수 있음 | 전체 rollback 가능 |
| 원자성 | 보장 어려움 | 여러 SQL을 하나의 작업으로 보장 가능 |
다만 @Transactional을 붙였다고 항상 rollback되는 것은 아니라고 알고 있습니다.
Spring의 기본 설정에서는 보통 RuntimeException이나 Error가 발생했을 때 rollback되고, 체크 예외는 기본적으로 rollback 대상이 아닙니다.
@Transactional
public void reserve() {
throw new IllegalArgumentException();
}위와 같은 런타임 예외는 rollback 대상입니다.
반면 체크 예외까지 rollback하고 싶다면 명시적으로 설정할 수 있습니다.
@Transactional(rollbackFor = Exception.class)
public void reserve() throws Exception {
throw new Exception();
}또 하나는 같은 클래스 내부에서 자기 자신의 @Transactional 메서드를 호출하는 경우입니다.
public void outer() {
inner();
}
@Transactional
public void inner() {
// ...
}Spring의 @Transactional은 프록시 기반으로 동작하기 때문에,
이런 self-invocation 상황에서는 트랜잭션이 적용되지 않을 수 있습니다.
더 깊게 연결되는 개념들
이번에는 @Transactional 사용 여부에 따라 커넥션, auto commit, commit/rollback 경계가 어떻게 달라지는지를 중심으로 정리했습니다.
다만 이 내용을 더 깊게 들어가면 여러 Spring 트랜잭션 개념과도 연결된다고 생각합니다.
예를 들어 같은 트랜잭션 안에서 JdbcTemplate이 같은 커넥션을 재사용할 수 있는 이유는 스프링 트랜잭션 리소스 동기화와 관련이 있고,
이미 트랜잭션이 있는 메서드에서 다른 @Transactional 메서드를 호출했을 때 어떻게 동작하는지는 트랜잭션 전파 옵션과 연결된다고 이해했습니다.
또한 @Transactional이 JDBC, JPA 같은 기술 차이를 어느 정도 숨기고 일관된 방식으로 트랜잭션을 다룰 수 있게 해주는 것은 스프링 트랜잭션 추상화와 관련이 있고,
DB 접근 중 발생하는 예외를 Spring의 DataAccessException 계층으로 바꿔주는 부분은 트랜잭션 예외 변환과도 이어진다고 생각합니다.
아직은 이 개념들을 모두 깊게 설명하기보다, 우선은 다음 정도로만 이해하고 정리해두었습니다.
@Transactional은 단순히 rollback을 자동으로 해주는 애노테이션이 아니라, 커넥션 관리, 트랜잭션 경계 설정, 리소스 동기화, 전파 정책, 예외 처리 방식까지 Spring이 일관되게 관리할 수 있도록 해주는 진입점이다.
이번에서는 우선 JdbcTemplate 기준으로 가장 체감하기 쉬운 auto commit과 원자성 중심으로 정리했고,
차후 레벨 2 기간 안에 스프링 트랜잭션 리소스 동기화, 전파, 트랜잭션 추상화, 예외 변환까지 이어서 정리해보고 싶습니다.
최종 정리
결론적으로 저는 이렇게 정리할 수 있을 것 같습니다.
@Transactional은 여러 DB 작업을 하나의 논리적 작업 단위로 묶기 위해,
커넥션의 auto commit을 끄고 commit/rollback 경계를 Spring이 대신 관리해주는 장치이다.
JdbcTemplate을 사용하더라도 @Transactional이 없으면 각각의 SQL이 독립적으로 커밋될 수 있고,
@Transactional이 있으면 같은 트랜잭션에 묶인 커넥션을 재사용하면서 여러 SQL을 하나의 원자적인 작업으로 다룰 수 있다고 이해했습니다.
그리고 이 흐름은 더 깊게 들어가면 스프링 트랜잭션 리소스 동기화, 전파, 트랜잭션 추상화, 예외 변환과도 연결되기 때문에, 이후에 해당 개념들까지 함께 정리해보면 좋을 것 같습니다.
Beta Was this translation helpful? Give feedback.
-
|
흥미로운 주제네요! JdbcTemplate 커넥션 재사용 원리
|
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
-
@transactional 사용 여부에 따른 내부 동작 원리
'내부 동작 원리'라는 표현이 모호하다면,
본인이 기준을 정해서 답변달아주세용
Beta Was this translation helpful? Give feedback.
All reactions