-
Notifications
You must be signed in to change notification settings - Fork 0
[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문 필요 없음