새소식

인기 검색어

Programming/Spring

[Spring] Transactional

  • -
서론

 

@Transactional 어노테이션을 공부하다보니 트랜잭션을 이해해야 하고 또 이를 공부하다보니 변경감지 라는 내용까지 학습하게 되었다.

오늘은 그 중 @Transactional 어노테이션에 대해서 알아보자.

우선 학습할 것은 트랜잭션이다.

 

 

트랜잭션(Transaction)이란?

 

데이터베이스 트랜잭션은 데이터베이스 관리 시스템 또는 유사한 시스템에서 더 이상 쪼개질 수 없는 최소 단위의 연산이다.

 

 

트랜잭션의 4가지 특성(ACID)

 

  • 원자성(Automicity)
    트랜잭션에서 정의된 연산들은 모두 성공적으로 실행되던지 아니면 전혀 실행되지 않은 상태로 남아 있어야 한다.
    (All or Nothing)

  • 일관성(Consistency)
    트랜잭션이 실행 되기 전의 데이터베이스 내용이 잘못 되어 있지 않다면 트랜잭션이 실행된 이후에도 데이터베이스의 내용에 잘못이 있으면 안된다.

  • 고립성(Isolation)
    트랜잭션이 실행되는 도중에 다른 트랜잭션의 영향을 받아 잘못된 결과를 만들어서는 안된다.

  • 지속성 또는 영속성(Durability)
    트랜잭션이 성공적으로 수행되면 그 트랜잭션이 갱신한 데이터베이스의 내용은 영구적으로 저장된다.

 

데이터 생성 및 수정, 삭제 등의 DB 내 데이터 수정이 일어날 때,  트랜잭션이 발생하고 모든 작업이 끝난 후, 트랜잭션이 커밋(Commit)된다. 이때, 트랜잭션의 4가지 특성은 지켜진다.

 

Spring에서도 DB 데이터를 다루는 경우가 빈번하고 이때마다 DB의 올바른 관리를 위해 트랜잭션을 발생해 DB 데이터 수정을 해야 한다. 이를 가능하도록 하는 방법 중 하나가 @Transactional 어노테이션이다.

 

@Transactional

 

@Transactional 어노테이션은 해당 어노테이션을 사용한 메소드에 트랜잭션을 적용시킨다. 

아래 코드를 보면서 조금 더 쉽게 이해해보자.

 

 

DB 테이블의 정보를 수정하기 위해 update하는 로직을 개발하고자 한다면 다음과 같은 논리적 절차를 가지게 될 것이다.

  1. 변경하고자 하는 데이터의 id(주로 PK)를 통한 조회
  2. 조회한 데이터에 수정할 내용들로 교체
  3. update 처리

하지만 이런 절차를 통해 update를 수행하면 오류가 발생했을 시, 롤백에 대해 처리할 수 없다. 이런 문제를 해결하기 위해 @Transactional 어노테이션을 사용한다. 해당 어노테이션을 사용 시, 위 절차는 다음과 같이 변경된다.

 

  1. 트랜잭션 시작
  2. 변경하고자 하는 데이터의 id(주로 PK)를 통한 조회
  3. 조회한 데이터에 수정할 내용들로 교체
  4. update 처리
  5. 트랜잭션 커밋

이를 통해. 작업 도중 문제 발생 시, 롤백을 통해 진행했던 내용들도 이전 상태로 복구시킨다.

 

@Transactional의 작동 원리와 흐름

 

트랜잭션이 무엇이고 @Transactional 어노테이션을 사용했을 시, 논리적 절차가 어떻게 변경되는지 확인해보았다. 그렇다면 우리가 작성한 코드에는 어떠한 변화가 생길까?

 

@Transactional이 클래스 내 메스드에 붙을 때, Spring은 해당 메서드에 대한 프록시를 만든다.

여기서 프록시는 디자인 패턴 중 하나로, 어떤 코드를 감싸면서 추가적인 연산을 수행하도록 강제하는 방법이다.

 

트랜잭션의 경우, 트랜잭션의 시작과 연산 종료시의 커밋 과정이 필요하므로, 프록시를 생성해 해당 메서드의 앞뒤에 트랜잭션의 시작과 끝을 추가하는 것이다.

이러한 로직은 AOP에 바탕을 두고 설계되었기 떄문에, 이후 설명에서 해당 프록시는 트랜잭션 AOP로 명칭한다.

 

또한, 스프링 컨테이너는 트랜잭션 범위의 영속성 컨텍스트 전략을 기본으로 사용한다.

서비스 클래스에서 @Transactional을 사용할 경우, 해당 코드 내의 메서드를 호출할 때 영속성 컨텍스트가 생긴다는 뜻이다. 영속성 컨텍스트는 트랜잭션 AOP가 트랜잭션을 시작할 때 생겨나고, 메서드가 종료되어 트랜잭션 AOP가 트랜잭션을 커밋할 경우 영속성 컨텍스트가 flush되면서 해당 내용이 반영된다. 이후 영속성 컨텍스트 역시 종료된다.

출처 : @Transactional 어노테이션의 이해 (tistory.com)

이러한 방식으로 영속성 컨텍스트를 관리해 주기 때문에, @Transactional을 쓸 경우 트랜잭션의 원칙을 정확히 지킬 수 있다.

또한, 같은 EntityManager를 쓰더라도, 트랜잭션이 다르면 다른 영속성 컨텍스트를 사용한다는 것도 알아두자.

 

 

@Transactional 사용시 주의해야할 점

 

스프링이 만들어주는 프록시는 동적으로 생성되며, 들어오는 외부 메소드 호출은 프록시를 통해 차단된다.

하지만, 프록시 내 실행되는 코드에서 자체적으로 다른 메소드를 호출하는 경우, 해당 메소드에는 트랜잭션이 적용되지 않을 수도 있다.

 

이에 대한 자세한 사항은 아래 글을 참고하자.

[Spring] @Transactional 사용시 주의해야할 점 :: 개발자로 홀로 서기 (tistory.com)

 

[Spring] @Transactional 사용시 주의해야할 점

Spring @Transactional 주의점 안녕하세요. 오늘은 Spring 의 @Transactional 어노테이션을 사용할 때, 주의점에 대해 포스팅합니다. Spring 에서 JPA 기술을 쓸 때 빼놓을 수 없는 기능중 하나는 @Transac

mommoo.tistory.com

 

'Programming > Spring' 카테고리의 다른 글

[Spring] Annotation (2)  (1) 2022.12.08
[Spring] Annotation (1) (Lombok, JPA)  (0) 2022.12.08
[Spring] Spring Framework란?  (0) 2022.12.08
[Spring] Controller Service Repository Annotation  (0) 2022.12.01
[Spring] 다양한 Request 방식  (0) 2022.12.01
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.