Spring MVC(트랜잭션/로컬:선언형 /AOP)

Rina's·2023년 6월 25일

코드스테이츠

목록 보기
51/96

🍉트랜잭션

트랜잭션
여러 명령 쿼리를 하나의 구룹으로 묶어놓은 작업 단위

🍋ACID원칙

데이터베이스 내 트랜잭션의 안정성을 보장할 수 있는 트랜잭션의 성질

Atomicity(원자성)
하나의 트랜젝션은 모든 작업이 일괄적으로 성공하거나 실패해서 예측가능 해야 한다
일부가 실패하면 그 작업은 실패한 것으로 본다

Consistency(일관성)
하나의 트랜젝션 전후에 일관성있게 변경되거나 저장, 유지되어야 한다

Isolation(격리성)
각각의 트랜젝션은 서로의 연산을 확인받거나 영향을 줄 수 없다

Durability(지속성)
하나의 성공된 트렌젝션에 대한 로그는 영구적으로 남는다

커밋(commit)
작업상태를 DB에 반영(저장)하는 명령어(내부적으로 flush)

롤백(rollback)
작업 취소, 트랜잭션 시작 전의 상태로 롤백

JPA의 데이터베이스 인터랙션은 내부적으로는 JDBC API를 사용한다
SpringDataJPA > JPA API > Hibernate > JDBC API > JDBC Driver > DATABASE

🍉선언형 트랜잭션

@Transactional 애너테이션을 사용해 적용한다
클래스레벨이나 메서드레벨에 적용할 수 있다
application.yml에 로그 레벨을 DEBUG로 설정하여 확인해 보자

@Transactional 적용 어플리케이션 실행

  1. Creating new transaction with name [...]
    대충 [...]라는 이름의 새로운 트랜잭션 생성했다는 뜻

  2. Committing JPA transaction on EntityManager
    대충 엔티티매니저가 트랜잭션을 승인(저장)했다는 뜻

  3. Not closing pre-bound JPA EntityManager
    대충 할당된 EntityManager 인스턴스가 closing 되지 않았다고 경고한다는 뜻
    ('pre-bound'는 스래드영역에 인스턴스가 할당되어 있는 것을 말함)

  4. Closing JPA EntityManagerin in OpenEntityManagerInViewInterceptor
    대충 EntityManager를 끝냈다는 뜻

exception발생으로 롤백하는 경우

  1. Initiating transaction rollback
  2. Rolling back JPA transaction on EntityManager
  3. Not closing pre-bound JPA EntityManager
    java.lang.RuntimeException: Rollback test
  4. Closing JPA EntityManager

@Transactional(readOnly = true)
읽기전용이 되어 영속성 컨텍스트에 flush하지 않는다
조회 메서드에 사용하면 불필요한 작업(스냅샷 생성 등)을 막아준다

클래스레벨에 적용시 모든 메서드에 트랜잭션이 일괄 적용된다
핸들러 메서드에 적용시 관련 서비스 메서드까지 같은 트랜잭션으로 묶이게 된다
-> 원자성을 고려하여 작업단위를 설정하자

🍋트랜잭션 전파

@Transactional(propagation = )
트랜잭션 애트리뷰트(default: REQUIRED)

Propagation.REQUIRED
진행중인 트랜잭션이 해당 트랜잭션에 합류, 없다면 새 트랜잭션을 생성
Propagation.REQUIRES_NEW
진행중인 트랜잭션과 상관없이 새로운 트랜잭션을 생성
Propagation.MANDATORY
진행 중인 트랜잭션이 없으면 예외를 발생
Propagation.NOT_SUPPORTED
해당 메서드 실행시 진행중인 트랜잭션을 일시정지
Propagation.NEVER
진행 중인 트랜잭션이 있으면 예외를 발생

🍋트랜잭션 격리 레벨

트랜잭션간의 격리성을 조정하는 애트리뷰트

Isolation.DEFAULT
기본 값
Isolation.READ_UNCOMMITTED
다른 트랜잭션에서 커밋하지 않은 데이터를 읽는 것을 허용
Isolation.READ_COMMITTED
다른 트랜잭션에 의해 커밋된 데이터를 읽는 것을 허용
Isolation.REPEATABLE_READ
트랜잭션 내에서 한 번 조회한 데이터를 반복해서 조회해도 같은 데이터가 조회되도록 함(조회로 인한 변경을 막음)
Isolation.SERIALIZABLE
동일한 데이터에 대해서 동시에 두 개 이상의 트랜잭션이 수행되지 못하도록 함

🍉AOP 방식의 트랜잭션

비즈니스 로직에 트랜잭션 적용 부분을 빼버리는 방식
트랜잭션 설정 클래스를 따로 생성하여 진행한다

  1. 클래스에@Configuration 설정
  2. TransactionManager 객체 DI
  3. 트랜잭션 어드바이스용 TransactionInterceptor 빈 등록
    (애트리뷰트 설정, 적용할 메서드에 트랜잭션 애트리뷰트 매핑,
    TransactionInterceptor 객체 생성)
  4. Advisor 빈 등록(포인트 컷 지정, Advisor 객체 생성)
    포인트컷을 트랜잭션을 적용하는 메서드 또는 클래스에 설정한다

🍉분산 트랜잭션

복수의 데이터베이스를 하나의 트랜잭션으로 묶어 처리

profile
갭린이 리나

0개의 댓글