유저 서버에서 유저 삭제 API 실행 → 메서드 내에서 동기형식으로 주문, 배송, 허브 순으로 요청을 보내게 됐을 때 주문, 배송까지는 완벽하게 통신을 끝냈지만 허브에서 예외가 발생했을 경우. 이 경우 주문과 배송은 삭제 처리가 됐지만 유저와 허브의 경우 삭제 처리가 안된 경우가 발생하게 될겁니다. 이렇게 되면 데이터 정합성이 어긋나게 되는데 이 문제를 해결하기 위해 어떻게 보상 로직을 구현할 것인지..?
해결과정
가장 먼저 떠오른 방법은 SAGA 패턴을 적용하여 보상 트랜잭션을 구성하는 것이었습니다. FeignClient로 요청을 보내는 것마다 예외를 따로 만들어, 해당 예외가 발생시 try-catch로 잡아내어 이전에 정상적으로 실행된 서버에 보상 요청을 보내는 생각을 해보았는데요, 이번 프로젝트에서는 따로 적용을 해보지 못하였습니다.
이벤트 리스너, 2PC 등과 같은 방법도 있으니 장단점을 살펴보고 다음 프로젝트 설계에 도입을 해봐야겠습니다.
결과
이런 생각을 해봤으니 다음 프로젝트 적용 시 고려를 미리 해볼 수 있지 않을까 생각합니다. 팀원들과 잘 소통하여 어떤 방식을 적용할지 의논을 해야겠네요
꺠달은 내용
모놀리식 구성에서는 하나의 트랜잭션 안에서 간단하게 rollback처리가 가능했습니다. 하지만 MSA 구성을 적용해 서비스를 만들고 나니 평소 @Transactional을 위에 아무생각 없이 붙이고 있던 것에 대해 고마움을 느끼게 되었습니다..ㅎㅎ 호출 실패시 마다 보상트랜잭션까지 모두 따로 만들어주어야 하는 문제도 있으니 익숙치 않은 저에겐 시간이 매우 부족하였습니다. 이번 프로젝트에는 보상 로직을 적용시키진 못했지만 다음 프로젝트에서는 보상 트랜잭션을 관리할 수 있는 메서드들까지 만들어서 데이터 정합성을 유지할 수 있도록 해보겠습니다!