안녕하세요, 여러분! 오늘은 자바와 스프링에서 트랜잭션 관리에 널리 사용되는 @Transactional 어노테이션에 대해 알아보려고 합니다.
- @Transactional이란?
- @Transactional은 스프링 프레임워크에서 지원하는 어노테이션으로, 특정 메서드 또는 클래스에 트랜잭션 처리를 선언적으로 적용할 수 있게 해줍니다. 즉, 해당 어노테이션이 붙어 있는 메서드는 하나의 트랜잭션 단위로 작동하게 됩니다.
- 트랜잭션이란?
- 트랜잭션이란 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한 꺼번에 모두 수행되어야 할 일련의 연산들을 말합니다. 트랜잭션은 ACID(Atomicity, Consistency, Isolation, Durability)라는 네 가지 속성을 만족해야 합니다.
- @Transactional 동작 원리
- @Transactional 어노테이션은 AOP(Aspect-Oriented Programming)를 이용하여 작동합니다. @Transactional이 붙은 메서드가 호출될 때 스프링 프레임워크는 트랜잭션을 시작합니다. 그리고 메서드가 정상적으로 종료되면 트랜잭션을 커밋하고, 도중에 예외가 발생하면 트랜잭션을 롤백합니다.
- 주의점
- 그러나 @Transactional 어노테이션 사용시 주의해야 할 점이 있습니다. 예를 들어, private 메서드나, 같은 클래스 내의 다른 메서드를 통한 내부 호출에서는 @Transactional 어노테이션이 제대로 동작하지 않습니다. 이는 스프링이 프록시 기반의 AOP를 사용하기 때문입니다.
`@Transactional` 어노테이션의 동작 과정
1. **프록시 생성**: 스프링은 @Transactional 어노테이션이 적용된 빈(Bean)이 생성될 때 이를 프록시 객체로 감싸서 생성합니다. 이 프록시 객체는 원본 빈의 모든 메서드 호출을 가로채서 해당 메서드가 @Transactional 어노테이션으로 표시되어 있는지 확인합니다.
2. **트랜잭션 관리자 조회**: @Transactional이 붙은 메서드가 호출되면, 프록시 객체는 먼저 트랜잭션 관리자(Transaction Manager)를 조회합니다. 트랜잭션 관리자는 데이터베이스 연결 등의 리소스를 관리하며 트랜잭션의 시작과 종료를 제어합니다.
3. **트랜잭션 시작**: 트랜잭션 관리자는 새로운 트랜잭션을 시작합니다. 이 때 생성된 트랜잭션의 정보는 ThreadLocal이라는 스레드에 종속적인 저장소에 저장됩니다. 이로 인해 동일한 스레드 내에서는 같은 트랜잭션을 공유하게 됩니다.
4. **비즈니스 로직 실행**: 트랜잭션이 시작된 후, 원래 호출하려던 메서드의 비즈니스 로직이 실행됩니다. 이 과정에서 데이터베이스의 변경이 일어날 수 있습니다.
5. **트랜잭션 커밋 또는 롤백**: 비즈니스 로직의 실행이 정상적으로 끝나면 트랜잭션은 커밋되고, 이 과정에서 데이터베이스의 변경 사항이 실제로 반영됩니다. 만약 비즈니스 로직 실행 중에 예외가 발생하면 트랜잭션은 롤백되고, 데이터베이스의 변경 사항은 모두 취소됩니다.
6. **트랜잭션 종료**: 마지막으로, 트랜잭션 관리자는 트랜잭션을 종료하고 사용하던 리소스를 해제합니다.
이렇게 @Transactional 어노테이션은 프록시와 AOP, 트랜잭션 관리자를 이용하여 선언적인 트랜잭션 관리를 제공합니다. 이를 이해하고 잘 사용하면, 복잡한 트랜잭션 로직을 보다 쉽고 안전하게 구현할 수 있습니다.
이처럼 @Transactional 어노테이션은 선언적 트랜잭션 관리를 가능하게 해주는 강력한 도구입니다. 트랜잭션 관리는 어플리케이션의 데이터 일관성을 유지하는데 매우 중요하므로, 이를 잘 이해하고 사용하는 것이 중요합니다. 다음 글에서는 더 다양한 트랜잭션 관리 방법에 대해 다루도록 하겠습니다.
'spring' 카테고리의 다른 글
Spring Boot: @Configuration VS @EnableAutoConfiguration - 세밀한 빈 관리와 자동 설정 (0) | 2023.06.10 |
---|---|
Spring MVC의 핵심 구성요소: Dispatcher Servlet과 WebApplicationContext (0) | 2023.06.05 |
Spring WebFlux와 멀티스레딩: 왜 나는 멀티스레딩을 선택했는가 (0) | 2023.06.05 |
스프링 보안 강의: Spring Security 이해하기 (0) | 2023.06.05 |
DispatcherServlet 이란? (0) | 2023.05.29 |