프로그래밍/면접대비문제
@Transactional 어노테이션이 있는메소드, 스프링 시작부터 메소드 시작까지의 작업
Angloper
2024. 11. 30. 15:15
@Transactional 어노테이션이 있는메소드, 스프링 시작부터 메소드 시작까지의 작업
@Transactional 어노테이션이 있는 메소드가 실행될때 어떤 일이 일아날까.
스프링 시작부터 메소드가 실행되고 종료될때까지 어떤일 일어나는지 알아보자.
1.어플리케이션 시작시 작업
1-1.트랜잭션 관리자 등록
- Spring Boot는 자동 설정(Auto Configuration)을 통해 적절한 트랜잭션 관리자를 등록한다.
- 에를들어, JPA를 사용하는 경우
JpaTransactionManager
를 기본으로 등록한다.
- 에를들어, JPA를 사용하는 경우
- 이 관리자는 트랜잭션의 시작, 커밋, 롤백 등을 담당함.
1-2.AOP 프록시 생성
@EnableTransactionManagement
또는 자동 설정에 의애 트랜잭션 메소드가 AOP프록시로 감싸진다.- 스프링은 빈 스캐닝 중
@Transactional
이 붙은 메소드를 확인하고, 해당 메소드가 실행될 때 트랜잭션 관리가 적용되도록 프록시 객체를 생성한다.- 기본적으로 CGLIB 또는 JDK 동적 프록시를 사용한다.
2.메소드 실행 시 작업
2-1.프록시를 통한 메소드 호출
- 트랜잭션 메소드를 호출하면 실제 메소드를 실행하기 전에 프록시 객체가 인터셉트한다.
- 프록시는 트랜잭션 설정과 관리작업을 수행한 후 실제 메소드를 호출한다.
2-2.트랜잭션 동작 정의 확인
- 프록시는 메소드에 선언된
@Transactional
속성을 확인한다.- 트랜잭션 전파(Porpagation)
- 격리수준(Isolation Level)
- 읽기 전용(Read-only)
- Timeout
- 롤백 정책(Rollback Rules)
2-3.트랜잭션 시작
- 트랜잭션 관리자는 트랜잭션을 시작한다.
- 트랜잭션 전파 전책에 따라 새 트랜잭션을 생성하거나 기존 트랜잭션에 참여한다.
- 데이터베이스 커넥션을 확보하고(필요시),
auto-commit
이 비 활성화 된다.
3.실제 메소드 실행
3-1.비지니스 로직 실행
- 트랜잭션 컨텍스트 내에서 실제 메소드가 실행됨.
- 데이터베이스의 CRUD 작업이 발생하면, 변경 사항은 트랜잭션 컨텍스트 내에 보류됨
3-2.예외 처리
- 메소드 실행 중 예외가 발생하면, 프록시는 롤백 정책을 참조하여 트랜잭션 롤백 여부를 결정.
- 기본적으로
RuntimeException
과Error
가 발생하면 롤백됨. checked exception
은 명시적으로 롤백 설정이 없으면 커밋됨.
- 기본적으로
4.메소드 실행 완료 후 작업
4-1. 트랜잭션 커밋 또는 롤백
- 메소드 실행이 성공적으로 끝나면 트랜잭션 관리자는 트랜잭션을 커밋한다.
- 데이터베이스 변경 사항이 확정되고, 커넥션이 반환된다.
- 예외가 발생한 경우 롤백 작업이 수행된다.
- 변경된 데이터는 폐기되며, 트랜잭션이 중단됨.
4-2.리소스 정리
- 트랜잭션이 종료되면 사용된 데이터베이스 커넥션 및 기타 리소스가 pool로 반환된다.
- 트랜잭션 컨텍스트와 관련된 쓰레드 로컬 데이터가 정리된다.
5.애플리케이션 종료 시 작업
- 트랜잭션 관리자는 애플리케이션 종료 시 등록된 리소스를 정리하며, 사용중인 데이터베이스 연결이나 트랜잭션 관련 매니저를 닫는다.
정리
- 애플리케이션 시작 : 트랜잭션 관리자 설정, AOP프록시 생성
- 메소드 호출시 :
- 프록시가 트랜잭션을 시작, 트랜잭션 속성 확인
- 메소드를 실행하며 예외 여부에 따라 커밋 또를 롤백을 결정
- 메소드 실행 후 : 트랜잭션이 종료되고 리소스 반환
- 애플리케이션 종료시 : 트랜잭션 관련 리소스 정리
반응형