99클럽 14일차 TIL: Transaction

2024. 4. 17. 15:4499클럽/TIL

728x90
반응형

#1. 오늘의 학습 키워드

자바 스프링에서의 Transaction 에 대해서

  • JPA, myBatis 동시 사용을 위한 multitransaction 을 구현하기 전 Transaction 자체에 대해서 알아보고 넘어가자.
    • DB 수업 시간에 아주 중요한 파트를 차지했던 Transaction.
      • 이렇게 수업시간에 배웠던 내용들을 실제 코드에서 구현하는 것은 재밌는 일이다.
      • 트랜잭션의 구현은 복잡할 줄 알았는데, Spring에서는 굉장히 쉬운 방법을 제공하고 있었다.

#2. 공부한 내용

  • Transaction
    • 트랜잭션
    • 더 이상 쪼갤 수 없는 업무 처리의 최소 단위.
      • 예) A → B 에게 송금할 때: A는 돈을 지불하고 B는 돈을 받는 것. 이 작업들은 하나의 트랜잭션으로 쪼갤 수 없다.
    • 트랜잭션의 특징: ACID
      • Atomicity - 원자성
        • 트랜잭션 속 연산들이 DB에 전부 반영되거나, 전부 롤백되거나.
        • All-or-nothing
      • Consistency - 일관성
        • 트랜잭션 전후, DB의 상태는 여전히 유효해야된다.
        • 즉 트랜잭션 내 쿼리들은 DB의 제약과 규칙을 만족해야한다.
          • 데이터 무결성을 해치면 안 됨
      • Isolation - 독립성
        • 트랜잭션끼리의 독립성
        • 모든 트랜젹션은 다른 트랜잭션으로부터 고립되어야 한다.
      • Durability - 지속성
        • 트랜잭션이 일단 성공적으로 수행 되었다면, 해당 트랜잭션의 연산은 DB에 영구적으로 남아야한다.
        • 트랜잭션에 대한 로그가 남아야 한다는 의미.
  • @Transactional
    • Spring 에서 트랜잭션의 ACID 성질을 보장해주도록하는 어노테이션
    • 동작 과정
      • 스프링은 Proxy를 통해 트랜잭션 처리
        • 앱 실행 시 트랜잭션 전후 처리를 하는 Proxy를 동적 생성.
      • @Transactional 이 달려있는 메서드를 요청 시, 실제론 해당 메서드의 Proxy에게 요청이 됨. 그리고 그 Proxy 가 실제 메서드로 요청. 그 Proxy 내부에 트랜잭션 로직이 포함 되어있음
    • 사용법
      1. 메서드 위 어노테이션 추가 - 선언적 트랜잭션
        • 대부분 이 방법을 사용하고, 간단하다.
        • 아래 와 같은 옵션을 추가할 수 있음
          • readOnly
            • true 시 읽기 전용 트랜잭션으로 런타임 시 최적화 가능
          • timeout
            • 트랜잭션의 시간 제한을 timeout 값으로 설정 할 수 있음 ( 초단위)
          • isolation
            • 트랜잭션의 독립성 수준을 설정할 수 있음
          • rollbackFor
            • 트랜잭션의 롤백 조건을 설정할 수 있음
          • value
            • 선언을 한 트랜잭션 매니저를 설정할 수 있음
      2. PlatformTransactionManager 사용
        • PlatformTransactionManager
          • 스프링 트랜잭션 구조의 중심이 되는 인터페이스
          • 해당 인터페이스의 구현체
            • DataSourceTransactionManager
            • HibernatetTransactionManager
            • JPATransactionManager
            • etc..
        • 트랜잭션 매니저를 사용하면 트랜잭션의 시작과 끝을 개발자 직접 지정 가능

#3. 오늘의 회고

  • 트랜잭션은 회사에서 NoSql → SQL / Node → SpringBoot 로 리팩토링을 하였던 이유 중 하나다.
    • 그만큼 중요한 기능이다.
  • DB 작업의 일련의 연산을 하나의 단위로 묶어서 실행해서, 데이터의 무결성을 보장해준다.
    • 데이터의 가치가 높을 수록 트랜잭션의 중요성도 당연히 높아진다.
  • 이런 중요한 기능을 Spring Boot 에서는 한줄의 어노테이션으로, 메서드나 클래스에 트랜잭션을 쉽게 적용할 수 있도록 해준다.
    • 이렇게 트랜잭션을 쉽게 관리 할 수 있다는 점은 코드의 간결성과 가독성을 크게 향상시킨다.
728x90
반응형

'99클럽 > TIL' 카테고리의 다른 글

99클럽 16일차 TIL: Spring Webflux  (0) 2024.04.19
99클럽 15일차 TIL: N+1문제  (0) 2024.04.18
99클럽 13일차 TIL: Hikari CP  (0) 2024.04.16
99클럽 12일차 TIL: MVC  (0) 2024.04.15
99클럽 11일차 TIL: AOP  (0) 2024.04.14