diff --git a/.github/workflows/test-server-ci.yml b/.github/workflows/test-server-ci.yml index 36cb6d37..7bb707d2 100644 --- a/.github/workflows/test-server-ci.yml +++ b/.github/workflows/test-server-ci.yml @@ -90,6 +90,7 @@ jobs: AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} AWS_S3_BUCKET_NAME: ${{ secrets.AWS_S3_BUCKET_NAME }} + AWS_S3_PREFIX: test/ SENTRY_DSN: ${{ secrets.SENTRY_DSN }} JWT_SECRET_KEY: ${{ secrets.JWT_SECRET_KEY }} JWT_ACCESS_TOKEN_VALIDITY: ${{ secrets.JWT_ACCESS_TOKEN_VALIDITY }} diff --git a/src/main/java/org/tuna/zoopzoop/backend/domain/space/space/service/SpaceService.java b/src/main/java/org/tuna/zoopzoop/backend/domain/space/space/service/SpaceService.java index 3e164420..cc9c464b 100644 --- a/src/main/java/org/tuna/zoopzoop/backend/domain/space/space/service/SpaceService.java +++ b/src/main/java/org/tuna/zoopzoop/backend/domain/space/space/service/SpaceService.java @@ -3,10 +3,13 @@ import jakarta.persistence.NoResultException; import jakarta.validation.constraints.NotBlank; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.hibernate.validator.constraints.Length; +import org.springframework.beans.factory.annotation.Value; import org.springframework.dao.DataIntegrityViolationException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.StringUtils; import org.springframework.web.multipart.MultipartFile; import org.tuna.zoopzoop.backend.domain.datasource.repository.DataSourceRepository; import org.tuna.zoopzoop.backend.domain.datasource.repository.TagRepository; @@ -18,6 +21,7 @@ import org.tuna.zoopzoop.backend.global.aws.S3Service; import org.tuna.zoopzoop.backend.global.clients.liveblocks.LiveblocksClient; +@Slf4j @Service @RequiredArgsConstructor public class SpaceService { @@ -28,6 +32,9 @@ public class SpaceService { private final TagRepository tagRepository; private final DataSourceRepository dataSourceRepository; + @Value("${spring.cloud.aws.s3.prefix}") + private String s3Prefix; + // ======================== 스페이스 조회 ======================== // /** @@ -174,9 +181,10 @@ public void updateSpaceThumbnail(Integer spaceId, Member requester, MultipartFil } try { - //String fileName = "space/" + spaceId + "/thumbnail/" + System.currentTimeMillis() + "_" + + //String fileName = "space-thumbnail/prefix/space_id.jpg"; // S3 저장 시 파일 이름 고정 (덮어쓰기) - String fileName = "space-thumbnail/space_" + spaceId ; + String extension = StringUtils.getFilenameExtension(image.getOriginalFilename()); + String fileName = "space-thumbnail/" + s3Prefix + "/space_" + spaceId + "." + extension; String baseImageUrl = s3Service.upload(image, fileName); // DB 용으로 현재 시간을 쿼리 파라미터에 추가 (캐시 무효화) @@ -186,6 +194,7 @@ public void updateSpaceThumbnail(Integer spaceId, Member requester, MultipartFil space.setThumbnailUrl(finalImageUrl); spaceRepository.save(space); } catch (Exception e) { + log.error("Space thumbnail upload failed: ", e); throw new RuntimeException("스페이스 썸네일 이미지 업로드에 실패했습니다."); } } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 4b012f4b..e6687ffd 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -108,9 +108,11 @@ spring: static: ap-northeast-2 s3: bucket: ${AWS_S3_BUCKET_NAME} + prefix: ${AWS_S3_PREFIX} stack: auto: false + #Spring doc 설정 springdoc: default-produces-media-type: application/json;charset=UTF-8