From ffeb4c2bf59e7de00b6b480e422bb2eb0684b8c0 Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Sat, 26 Jul 2025 01:33:25 +0900 Subject: [PATCH 1/3] =?UTF-8?q?refactor(MenuImage):=20=EC=BD=94=EB=93=9C?= =?UTF-8?q?=20=EC=BB=A8=EB=B2=A4=EC=85=98=EC=97=90=20=EB=A7=9E=EA=B2=8C=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../menu/controller/MenuImageController.java | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/menu/controller/MenuImageController.java b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/menu/controller/MenuImageController.java index 5e5b6d20..5d6add61 100644 --- a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/menu/controller/MenuImageController.java +++ b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/menu/controller/MenuImageController.java @@ -47,7 +47,16 @@ public ResponseEntity uploadMenuImage( } MenuImageUploadResponse response = menuImageService.save(menuId, file); - return ResponseEntity.status(HttpStatus.CREATED).body(ApiUtils.success(response)); + return ResponseEntity + .status( + HttpStatus.CREATED + ) + .body( + ApiUtils + .success( + response + ) + ); } @DeleteMapping("/images/{menuImageId}") From f0da7edf53fc2a7bdebcc5eb5c666f1aba2a54f3 Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Sat, 26 Jul 2025 01:33:49 +0900 Subject: [PATCH 2/3] =?UTF-8?q?refactor(StoreImage):=20type=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../applicationadmin/store/service/StoreImageService.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/service/StoreImageService.java b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/service/StoreImageService.java index 772acdcf..fb7c8388 100644 --- a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/service/StoreImageService.java +++ b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/service/StoreImageService.java @@ -36,7 +36,7 @@ public List saveAll(Long storeId, List if (files == null || files.isEmpty()) throw new StoreImageEmptyException(); - String type = "store"; + String type = "banner"; Store store = storeRepository.findById(storeId) .orElseThrow(StoreNotFoundException::new); @@ -76,7 +76,7 @@ public List saveAll(Long storeId, List @Transactional public StoreImageUploadResponse saveProfileImage(Long storeId, MultipartFile file) { - String type = "store"; + String type = "profile"; Store store = storeRepository.findById(storeId) .orElseThrow(StoreNotFoundException::new); From ff98ed5164d660320d146555fed6c14ae41726a3 Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Sat, 26 Jul 2025 02:30:39 +0900 Subject: [PATCH 3/3] =?UTF-8?q?refactor(s3):=20=EC=9D=B4=EB=AF=B8=EC=A7=80?= =?UTF-8?q?=20resize=20=EC=A3=BC=EC=86=8C=EB=A1=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../menu/service/MenuImageService.java | 2 +- .../controller/StoreImageController.java | 4 +-- .../store/service/StoreImageService.java | 4 +-- .../com/nowait/infraaws/aws/s3/S3Service.java | 25 +++++++++++++------ 4 files changed, 22 insertions(+), 13 deletions(-) diff --git a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/menu/service/MenuImageService.java b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/menu/service/MenuImageService.java index 10c60ac8..e1bdcc5c 100644 --- a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/menu/service/MenuImageService.java +++ b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/menu/service/MenuImageService.java @@ -38,7 +38,7 @@ public MenuImageUploadResponse save(Long menuId, MultipartFile file) { // MenuImage 엔티티 생성 및 저장 MenuImage menuImage = MenuImage.builder() .menu(menu) - .imageUrl(uploadResult.url()) + .imageUrl(uploadResult.resizedUrl()) .fileKey(uploadResult.key()) .build(); diff --git a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/controller/StoreImageController.java b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/controller/StoreImageController.java index 30e4202c..d65bef08 100644 --- a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/controller/StoreImageController.java +++ b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/controller/StoreImageController.java @@ -81,8 +81,8 @@ public ResponseEntity uploadStoreProfileImage( description = "주점 이미지를 삭제합니다. 이미지 ID를 사용하여 특정 이미지를 삭제할 수 있습니다." ) @ApiResponse(responseCode = "200", description = "주점 이미지 삭제 성공") - public ResponseEntity deleteStoreImage(@PathVariable Long imageId) { - storeImageService.delete(imageId); + public ResponseEntity deleteStoreImage(@PathVariable Long storeImageId) { + storeImageService.delete(storeImageId); return ResponseEntity .status(HttpStatus.OK) .body( diff --git a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/service/StoreImageService.java b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/service/StoreImageService.java index fb7c8388..1aa7b754 100644 --- a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/service/StoreImageService.java +++ b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/service/StoreImageService.java @@ -61,7 +61,7 @@ public List saveAll(Long storeId, List for (S3Service.S3UploadResult uploadResult : uploadResults) { StoreImage storeImage = StoreImage.builder() .store(store) - .imageUrl(uploadResult.url()) + .imageUrl(uploadResult.resizedUrl()) .fileKey(uploadResult.key()) .imageType(ImageType.BANNER) .build(); @@ -93,7 +93,7 @@ public StoreImageUploadResponse saveProfileImage(Long storeId, MultipartFile fil // StoreImage 엔티티 생성 및 저장 StoreImage storeImage = StoreImage.builder() .store(store) - .imageUrl(uploadResult.url()) + .imageUrl(uploadResult.resizedUrl()) .fileKey(uploadResult.key()) .imageType(ImageType.PROFILE) .build(); diff --git a/nowait-infra/src/main/java/com/nowait/infraaws/aws/s3/S3Service.java b/nowait-infra/src/main/java/com/nowait/infraaws/aws/s3/S3Service.java index 18416c32..604d06b4 100644 --- a/nowait-infra/src/main/java/com/nowait/infraaws/aws/s3/S3Service.java +++ b/nowait-infra/src/main/java/com/nowait/infraaws/aws/s3/S3Service.java @@ -21,31 +21,40 @@ public class S3Service { private final AmazonS3Client amazonS3Client; @Value("${cloud.aws.s3.bucket}") - private String bucket; + private String originalBucket; - public record S3UploadResult(String key, String url) { + @Value("${cloud.aws.s3.resize-bucket}") + private String resizeBucket; + + public record S3UploadResult(String key, String originalUrl, String resizedUrl) { } @Bulkhead(name = "s3UploadBulkhead", type = Bulkhead.Type.THREADPOOL) @Async("s3UploadExecutor") - public CompletableFuture upload(String type, Long refId, MultipartFile file) { // TODO MultipartFile 분리 필요 (Spring에 의존하면 안 됨) + public CompletableFuture upload(String type, Long refId, + MultipartFile file) { // TODO MultipartFile 분리 필요 (Spring에 의존하면 안 됨) try (InputStream inputStream = file.getInputStream()) { String key = createFileKey(type, refId, file.getOriginalFilename()); ObjectMetadata metadata = new ObjectMetadata(); metadata.setContentLength(file.getSize()); - amazonS3Client.putObject(bucket, key, inputStream, metadata); - String url = amazonS3Client.getUrl(bucket, key).toString(); + // 1) 원본 버킷에 이미지 업로드 + amazonS3Client.putObject(originalBucket, key, inputStream, metadata); + + // 2) 각 버킷의 URL 생성 + String originalUrl = amazonS3Client.getUrl(originalBucket, key).toString(); + String resizedUrl = amazonS3Client.getUrl(resizeBucket, key).toString(); - return CompletableFuture.completedFuture(new S3UploadResult(key, url)); + return CompletableFuture.completedFuture(new S3UploadResult(key, originalUrl, resizedUrl)); } catch (Exception e) { throw new RuntimeException("S3 업로드 실패", e); } } - public void delete(String filename) { + public void delete(String key) { try { - amazonS3Client.deleteObject(bucket, filename); + amazonS3Client.deleteObject(originalBucket, key); + amazonS3Client.deleteObject(resizeBucket, key); } catch (Exception e) { throw new RuntimeException("S3 파일 삭제 실패", e); }