Spring

DB / 스프링과 문제 해결 - Transaction

Dear-J 2025. 4. 22. 22:59

트랙잭션 문제

JDBC 구현 기술이 서비스 계층에 누수되는 문제

>> 구현 기술을 변경해도 서비스 계층 코드는 최대한 유지할 수 있어야 함(변화에 대응)

 

트랜잭션 동기화 문제

>> 같은 트랜잭션을 유지하기 위해 커넥션을 파라미터로 넘겨야 함

>> 똑같은 기능도 트랜잭션용 기능과 트랜잭션을 유지하지 않아도 되는 기능으로 분리해야 함

 

트랜잭션 적용 반복 문제

>> try, catch, finally

 

예외 누수

데이터 접근 계층의 JDBC 구현 기술 예외가 서비스 계층으로 전파되는 문제

>> SQLException은 JDBC 전용 기술, 향후 데이터 접근 기술이 바뀌면 서비스 코드 수정 필요

 

JDBC 반복 문제

유사한 코드의 반복 문제

>> try, catch, finally

>> 커넥션 열고  PreparedStatement 사용하고 결과 매핑하고 실행하고 커넥션과 리소스 정리

 

트랜잭션 추상화

서비스가 특정 트랜잭션 기술에 직접 의존하는 것이 아닌 추상화된 인터페이스에 의존

>> 원하는 구현체를 DI를 통해 주입

>> OCP 원칙

 

트랜잭션 동기화

 

트랜잭션 동기화 매니저가 ThreadLocal을 사용해서 커넥션을 동기화 해줌

>> 이전처럼 파라미터로 커넥션을 전달하지 않아도 됨

 

동작 방식

1. 트랜잭션 매니저는 데이터소스를 통해 커넥션을 만들고 트랜잭션 시작

2. 트랜잭션이 시작된 커넥션을 트랜잭션 동기화 매니저에 보관

3. 리포지토리는 매니저에 보관된 커넥션 꺼내 사용

4. 트랜잭션이 종료되면 트랜잭션 매니저는 동기화 매니저에 보관된 커넥션을 통해 트랜잭션을 종료하고 커넥션 닫음

 

트랜잭션 템플릿

트랜잭션을 시작하고 비즈닉스 로직을 실행하고 성공하면 커밋하고 예외시 롤백이 코드상 반복

>> 템플릿 콜백 패턴 사용으로 해결

 

트랜잭션 템플릿을 사용해서 트랜잭션을 시작하고 커밋하거나 롤백하는 코드 모두 제거

>> 비즈니스 로직이 정상 수행되면 커밋

>> 언체크 예외가 발생하면 롤백, 그 외의 경우 커밋

 

트랜잭션 AOP

트랜잭션 프록시가 트랜잭션 처리 로직을 전부 가져감

>> 트랜잭션 시작한 후 실제 서비스 대신 호출

>> 서비스 계층에 순수 비즈니스 로직만 남김

 

선언적 트랜잭션 관리(Declarative Transaction Management)

@Transaction 애노테이션 하나만 선언해 트랜잭션을 적용하는 것

>> 프로그래밍 방식보다 간편하고 실용적이라 실무에서는 대부분 선언적 사용

 

프로그래밍 방식 트랜잭션 관리(Programmatic Transaction Management)

트랜잭션 매니저 또는 템플릿 등을 사용해 트랜잭션 관련 코드를 직접 작성하는 것

>> 스프링 컨테이너나 AOP 기술 없이 간단히 사용 가능, 테스트 시 가끔 사용

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

출처 : 김영한, 스프링 DB 1편 - 데이터 접근 핵심 원리

 

 

 

 

 

'Spring' 카테고리의 다른 글

DB / 스프링과 문제 해결 - 예외 처리, 반복  (0) 2025.04.24
DB / 자바 예외  (0) 2025.04.23
DB / Transaction  (0) 2025.04.21
DB / Connection Pool, DataSource  (0) 2025.04.20
DB / JDBC  (0) 2025.04.19