정합성을 보장 받는 방법
이미지Url을 DB에 저장하고 S3에 업로드 하는 과정을 어떻게 하면 동기화 할 수 있을까요??
제가 선택한 첫 방법은Transactional로 묶고 DB저장 -> S3업로드 순서로 진행하는 것입니다.
이렇게 하면 DB에 저장하는 로직이 실패하던 S3업로드 로직이 실패하던 롤백됩니다.
(반대의 경우라면 S3는 저장되었는데 DB저장에 실패해 롤백될 수 있음)
문제점
그러나 같은 트랜잭션 내에 묶어버리면 DB 커넥션을 오래 점유하면서 자원이 낭비가 될 수 있습니다.
-> S3의 문제로 인해 업로드가 지연되거나 용량이 너무 클 때 등 다양한 이유
트랜잭션 분리
위 방법에서 트랜잭션이 묶여있기 때문에 커넥션 점유 문제가 생겼으니 트랜잭션을 분리해봤지만 아래와 같은 문제점들이 발생했습니다.
DB저장 후 S3업로드를 수행했을 때 문제점
- S3업로드가 실패했을 때 DB를 수동으로 롤백해야함
- 이미지 파일 없이 조회가 가능한 문제가 발생할 수 있음(이미지가 올라가는 도중 상품은 등록됐을 경우)
S3업로드 후 DB저장을 수행했을 때 문제점
DB저장이 실패하면 쓰레기 파일이 남는다는 문제점이 존재합니다.
@TransactionalEventListener(phase = TransactionPhase.AFTER_ROLLBACK)
마지막으로 제가 선택한 방법입니다. S3업로드 후 DB에 저장하는 방법의 문제점인 S3에 남는 쓰레기 파일들을 정리해주는 방법입니다.
위 어노테이션은 트랜잭션 도중에 롤백이 되는 경우 동작하는 이벤트 입니다.