🛠️ Issue Overview
파일 스토리지를 AWS S3에서 Railway 자체 Bucket(S3 호환 API)으로 교체합니다. Railway가 개발/운영 환경이 분리되어 있으므로, 코드는 환경변수만으로 두 스토리지를 스위칭할 수 있게 만들고 개발 서버에서 충분히 검증한 뒤 운영 서버 환경변수를 교체하는 방식으로 진행합니다. 문제가 생기면 운영 환경변수를 기존 AWS 값으로 되돌리기만 하면 즉시 롤백됩니다.
📝 Issue Description
AS-IS: AWS S3 (S3Client/S3Presigner, spring.cloud.aws.s3.* 프로퍼티) 사용
TO-BE: Railway Bucket (S3 호환 API) 사용, AWS SDK 코드는 유지하고 endpoint/credentials만 환경변수로 교체
변경 대상
application.yml — spring.cloud.aws.s3.endpoint 추가, region.static/credentials를 환경변수 기반으로 유지(값만 환경별로 다르게 세팅)
S3Config.java — S3Presigner에 .endpointOverride() + path-style access 설정 추가
S3UploadServiceImpl.java / S3PresignedUrlService.java / ResourceRedirectController — .amazonaws.com/ 하드코딩된 URL 파싱(key 추출) 로직을 Railway 도메인 형식에도 대응하도록 수정
- Railway 개발 서버 환경변수 —
AWS_S3_BUCKET, AWS_REGION, AWS_ACCESS_KEY, AWS_SECRET_KEY, S3_ENDPOINT(신규)를 Railway Bucket 값으로 교체
- Railway 운영 서버 환경변수 — 개발 서버 검증 완료 후에만 동일하게 교체 (그 전까진 기존 AWS 값 유지)
영향받지만 코드 변경 불필요
ApnsConfig.java (.p8 키 다운로드, 동일 S3Client 빈 재사용)
LocalDraftFileStorageService, BattleServiceImpl의 promote 로직
build.gradle의 spring-cloud-aws-starter-s3 의존성 (그대로 유지)
✅ To do
🛠️ Issue Overview
파일 스토리지를 AWS S3에서 Railway 자체 Bucket(S3 호환 API)으로 교체합니다. Railway가 개발/운영 환경이 분리되어 있으므로, 코드는 환경변수만으로 두 스토리지를 스위칭할 수 있게 만들고 개발 서버에서 충분히 검증한 뒤 운영 서버 환경변수를 교체하는 방식으로 진행합니다. 문제가 생기면 운영 환경변수를 기존 AWS 값으로 되돌리기만 하면 즉시 롤백됩니다.
📝 Issue Description
AS-IS: AWS S3 (
S3Client/S3Presigner,spring.cloud.aws.s3.*프로퍼티) 사용TO-BE: Railway Bucket (S3 호환 API) 사용, AWS SDK 코드는 유지하고 endpoint/credentials만 환경변수로 교체
변경 대상
application.yml—spring.cloud.aws.s3.endpoint추가,region.static/credentials를 환경변수 기반으로 유지(값만 환경별로 다르게 세팅)S3Config.java—S3Presigner에.endpointOverride()+ path-style access 설정 추가S3UploadServiceImpl.java/S3PresignedUrlService.java/ResourceRedirectController—.amazonaws.com/하드코딩된 URL 파싱(key 추출) 로직을 Railway 도메인 형식에도 대응하도록 수정AWS_S3_BUCKET,AWS_REGION,AWS_ACCESS_KEY,AWS_SECRET_KEY,S3_ENDPOINT(신규)를 Railway Bucket 값으로 교체영향받지만 코드 변경 불필요
ApnsConfig.java(.p8키 다운로드, 동일S3Client빈 재사용)LocalDraftFileStorageService,BattleServiceImpl의 promote 로직build.gradle의spring-cloud-aws-starter-s3의존성 (그대로 유지)✅ To do
application.yml+S3Config.java에 endpoint/path-style 설정 추가S3UploadServiceImpl/S3PresignedUrlService/ResourceRedirectController의 URL 파싱 로직을 도메인 하드코딩 없이 수정/files/upload, 카테고리별: PHILOSOPHER/CHARACTER/BATTLE/SCENARIO)/files/upload/local) → 조회ResourceRedirectController302 리다이렉트 정상 동작ContentPublishScheduler)를 통한 예약 발행 플로우ShareApiIntegrationTest,ContentPublishSchedulerIntegrationTest,AdminNotificationTestPushIntegrationTest,AdminScenarioPublishFlowIntegrationTest,AdminNoticeIntegrationTest,AdminContentCreationIntegrationTest)