52DAYS) [Spring MVC] 트랜잭션 - 트랜잭션 개요, Spring Framework에서의 트랜잭션 처리(선언형 방식)

nacSeo (낙서)·2022년 12월 30일
0

◉ 학습목표

1. 트랜잭션(Transaction)이 무엇인지 이해할 수 있다.
2. 트랜잭션(Transaction) 경계가 무엇인지 이해할 수 있다.
3. Spring에서 지원하는 트랜잭션 처리 방식 중 선언형 방식에 대해 이해할 수 있다.
  1. 트랜잭션 개요

⦿ 학습내용

☞ 트랜잭션 (Transaction)

✔︎ 여러 개의 작업들을 하나의 그룹으로 묶어서 처리하는 처리 단위

☞ ACID 원칙

✔︎ Atomicity (원자성)

  • 작업을 더 이상 쪼갤 수 없음을 의미
  • 논리적으로 하나의 작업 단위로 인식해 둘 다 성공하든 둘 다 실패하든 (All or Nothing) 둘 중 하나로 처리

✔︎ Consistency (일관성)

  • 트랜잭션이 에러없이 종료될 경우, 비즈니스 로직에서 의도한대로 일관성있게 저장되거나 변경되는 것

✔︎ Isolation (고립성)

  • 여러 개의 트랜잭션이 실행될 경우 각각 독립적으로 실행

✔︎ Durability (지속성)

  • 데이터베이스가 종료되어도 데이터는 물리적인 저장소에 저장되어 지속적으로 유지되어야 함

☞ 커밋 (Commit)

✔︎ 모든 작업을 최종적으로 데이터베이스에 반영하는 명령어
✔︎ 변경된 내용이 데이터베이스에 영구적으로 저장
✔︎ commit을 수행하지 않으면, 작업 결과가 데이터베이스에 최종적으로 반영 ❌
✔︎ commit을 수행하면, 하나의 트랜잭션 과정 종료

☞ 롤백 (Rollback)

✔︎ 작업 중 문제가 발생하였을 때, 트랜잭션 내에서 수행된 작업들을 취소
✔︎ 트랜잭션 시작 이전의 상태로 되돌아감

☞ JPA 기술을 사용한 데이터베이스 인터렉션

✔︎ JPA 기술을 사용한 데이터베이스 인터렉션은 내부적으로는 JDBC API를 통해 이루어짐

  1. Spring Framework에서의 트랜잭션 처리 - 선언형 방식

⦿ 학습내용

☞ 트랜잭션 설정

✔︎ Spring Boot에서 자동 설정
✔︎ Spring Boot를 사용하지 않을 경우, Spring Configuration 클래스 직접 추가

☞ 트랜잭션 구분

✔︎ 로컬 트랜잭션

  • 단일 데이터베이스에 대한 트랜잭션 적용 방식

✔︎ 분산 트랜잭션

  • 서로 다른 데이터 소스를 사용하는 한 개 이상의 데이터베이스를 하나의 트랜잭션으로 묶어서 처리

☞ Spring에서 사용되는 트랜잭션 방식

✔︎ 선언형 트랜잭션 방식
✔︎ 프로그래밍 코드 베이스 트랜잭션 방식

  • 트랜잭션은 핵심 로직이 아니라 부가 기능 → AOP 적용 대상 중 하나
  • 따라서, 애플리케이션 코드 내에서 프로그래밍 코드 베이스 방식은 적절 ❌

☞ 선언형 방식으로 트랜잭션 적용 방법

✔︎ 비즈니스 로직에 애너테이션을 추가하는 방식
✔︎ AOP 방식을 이용하여 비즈니스 로직에서 아예 트랜잭션 적용 코드 자체를 감추는 방식

☞ 애너테이션 방식

✔︎ 클래스 레벨에 @Transactional 적용
✔︎ 메서드 레벨에 @Transactional 적용

  • @Transactional(readOnly = true) : 읽기 전용 트랜잭션
    • flush 처리 ❌, 스냅샷 생성 ❌
    • 불필요한 동작을 줄임으로써, JPA가 자체적으로 성능 최적화 과정을 거치도록 하는 것이 좋음

✔︎ 클래스 레벨과 메서드 레벨의 트랜잭션 적용 순서

  • 클래스 레벨에만 @Transactional이 적용된 경우
    • 메서드에 일괄 적용
  • 클래스 레벨메서드 레벨에 함께 적용된 경우
    • 메서드 레벨에 @Transactional 적용 ❌ → 클래스 레벨의 @Transactional 적용

✔︎ 체크 예외 (checked exception)

  • @Transactional만 추가해서 rollback되지 않음
  • @Transactional(rollbackFor = {SQLException.class, DataFormatException.class})와 같이 해당 체크 예외 직접 지정
  • 또는 언체크 예외(unchecked exception)로 감싸야 rollback 가능

✔︎ 여러 작업이 하나의 트랜잭션으로 묶이는 경우

  • 트랜잭션 전파 (Transaction Propagation)
    • 트랜잭션 경계에서 진행 중인 트랜잭션이 존재하거나 존재하지 않을 때, 어떻게 동작할 것인지 결정하는 방식
    • @Transaction(propagation = ) 애트리뷰트 유형
      1) Propagation.REQUIRED
      - 일반적으로 가장 많이 사용되는 propagation 유형의 디폴트 값
      - 진행 중인 트랜잭션이 없으면 새로 시작, 있으면 해당 트랜잭션에 참여
      2) Propagation.REQUIRES_NEW
      - 이미 진행 중인 트랜잭션과 무관하게 새로운 트랜잭션이 시작
      - 기존 진행 중이던 트랜잭션은 새로 시작된 트랜잭션이 종료될 때까지 중지
      3) Propagation.MANDATORY
      - 진행 중인 트랜잭션이 없으면 예외 발생
      4) Propagation.NOT_SUPPORTED
      - 트랜잭션이 필요하지 않음을 의미
      - 진행 중인 트랜잭션이 있으면 메서드 실행이 종료될 때까지 트랜잭션 중지
      - 메서드 실행이 종료되면 트랜잭션 계속 진행
      5) Propagation.NEVER
      - 트랜잭션이 필요하지 않음을 의미
      - 진행 중인 트랜잭션이 있으면 예외 발생

※ 다양한 Propagation 유형을 지원하지만, 작업별로 트랜잭션을 새로 생성하거나 특정 작업에는 트랜잭션을 허용하지 않는 경우가 아니라면 @Transaction 애너테이션만 추가해도 무방

  • 트랜잭션 격리 레벨 (Isolation Level)
    • 격리성을 조정할 수 있는 옵션
    • @Transaction(isolation = ) 애트리뷰트 유형
      1) Isolation.DEFAULT
      - 데이터 베이스에서 제공하는 기본 값
      2) Isolation.READ_UNCOMMITED
      - 다른 트랜잭션에서 커밋하지 않은 데이터를 읽는 것을 허용
      3) Isolation.READ_COMMITED
      - 다른 트랜잭션에 의해 커밋된 데이터를 읽는 것을 허용
      4) Isolation.REPEATABLE_READ
      - 트랜잭션 내 한 번 조회한 데이터를 반복 조회해도 같은 데이터 조회
      5) Isolation.SERIALIZABLE
      - 동일한 데이터에 대해 동시에 두 개 이상의 트랜잭션이 수행되지 못하도록 함

☞ AOP 방식

✔︎ 적용 순서

  • AOP 방식으로 트랜잭션을 적용하기 위한 Configuration 클래스 정의
    • Config 클래스 만들어 @Configuration 애너테이션 추가
  • TransactionManager DI
    • 애플리케이션에 트랜잭션을 적용하기 위해 TranscationManager 객체를 DI 받음
  • 트랜잭션 어드바이스용 TransactionInterceptor Bean 등록
    • 대상 클래스 또는 인터페이스에 트랜잭션 경계를 설정하고 트랜잭션 적용 ⭕️
    • 트랜잭션 애트리뷰트 지정
      • 조회 메서드를 제외한 공통 트랜잭션 애트리뷰트
      • 조회 메서드에 적용하기 위한 트랜잭션 애트리뷰트
    • 트랜잭션을 적용할 메서드에 트랜잭션 애트리뷰트 매핑
    • TransactionInterceptor 객체 생성
  • Advisor Bean 등록
    • 포인트 컷 지정
      • 포인트컷 객체 생성 후, 포인트컷 표현식으로 타겟 클래스 지정
    • Advisor 객체 생성

◉ 느낀 점

☞ 트랜잭션은 앞서 접한 경험이 있어 ACID까지의 내용을 이해하는 데는 크게 어려움이 없었다. 그러나 Spring Framework에서의 트랜잭션 처리에 들어오고 나니 처음 보는 여러 메서드들이 많았고, 적용 구조를 이해하는 데에 어려움이 있었다. (특히, AOP 방식...) 그래도 애너테이션 방식이든, AOP 방식이든 직접 코드로 작성해보며 이해해나가려 노력했다.

오늘은 Spring에서의 트랜잭션 처리 방식 중 하나인 선언형 방식의 애너테이션 방식, AOP 방식에 대해 알아보았다. 다음 시간에 좀 더 보충해 내용을 공부하고 트랜잭션 적용 실습을 해보며 Spring 트랜잭션과 좀 더 친해져보도록 하겠다.

◉ 내일의 키워드

・ JTA를 이용한 분산 트랜잭션 적용
・ 트랜잭션 적용 실습
profile
백엔드 개발자 김창하입니다 🙇‍♂️

0개의 댓글