반응형
Review 에서는 학습한 내용을 다시금 기록합니다.
Unit Review는 학습한 내용 중 기존에 알고 있었지만 정확하게 이해하지 못하던 정보와 새롭게 알게된 정보를 기록합니다. 추가적인 설명을 요하는 부분은 댓글로 남겨주세요.
Section Review는 전반적인 Section을 되돌아보고 학습했던 시간과 과정, 내용을 총괄하여 기록합니다.
Spring Framework에서의 트랜잭션 처리
- 트랜잭션 처리는 많은 비즈니스 로직에서 공통적으로 필요한 작업이다.
- 즉, AOP로 처리할 수 있다.
* 선언형 방식의 트랜잭션 적용
- 애너테이션 방식의 트랜잭션 적용
- 트랜잭션을 적용하는 가장 간단한 방식이다.
- 필요한 영역에 @Transactional 애너테이션을 붙여준다.
- 클래스에 애너테이션을 붙이면 클래스에 작성된 모든 메서드에 트랜잭션이 적용된다.
- 트랜잭션 처리가 필요한 메서드에만 애너테이션을 붙여 사용할 수도 있다.
- @Transactional에는 추가로 readOnly를 설정할 수 있다. @Transactional(readOnly = true)
- 별도의 변경이 없거나 영속성 컨텍스트를 flush할 필요가 없는 조회 등의 메서드는 해당 설정을 적용해 불필요한 추가 기능을 줄일 수 있다.
- 클래스와 메서드에 동시에 @Transactional이 붙어있다면, 메서드 레벨의 애너테이션이 먼저 적용된다.
- 여러 작업이 하나의 트랜잭션으로 묶이는 경우에는 트랜잭션 전파를 사용한다.
- 메서드마다 각각의 트랜잭션이 존재하면 하나의 연결된 작업에 여러 개의 트랜잭션이 발생해 트랜잭션을 적용했을 때 얻을 수 있는 효과를 얻지 못한다.
- 이 때는, 부가적으로 수행되는 작업에 Propagation(트랜잭션 전파) 설정을 한다. @Transactional(propagation = Propagation.REQUIRED)
- Propagation이 설정된 트랜잭션은 진행중인 트랙잭션이 있다면 해당 트랜잭션을 사용하고 그렇지 않으면 새 트랜잭션을 생성한다.
- 트랜잭션 전파
- 트랜잭션 전파는 트랜잭션의 경계에서 진행 중인 트랜잭션이 존재할 때 또는 존재하지 않을 때, 어떻게 동작할 것인지 결정하는 방식을 의미한다.
- Propagation.REQUIRED : 위에서 살펴본 설정값이다. propagation유형의 디폴트 값이다.
- Propagation.REQUIRES_NEW : 이미 진행 중인 트랜잭션과 무관하게 새로운 트랜잭션이 시작된다. 기존 트랜잭션은 새로운 트랜잭션이 종료될 때까지 중지한다.
- Propagation.MANDATORY : 진행 중인 트랜잭션이 없으면 예외를 발생시킨다.
- Propagation.NOT_SUPPORTED : 트랜잭션을 필요로 하지 않음을 의미한다. 진행 중인 트랜잭션이 있으면 해당 전파가 설정된 메서드의 실행이 종료될 때까지 중지된다. 메서드가 종료되면 트랜잭션을 다시 진행한다.
- Propagation.NEVER : 진행 중인 트랜잭션이 존재하면 예외를 발생시킨다.
- 트랜잭션 격리 레벨
- 트랜잭션은 다른 트랜잭션에 영향을 주지 않고 독립적이어야 하는 격리성이 보장되어야 한다. 이는 Isolation 설정을 통해 처리할 수 있다.
- Isolation.DEFAULT : DB에서 제공하는 기본 값이다.
- Isolation.READ_UNCOMMITTED : 다른 트랜잭션에서 커밋하지 않은 데이터를 읽는 것을 허용한다..
- Isolation.READ_COMMITTED : 다른 트랜잭션에 의해 커밋된 데이터를 읽는 것을 허용한다.
- Isolation.REPEATABLE_READ : 트랜잭션 내에서 한 번 조회한 데이터를 반복해서 조회해도 같은 데이터가 되도록 조회한다.
- Isolation.SERIALIZABLE : 동일한 데이터에 대해서 동시에 두 개 이상의 트랜잭션이 수행되지 못하도록 한다.
- AOP 방식의 트랜잭션 적용
- 먼저 Configuration 클래스를 정의한다.
- 애플리케이션에 트랜잭션을 적용하기 위해서는 TransactionManager 객체가 필요하다. 이를 주입한다.
- 트랜잭션 어드바이스용 TransactionInterceptor 빈을 등록한다.
- 트랜잭션 애트리뷰트 소스를 생성한다.
- 트랜잭션 애트리뷰트를 지정한다. 트랜잭션 애트리뷰트는 메서드 이름에 따라 구분해서 적용 가능하기 떄문에 여러 트랜잭션 애트리뷰트를 생성하고 readOnly, propagation 등을 설정한다.
- 트랜잭션 애트리뷰트를 매핑한다. Map<String, TransactionAtttribute>로 설정한 맵에 key값으로는 메서드의 이름 패턴을 넣고, value로는 위에서 생성한 트랜잭션 애트리뷰트를 넣어준다.
- 이렇게 만들어진 맵을 트랜잭션 애트리뷰트 소스에 넘겨준다.
- TransactionInterceptor의 생성자 파라미터로 트랜잭션 매니저와 트랜잭션 애트리뷰트 소스를 넘겨준다.
- Advisor 빈을 등록한다.
* JTA를 이용한 분산 트랜잭션
- 지금까지 살펴본 내용은 단일 DB에 대한 트랜잭션 적용 방식인 로컬 트랜잭션이다.
- 때로는 여러 DB를 하나의 트랜잭션으로 묶어 처리해야 하는데 이를 분산 트랜잭션이라고 한다.
- 두 개의 DB에 분산 트랜잭션을 적용하기 위해선 두 DB 모두 아래의 설정을 마쳐야 한다.
- 해당 DB에 맞는 데이터소스를 생성한다.
- 각 데이터소스를 JPA의 EntityManager가 인식하도록 설정한다.
- JTA TransactionManager를 설정한다.
- JTA Platform을 설정한다.
반응형
'CodeStatesBootCamp > Review' 카테고리의 다른 글
Section 3 - Unit 7 : [Spring MVC] API 문서화 Review (0) | 2023.05.03 |
---|---|
Section 3 - Unit 7 : [Spring MVC] 테스팅 Review (0) | 2023.04.28 |
Section 3 - Unit 4 : [Spring MVC] JDBC 기반 데이터 액세스 계층 Review (0) | 2023.04.18 |
Section 3 - Unit 3 : [Spring MVC] 예외 처리 Review (0) | 2023.04.14 |
Section 3 - Unit 1 : [Spring MVC] API 계층 Review (0) | 2023.04.12 |
댓글