본문 바로가기
DB

트랜잭션 동작 방식과 스프링의 트랜잭션 동작 방식

by 개발자 포비 2024. 12. 6.

데이터베이스 연결과 트랜잭션 관리

1. DB 드라이버

  • 애플리케이션과 데이터베이스 간의 통신을 담당
  • JDBC 드라이버를 통해 DB와 커넥션을 맺고 애플리케이션에 반환

2. 커넥션 풀 (Connection Pool)

  • 성능 향상을 위해 커넥션을 미리 생성하고 관리
  • HikariCP와 같은 커넥션 풀 라이브러리가 대표적
  • 장점:
    • 커넥션 재사용으로 리소스 절약
    • 설정과 사용의 분리로 관리 용이
    • 동시성 처리를 위한 별도 스레드 관리

3. 트랜잭션 (Transaction)

3.1 기본 개념

  • 데이터베이스의 데이터 정합성을 보장하는 작업 단위
  • ACID (원자성, 일관성, 고립성, 지속성) 준수 필요
  • 기본적으로 autocommit 모드로 동작

3.2 트랜잭션 격리와 락

  • 동시성 제어를 위한 락(Lock) 메커니즘 제공
  • SELECT FOR UPDATE 등으로 명시적 락 획득 가능
  • 트랜잭션 격리 수준에 따라 동시성과 데이터 정합성 조절

3.3 트랜잭션 관리의 문제점

  • 서비스 계층에서의 트랜잭션 시작 필요
  • 문제점:
    • 데이터 접근 계층 종속성
    • 예외 처리의 어려움
    • 반복적인 코드 발생

3.4 스프링의 트랜잭션 추상화

  • 트랜잭션 인터페이스를 통한 기술 독립성 확보
  • TransactionManager를 통한 통합 관리
  • AOP를 활용한 선언적 트랜잭션 처리
  • 자동 설정을 통한 편리한 사용
[클라이언트 계층]
      │
      ▼ 1. 프록시 호출
[트랜잭션 처리 프록시]                 
      │                               [TransactionManager]
      │                                      │
      │         3. 트랜잭션 시작 ◄───ㅡ ─┘
      │                                      │  
      ▼ 2. 트랜잭션 획득                     │
[트랜잭션 매니저]  ─────────────ㅡ► 4. setAutoCommit(false)
      │                                      │
      │                                      ▼
      │                               [커넥션 풀(HikariCP)]
      │                                      │
      ▼ 5. 실제 서비스 호출                  │
[비즈니스 로직 계층] ◄────────ㅡㅡ ─┘
      │
      │ 6. SQL 수행 요청
      ▼
[데이터 접근 계층]
      │
      │ 7. 쿼리 실행
      ▼
[데이터베이스 계층]
      │
      │ 8. 트랜잭션 커밋/롤백
      ▼
[결과 반환]

추가 참고사항

  • 스프링 부트를 사용하면 대부분의 설정이 자동화됨
  • 트랜잭션 전파 속성을 통한 세밀한 제어 가능
  • @Transactional 애노테이션으로 손쉬운 트랜잭션 적용
  • 분산 트랜잭션 처리를 위한 JTA 지원

'DB' 카테고리의 다른 글

DB - B 트리를 사용하는 이유  (0) 2024.12.16
DB N-N관계 풀어내기 예제  (0) 2024.12.06
DB - 인덱스  (0) 2024.12.03
DB - MySQL 기본 문법 정리  (0) 2024.12.02
DB - 정규화  (0) 2024.11.28

댓글