부트캠프

Spring MVC - 트랜잭션

hunm719 2023. 3. 3. 20:35
1.트랜잭션(Transaction)

 -여러 개의 작업들을 하나의 그룹으로 묶어서 처리하는 처리 단위
 -All or Nothing(트랜잭션의 처리방식)
  ● 물리적으로는 여러 개의 작업이지만 논리적으로는 마치 하나의 작업으로 인식해서 전부 성공하든가 전부 실패하든가(All or Nothing)의 둘 중 하나로만 처리되어야 트랜잭션의 의미를 가짐
   애플리케이션에서 사용하는 데이터의 무결성을 보장하는 핵심적인 역할


1-1.ACID 원칙
 -트랜잭션의 특징 4가지 ACID
   원자성(Atomicity)
   ○ 작업을 더 이상 쪼갤 수 없음을 의미
    논리적으로 하나의 작업으로 인식해서 둘 다 성공하든가 둘 다 실패하든가(All or Nothing) 중에서 하나로만 처리되는 것이 보장되어야 함

   일관성(Consistency)
    트랜잭션이 에러없이 성공적으로 종료될 경우, 비즈니스 로직에서 의도하는대로 일관성있게 저장되거나 변경되는 것을 의미

   격리성(Isolation)
    여러 개의 트랜잭션이 실행될 경우 각각 독립적으로 실행이 되어야 함을 의미
    성능 향상을 목적으로 한 개 이상의 트랜잭션을 번갈아가면서 처리할 수 있는데, 이 경우 각 트랜잭션이 다른 트랜잭션에 영향을 주지 않고 독립적으로 실행이 되어야 함

  지속성(Durability)
    트랜잭션이 완료되면 그 결과는 지속되어야 한다는 의미


1-2.트랜잭션 커밋(commit)과 롤백(rollback)
 -데이터베이스에서 사용되는 명령어
  ● 커밋(commit)
   ○ 모든 작업을 최종적으로 데이터베이스에 반영하는 명령어
   ○ commit 명령을 수행하면 변경된 내용이 데이터베이스에 영구적으로 저장되고, 하나의 트랜젝션 과정은 종료됨
   ○ commit 명령을 수행하지 않으면 작업의 결과가 데이터베이스에 최종적으로 반영되지 않음

  ● 롤백(rollback)
   ○ 작업 중 문제가 발생했을 때, 트랜잭션 내에서 수행된 작업들을 취소함
   ○ 트랜잭션 시작 이전의 상태로 되돌아감


2.Spring Framework에서의 트랜잭션 처리


2-1.선언형 방식의 트랜잭션

 -애너테이션 방식(트랜잭션이 필요한 영역에 @Transactional 애너테이션을 추가함)
  ● 클래스 레벨에만 @Transactional 이 적용된 경우
   클래스 레벨의 @Transactional 애너테이션이 메서드에 일괄 적용

  ● 클래스 레벨과 메서드 레벨에 함께 적용된 경우
   ○ 메서드 레벨의 @Transactional 애너테이션이 적용
   ○ 만약 메서드 레벨에 @Transactional 애너테이션이 적용되지 않았을 경우, 클래스 레벨의 @Transactional 애너테이션이 적용


 -여러 작업이 하나의 트랜잭션으로 묶이는 경우
  ● 트랜잭션 전파(Transaction Propagation)
   (1)Propagation.REQUIRED : 진행 중인 트랜잭션이 없으면 새로 시작하고, 진행 중인 트랜잭션이 있으면 해당 트랜잭션에 참여
   (2)Propagation.REQUIRES_NEW : 이미 진행중인 트랜잭션과 무관하게 새로운 트랜잭션이 시작    
   (3)Propagation.MANDATORY : 진행 중인 트랜잭션이 없으면 새로운 트랜잭션이 시작되는 반면, 진행 중인 트랜잭션이 없으면 예외를 발생시킴
   (4)Propagation.NOT_SUPPORTED : 진행 중인 트랜잭션이 있으면 메서드 실행이 종료될 때 까지 진행중인 트랜잭션은 중지되며, 메서드 실행이 종료되면 트랜잭션을 계속 진행
   (5)Propagation.NEVER : 트랜잭션을 필요로 하지 않음을 의미하며, 진행 중인 트랜잭션이 존재할 경우에는 예외를 발생

  ● 트랜잭션 격리 레벨(Isolation Level)
   (1)Isolation.DEFAULT : 데이터베이스에서 제공하는 기본 값
   (2)Isolation.READ_UNCOMMITTED : 다른 트랜잭션에서 커밋하지 않은 데이터를 읽는 것을 허용
   (3)Isolation.READ_COMMITTED : 다른 트랜잭션에 의해 커밋된 데이터를 읽는 것을 허용
   (4)Isolation.REPEATABLE_READ : 트랜잭션 내에서 한 번 조회한 데이터를 반복해서 조회해도 같은 데이터가 조회되도록 함
   (5)Isolation.SERIALIZABLE : 동일한 데이터에 대해서 동시에 두 개 이상의 트랜잭션이 수행되지 못하도록 함


 +체크 예외(checked exeption)는 @Transactional 애너테이션만 추가해서는 rollback이 되지 않으며, @Transactional(rollbackFor = {SQLException.class, DataFormatException.class})와 같이 해당 체크 예외를 직접 지정해주거나 언체크 예외(unchecked exception)로 감싸야 rollback 기능을 적용할 수 있음

2-2.AOP방식의 트랜잭션
 (1)AOP 방식으로 트랜잭션을 적용하기 위한 Configuration 클래스 정의
 (2)TransactionManager DI
 (3)트랜잭션 어드바이스용 TransactionInterceptor 빈 등록
 (4)Advisor 빈 등록


2-3.@Transactional 어노테이션을 사용하지 않는 것을 권장하는 경우
 -Spring Framework에서는 Spring Boot를 사용한다면 대부분의 설정을 자동으로 처리해주기 때문에 별도로 설정할 필요가 없으며, @Transactional 어노테이션은 가장 흔한 트랜잭션 적용 방법임
 -하지만 아래와 같은 이유로 일부 개발자들은 @Transactional 어노테이션을 사용하지 않는 것을 권장함
  ● 예외 처리의 한계 : 메서드 내에서 여러 개의 예외가 발생하는 경우, 각 예외를 개별적으로 처리해줘야함
  ● 커밋 단위의 제어가 어려움 : 메서드 내에서 여러 개의 데이터베이스 작업이 수행되더라도 모두 하나의 트랜잭션으로 처리됨
  ● 유연성의 한계 : 특정 상황에서는 롤백 처리를 하지 않거나, 커밋 단위를 조정해야 할 때는 @Transactional 어노테이션을 사용하기 어려움

 -따라서 @Transactional 어노테이션을 사용하지 않고, 프로그래밍 방식으로 트랜잭션을 제어하는 것이 더욱 안정적임
 -이를 위해 Spring Framework에서는 TransactionTemplate 클래스를 제공하고 있고, 이 클래스를 사용하면 프로그래밍 방식으로 트랜잭션을 제어할 수 있으며, 커밋 단위나 롤백 처리 등을 세밀하게 조정할 수 있음

 

 

 

 

-내용 출처 : code states