개발자의 오르막
트랜잭션 서비스 추상화 본문
# 토비의 스프링 5장 (서비스 추상화)
# 트랜잭션 서비스 추상화
기능을 만들 때 트랜잭션에 대한 고려가 이루어져야 한다.
사용자가 서비스를 이용 중 오류 발생 시 트랜잭션 처리에 대한 기능이 구현되지 않는다면, 프로젝트가 완성됬을 당시 트랜잭션 처리 구현을 위해 돌아가야 하는 불상사가 발생한다.
이에 단위테스트를 통해 우리의 기능에 트랜잭션을 반영하고, 트랜잭션이 잘 적용되는지의 Test코드를 만들어 계속해서 점검하며 개발을 진행해야한다.
# 트랜잭션의 경계 : 애플리케이션 내에서 트랜잭션이 시작되고 끝나는 위치
모든 트랜잭션은 시작하는 지점과 끝나는 지점이 있다. 모든 작업을 무효화 하는 롤백과 모든 작업을 다 확정하는 커밋이 있다.
JDBC의 트랜잭션은 하나의 Connection을 가져와 사용하다가 닫는 사이에서 일어난다. 트랜잭션의 시작과 종료는 Connection 오브젝트를 통해 이루어지기 때문이다. JDBC의 기본 설정은 DB 작업을 수행한 직후에 자동으로 커밋이 되도록 되어 있다. 작업마다 커밋해서 트랜잭션을 종료시켜 끝내버리므로 여러 개의 DB자겁을 모아서 트랜잭션을 만드는 기능이 꺼져 있는 것이다. 따라서 트랜잭션 경계를 우리가 설정해주기 위해서는 이 기본설정인 setAutoCommit를 false로 바꿔주어야 한다.
트랜잭션의 경계설정은 코드 상으로 setAutoCommit(false)로 트랜잭션의 시작을 선언하고, commit(), rollback()으로 트랜잭션을 종료하는 작업으로 이루어진다. 트랜잭션의 경계설정을 자유롭게 다룰 수 있어야 commit과 rollback 처리를 상황에 맞게 구현할 수 있다.
트랜잭션의 경계설정에 앞서 우리는 각 메소드에서 Connection 오브젝트를 구분해줘야 한다. 각 메소드에서 새로운 Connection 오브젝트를 만들어버리면, 별개의 트랜잭션이 추가로 만들어지기 때문이다. 따라서 트랜잭션을 담고 있는 Connection 오브젝트를 각 메소드에서 구분하고, 그릇에 담아 이 오브젝트를 활용하는 구조가 필요하다.
# 트랜잭션의 동기화 : Connection 오브젝트의 동기화
Spring에서 이 구체적인 방법으로 트랜잭션 동기화(Transcation synchronization) 방식을 제안한다. 트랜잭션 동기화란 트랜잭션을 시작하기 위해 만든 Connection 오브젝트를 특별한 저장소에 보관해두고, 이후에 호출되는 DAO의 메소드에서 저장된 Connection을 가져다가 사용하게 하는 것이다.
1) 해당 메소드에서 Connection을 생성
2) 이를 트랜잭션 동기화 저장소에 저장, conn.setAutoCommit(false)를 호출해 트랜잭션 시작
3) DAO 작업에 관한 기능 실행, 이 때 2)에 저장된 Connection 오브젝트 활용하여 PreparedStatement 만들어 SQL 실행
4) DAO 작업에 관한 각각의 SQL을 실행 후, 모든 작업이 정상적으로 끝났으면 commit()을 호출해서
트랜잭션 완료, 예외상황이 발생하면 rollback()을 호출하여 트랜잭션 종료
5) 2)에 저장된 Connection 오브젝트를 제거한다.
'SpringFrameWork > Spring' 카테고리의 다른 글
Spring framework - Maven (0) | 2019.08.27 |
---|---|
Spring Frame Work 개발환경 구축 (0) | 2019.08.14 |
가짜객체 (0) | 2019.07.17 |
의존성 주입 (0) | 2019.07.12 |
테스트 대역 (0) | 2019.07.10 |