본문 바로가기

Backend

Spring 트랜잭션 내부 동작 원리

반응형

 

새마을금고중앙회 최종면접에서 떨어졌지만, 배운게 많다고 생각한다. 그 중 하나 2차 면접 때 명확히 답변을 하지 못했던 내용으로 트랜잭션 동작 원리에 대한 것이다. 

 

면접 회고를 정리하면서 기술 공부를 조금 더 해보려고 한다.

 


 

스프링의 트랜잭션 관리는 애플리케이션의 데이터 일관성과 무결성을 보장하는 기술이고, 가장 핵심은 개발자가 비즈니스 로직에만 집중할 수 있도록 트랜잭션 경계를 대신 설정해준다는 것이다. 

 

스프링은 JPA나 하이버네이트, JDBC와 같이 데이터 액세스 기술에 대해서 트랜잭션 API를 제공하고 있다. 또한 @Transactional 어노테이션을 이용해서 코드와 트랜잭션 로직을 선언적으로 분리할 수 있다.

 

트랜잭션 관리는 주로 AOP를 기반으로 동작한다. 면접 때도 어노테이션을 이용해 선언적으로 명시하고, AOP 기반으로 작동한다고만 답변했었다. 

 

- 프록시 생성과 AOP

스프링은 @Transactional 어노테이션이 적용된 클래스나 메소드를 스캔하면서 객체 프록시를 생성한다. 이 프록시는 실제 메서드 호출 전후에 트랜잭션 시작, 커밋, 롤백하는 로직을 주입한다. 

 

예를 들어 서비스 클래스의 하나의 메소드에 @Transactional 어노테이션을 붙이면 스프링은 내부적으로 AOP 프록시를 만들어 트랜잭션 경계를 처리한다. 

- PlatformTransactionManger 인터페이스

트랜잭션 관리를 위해 PlatformTransactionManger 인터페이스를 사용한다. 이 인터페이스를 구현한 객체가 실제 트랜잭션의 시작, 커밋, 롤백 등의 작업을 수행하고, DB 연결과 ORM 연동을 책임진다. 

 

- 트랜잭션 동기화

트랜잭션 전후에 필요한 추가작업을 수행하기 위해 TransactionSynchronizationManger를 통해 동기화 작업을 제어한다. 트랜잭션 종료 후 콜백 메서드를 호출하는 작업을 수행한다.

 

- 전파(Propagation)와 격리 수준(Isolation Level)

@Transactional 어노테이션으로 트랜잭션 전파 방식과 데이터 격리 수준을 지정할 수 있다. 

 

 


* 트랜잭션 전파 : 하나의 트랜잭션 내에서 여러 메소드가 호출될 때, 어떤 방식으로 트랜잭션이 이어지는지 정의

  • REQUIRED(기본값) : 이미 실행 중인 트랜잭션이 있으면 해당 트랜잭션에 참여하고, 없을 경우 새로운 트랜잭션을 생성
  • SUPPORTS : 기존 트랜잭션이 있다면 참여하지만, 없으면 NON 트랜잭션 방식으로 실행
  • MANDATORY : 반드시 기존 트랜잭션이 존재해야 하며, 트랜잭션이 없으면 예외 발생
  • NEVER : 트랜잭션이 존재하면 예외 발생, 반드시 트랜잭션 없이 실행

* 격리 수준 : 동시에 실행되는 여러 트랜잭션 간 어떤 데이터가 노출될지 그리고 데이터 일관성을 어떻게 보장할지 결정

  • READ_UNCOMMITED : 가장 낮은 격리 수준으로, 한 트랜잭션에서 아직 커밋되지 않은 데이터를 다른 트랜잭션이 읽을 수 있어 dirty read 현상 발생 가능. 가장 빠르기 때문에 데이터의 일관성이 조금 떨어지더라도 성능을 극대화하기 위해 의도적으로 사용하기도 함.
  • READ_COMMITED : 커밋된 데이터만 읽도록 해 dirty read는 방지하지만, 같은 트랜잭션 내에서 동일한 데이터를 여러 번 읽을 때 값이 달라질 수 있는 비반복적 읽기 현상 발생 가능. 
    • * 비반복적 읽기 = 하나의 트랜잭션이 읽은 로우를 다른 트랜잭션이 수정할 수 있어 처음 트랜잭션이 같은 로우를  읽을 때 다른 내용으로 발견
  • SERIALIZABLE : 가장 높은 격리 수준으로, 모든 트랜잭션을 순차적으로 실행하는 것과 유사. dirty read, 비반복적 읽기, phantom read 등 모든 문제를 방지하지만, 동시성 및 성능 측면에서 부담
    • 여러 트랜잭션이 동시에 같은 데이틀의 정보를 액세스할 수 없어 가장 안전하지만, 성능이 떨어짐.

결론

스프링의 트랜잭션 내부 동작 원리

1. AOP 기반의 프록시 생성

2. 트랜잭션매니저를 통한 트랜잭션 제어

3. 동기화 메커니즘을 활옹해 애플리케이션 데이터 일관성 보장

 

@Transactional 어노테이션을 활용해서 선언적 트랜잭션 관리를 하고 간결하고 유지보수성을 높일 수 있다!

반응형