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
'부트캠프' 카테고리의 다른 글
Spring MVC - Testing part 2 (0) | 2023.03.08 |
---|---|
Spring MVC - Testing part 1 (0) | 2023.03.06 |
Spring MVC - JPA 기반 데이터 액세스 계층 part 2 (0) | 2023.03.01 |
HTTP 헤더(Header) (1) | 2023.02.24 |
Spring MVC - JPA 기반 데이터 액세스 계층 part 1 (0) | 2023.02.23 |