1. 개요
MVC Pattern에서 트랜잭션 구현은 크게 두가지 틀로 구성하면 확장성이나 유연한 대응이 좋아진 경험이 있는데, 이에 대해 기록한다.
2. 확장성을 고려한 트랜잭션 구현 방안
유의해야할 두가지 항목, 첫번째는 유효성 검증과 두번째는 예외 상황에 대한 처리이다.
- 트랜잭션 처리를 진행할 경우 이론적으로 int type을 return하지만, 실제 상황에서는 1이 아닌 상황은 의미가 없다, 즉 1을 제외한 모든 상황은 정상처리 상황이 아닌 예외 상황이다.
- 단일트랜잭션 처리는, 하나의 트랜잭션 안에, Transactional AOP를 활용하는 등 데이터 정합성을 고려한 처리를 진행한다. 기본적인 처리 로직을 구성하는데,
Global Exception 처리(AOP를 활용하여)를 통해 rollback 상황이 일어났을때 어떻게 후속 동작을 진행할 것인지 정할 수 있다. 이때 return true/false 작업을 통해 트랜잭션 예외 상황을 구체적으로 분기처리 해줄 수 있다.
- Service의 return 값을 int로 하여, 정상처리 시 1을 반환하고 유효성 검증을 통과하지 못하였을 경우 트랜잭션을 진행하지 않고 다른 정수값을 반환한다. 이때 정수값은 유효성 검증 실패 경우에 따라 다양하게 진행될 수 있으며, 컨트롤러에서 이 정수값을 전달받아 최종적인 후속처리를 진행한다.
간단히 말하면
- Service에서 유효성 검증은 return int, 예외/rollback 상황은 return true
- Controller에서 유효성 검증 결과를 받아 후속 처리, 예외/rollback 상황은 Global Exception에서 결과를 받아 후속 처리.
이렇게 큰 틀을 구성할 경우, 보통의 경우 로직에 대한 후속처리나 유효성 검증이 추가되는 경우가 많으므로 어느 정도는 확장성있게 트랜잭션을 처리할 수 있게 되었다.
3. 참고자료
나와 비슷한 고민을 한 경우가 있었다 - https://okky.kr/questions/478683