데이터베이스 연결과 트랜잭션 관리
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 지원
댓글