스피링이 제공하는 트랜잭션 매니저는 크게 2가지 역할을 한다.
- 트랜잭션 추상화
- 리소스 동기화
- 트랜잭션을 유지하려면 트랜잭션의 시작부터 끝까지 같은 db 커넥션을 유지해야한다.
같은 커넥션을 동기화 하기 위해서는 파라미터로 커넥션을 전달하는 방법을 선택했는데 이 방법을 코드가 지전해질 뿐만아니라 메서드를 중복해서 만들어야하는 등의 단점들이 존재한다.
스프링은 위의 단점 해결해서 제공한다. (아래 문단 참조)
- 트랜잭션을 유지하려면 트랜잭션의 시작부터 끝까지 같은 db 커넥션을 유지해야한다.
- 스프링은 "트랜잭션 동기화 매니저" 를 제공한다. 이것은 쓰레드 로컬을 사용해서 커넥션을 도익화 해준다.
트랜잭션 매니저는 내부에서 이 트랜잭션 동기화 매니저를 사용한다. - 트랜잭션 동기화 매니저는 쓰레드 로컬을 사용하기 때문에 멀티쓰레드 상황에서 안전하게 커넥션을 동기화 할 수 있다.
따라서 커넥션이 필요하면 트랜잭션 동기화 매니저를 통해 커넥션을 흭득하면 된다. (파라미터로 전달 불필요) - 동작 방식
- 트랜잭션을 시작하려면 커넥션이 필요하기 때문에 트랜잭션 메니저는 데이터소스를 통해 커넥션을 만들고
트랜잭션을 시작한다 - 트랜잭션 매니저는 트랜잭션이 시작된 커넥션을 트랜잭션 동기화 매니저에 보관한다.
- 리포지토리는 트랜잭션 동기화 매니저에 보관된 커낵션을 꺼내서 사용한다.(파라미터 전달 불필요)
- 트랜잭션이 종료되면 트랜잭션 매니저는 트랜잭션 동기화 매니저에 보관된 커넥션을 통해 트랜잭션을 종료하고
커넥션도 닫는다
- 트랜잭션을 시작하려면 커넥션이 필요하기 때문에 트랜잭션 메니저는 데이터소스를 통해 커넥션을 만들고
- 트랜잭션 동기화 매니저 클래스 : org.springframwork.transaction.support.TransactionSynchronizationManager
- 쓰레드 로컬을 사용하면 각각의 쓰레드마다 별도의 저장소가 부여된다.따라서 해당 쓰레드만 해당 데이터에 접근할 수 있다.
- DataSourceUtils.getConnection()
- 트랜잭션 동기화 매니저가 관리하는 커넥션이 있으면 해당 커넥션 반환
- 트랜잭션 동기화 매니저가 관리하는 커넥션이 없는 경우 새로운 커넥션을 생성해서 반환
- DataSourceUtils releseConnection()
- conn.close()를 사용해서 직접 닫아버리면 커넥션이 유지되지 않는 문제가 발생한다.
이 커넥션은 이후 로직은 물론이고 트랜잭션을 종료할 때 까지 살아있어야한다. 그래서 파라미터로 전달했는데
이를 사용하면 바로 닫는것이 아니다 - 트랜잭션을 사용하기 위해 동기화된 커넥션은 커넥션을 닫지않고 그대로 유지
- 트랜잭션 동기화 매니저가 관리하는 커넥션이 없는 경우 해당 커넥션을 닫는다.
- conn.close()를 사용해서 직접 닫아버리면 커넥션이 유지되지 않는 문제가 발생한다.
- 서비스 계층에서 트랜잭션 매니저 사용하기
- PlatformTransactionManager 인터페이스를 구현체를 주입(DI)해서 생성해주면 된다.
- 다른 기술로 변경되면 해당 구현체를 주입 받게 설정하면 끝
- PlatformTransactionManager
- getTransaction()
- 트랜잭션을 시작한다.
- TransactionStatus status를 반환한다. 여기에는 현재 트랜잭션 상태 정보가 포함되어 있고,
이후 커밋, 롤백시 필요하다. - 매개변수로 들어가는 new DefaultTransactionDefinition()와 같은 클래스는
트랜잭션과 관련된 옵션을 지정할 때 사용한다.
- commit(status)
- 성공시 이 로직을 호출해서 커밋하면 된다.
- rollback(status)
- 문제가 발생 시 이 로직을 호출해서 롤백하면 된다.
- getTransaction()
- PlatformTransactionManager
'Spring > JDBC' 카테고리의 다른 글
[Spring DB 개념] 트랜잭션 탬플릿 (0) | 2024.08.08 |
---|---|
[Spring DB 개념] 트랜잭션 - 트랜잭션 매니저 동작 흐름 정리 및 정리 (0) | 2024.07.26 |
[Spring DB 개념] 트랜잭션 - 추상화 (0) | 2024.07.26 |
[Spring DB 개념] 트랜잭션 - 기존 방식의 문제점 (0) | 2024.07.26 |
[Spring DB 개념] 트랜잭션 (0) | 2024.07.17 |