๐ ๋ฒ๊ทธ ์ค๋ช
๋ฐฐํ/์ต์
์ด๋ฏธ์ง๋ฅผ ๋ก์ปฌ draft๋ก ์ฌ๋ ค๋๋ค๊ฐ ๋ฐํ(PUBLISHED) ์์ ์ S3๋ก ์น๊ฒฉํ๋ ๋ก์ง(LocalDraftFileStorageService.promoteLocalDraftToS3)์ด, DB ์ ์ฅ์ ๋ด๋นํ๋ @Transactional ๋ฉ์๋(BattleServiceImpl.createBattle/updateBattle) ์ค๊ฐ์์ ์ฆ์ S3 ์
๋ก๋ + ๋ก์ปฌ draft ์ญ์ ๊น์ง ๋๊ธฐ์ ์ผ๋ก ์ํํ๊ณ ์์๋ค.
๐ ์์ธ
S3 ์
๋ก๋/๋ก์ปฌ ํ์ผ ์ญ์ ๋ DB ํธ๋์ญ์
์ ๋กค๋ฐฑ ๋์์ด ์๋๋ค. ๋ฐ๋ผ์ ์น๊ฒฉ ์ดํ ๊ฐ์ ํธ๋์ญ์
์์ ๋ค๋ฅธ ์ด์ ๋ก ์ ์ฅ์ด ์คํจํด ๋กค๋ฐฑ๋๋๋ผ๋:
- ์ด๋ฏธ S3์ ์ฌ๋ผ๊ฐ ํ์ผ์ ๊ทธ๋๋ก ๋จ์ orphan์ด ๋๊ณ ,
- ์ด๋ฏธ ์ง์์ง ๋ก์ปฌ draft๋ ๋ณต๊ตฌํ ์ ์์ด ์ฌ์ฉ์๊ฐ ์ฌ์๋ํ ๋ ์ฐธ์กฐํ ์๋ณธ์ด ์ฌ๋ผ์ง๋ค.
[[s3_railway_bucket_migration]] ์์
์ค ๋ฐ๊ฒฌํด์ ๋ฐฐํ ๋ฐํ ์๋ํ ๋ ๊ฐ์ด ๊ณ ์น๊ธฐ๋ก ๋ฏธ๋ค๋๋ ๊ธฐ์กด ๋ฒ๊ทธ.
โ
ํด๊ฒฐ
LocalDraftFileStorageService๋ฅผ resolveS3Key(๋ชฉ์ ์ง key ๊ณ์ฐ๋ง, ๋ถ์ํจ๊ณผ ์์)์ promoteToS3(์ค์ ์
๋ก๋+๋ก์ปฌ ์ญ์ )๋ก ๋ถ๋ฆฌ
BattleServiceImpl์์ ๋ชฉ์ ์ง key๋ ํธ๋์ญ์
์ค ๋๊ธฐ์ ์ผ๋ก ๊ณ์ฐํด ์ํฐํฐ์ ์ ์ฅํ๋, ์ค์ ์น๊ฒฉ(promoteToS3)์ ๊ธฐ์กด์ ์ด๋ฏธ ์ฐ์ด๋ TransactionSynchronizationManager afterCommit ํจํด์ผ๋ก ์ปค๋ฐ ์ดํ๋ก ๋ฏธ๋ฃธ โ ๋กค๋ฐฑ ์์๋ ์์ ํธ์ถ๋์ง ์์ draft๊ฐ ๊ทธ๋๋ก ๋จ๋๋ค.
๐ ๋ฒ๊ทธ ์ค๋ช
๋ฐฐํ/์ต์ ์ด๋ฏธ์ง๋ฅผ ๋ก์ปฌ draft๋ก ์ฌ๋ ค๋๋ค๊ฐ ๋ฐํ(PUBLISHED) ์์ ์ S3๋ก ์น๊ฒฉํ๋ ๋ก์ง(
LocalDraftFileStorageService.promoteLocalDraftToS3)์ด, DB ์ ์ฅ์ ๋ด๋นํ๋@Transactional๋ฉ์๋(BattleServiceImpl.createBattle/updateBattle) ์ค๊ฐ์์ ์ฆ์ S3 ์ ๋ก๋ + ๋ก์ปฌ draft ์ญ์ ๊น์ง ๋๊ธฐ์ ์ผ๋ก ์ํํ๊ณ ์์๋ค.๐ ์์ธ
S3 ์ ๋ก๋/๋ก์ปฌ ํ์ผ ์ญ์ ๋ DB ํธ๋์ญ์ ์ ๋กค๋ฐฑ ๋์์ด ์๋๋ค. ๋ฐ๋ผ์ ์น๊ฒฉ ์ดํ ๊ฐ์ ํธ๋์ญ์ ์์ ๋ค๋ฅธ ์ด์ ๋ก ์ ์ฅ์ด ์คํจํด ๋กค๋ฐฑ๋๋๋ผ๋:
[[s3_railway_bucket_migration]] ์์ ์ค ๋ฐ๊ฒฌํด์ ๋ฐฐํ ๋ฐํ ์๋ํ ๋ ๊ฐ์ด ๊ณ ์น๊ธฐ๋ก ๋ฏธ๋ค๋๋ ๊ธฐ์กด ๋ฒ๊ทธ.
โ ํด๊ฒฐ
LocalDraftFileStorageService๋ฅผresolveS3Key(๋ชฉ์ ์ง key ๊ณ์ฐ๋ง, ๋ถ์ํจ๊ณผ ์์)์promoteToS3(์ค์ ์ ๋ก๋+๋ก์ปฌ ์ญ์ )๋ก ๋ถ๋ฆฌBattleServiceImpl์์ ๋ชฉ์ ์ง key๋ ํธ๋์ญ์ ์ค ๋๊ธฐ์ ์ผ๋ก ๊ณ์ฐํด ์ํฐํฐ์ ์ ์ฅํ๋, ์ค์ ์น๊ฒฉ(promoteToS3)์ ๊ธฐ์กด์ ์ด๋ฏธ ์ฐ์ด๋TransactionSynchronizationManagerafterCommit ํจํด์ผ๋ก ์ปค๋ฐ ์ดํ๋ก ๋ฏธ๋ฃธ โ ๋กค๋ฐฑ ์์๋ ์์ ํธ์ถ๋์ง ์์ draft๊ฐ ๊ทธ๋๋ก ๋จ๋๋ค.