Skip to content

[BE] 트랜잭션은 쿼리문만 다루지, 스토리지는 신경 쓰지 않아요

Kyungmi, Park edited this page Mar 16, 2025 · 5 revisions

이슈

배경

  • 클라이언트 측에서 게시글/타임라인/유저 정보 수정 시 변경된 내용만 파악하여 전달해주기에 에너지가 많이 든다고 말씀하심!
    • 따라서 update용 메서드는 부분만 수정하는 PATCH가 아니라, 전체 필드를 받아들이는 PUT으로 결정!
  • 이 때문에 크나큰 이슈가 발생하는데…

트랜잭션 적용

  • 예를 들어 타임라인 수정 작업에는
    • 실제 id에 해당하는 타임라인 유무 확인을 위한 SELECT 작업
    • 타임라인 UPDATE 작업
    • 게시글 썸네일 UPDATE 작업
  • 총 3가지 DB 작업이 필요하므로, 무결성 유지를 위해 트랜잭션이 필요함

그러나...

  • 당연히 오브젝트 스토리지에는 트랜잭션 적용 안 됨!
  • 만약 사진을 오브젝트에 스토리지에 저장하고, 새로운 이미지 경로로 타임라인을 update한 다음에, 게시글의 썸네일을 update 과정에서 에러가 난다면
    • 타임라인에서 경로가 udpate 됐던 쿼리문은 취소가 되지만
    • 오브젝트 스토리지에는 이미 기존 이미지가 삭제되고, 새로운 이미지가 업로드된 채로 복구되지 않음,,,^^;;

해결 방법

| 관련 PR: https://github.com/boostcampwm2023/iOS07-traveline/pull/392

try ~ catch문 도입 및 코드 실행 순서 조정으로 해결

  • 타임라인 생성 시

    • 스토리지에 이미지 A 저장 (저장 경로를 변수에 할당)
    • SQL문 처리
    • 만약 SQL문 처리 과정에서 에러가 발생하면, catch문에서 스토리지에서 이미지 A 삭제
  • 타임라인 수정 시

    • 상황: 기존 스토리지에 이미지 A 저장되어 있고, 변경하려는 이미지는 X
    • 로직
      • 스토리지에 이미지 X 저장 (저장 경로를 변수에 할당)
      • 모든 SQL문 처리
      • return 직전에 기존 이미지 A 삭제
      • 만약 SQL문 처리 과정에서 에러가 발생하면, catch문에서 스토리지에서 새로 저장한 이미지 X 삭제 (이미지 A는 그대로 존재함)
  • 타임라인 삭제 시 (코드 변화 없긴 합니다!)

    • SQL문 처리
    • return 직전에 스토리지에서 이미지 X 삭제
    • 만약 SQL문 처리 과정에서 에러가 발생하더라도, 아직 스토리지에서 이미지 X가 삭제되지 않았으므로 별도 try ~ catch문 필요 없음
Clone this wiki locally