From 0bafc93163782e9f299b13aa6e550c00b7e77a93 Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Thu, 17 Jul 2025 00:26:45 +0900 Subject: [PATCH 01/10] =?UTF-8?q?feat(StoreImage):=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=ED=95=84=20=EC=82=AC=EC=A7=84=20=EC=97=85=EB=A1=9C=EB=93=9C=20?= =?UTF-8?q?=EC=97=94=EB=93=9C=ED=8F=AC=EC=9D=B8=ED=8A=B8=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../applicationuser/store/controller/StoreController.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/controller/StoreController.java b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/controller/StoreController.java index 29b7287c..f1dbc8d2 100644 --- a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/controller/StoreController.java +++ b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/controller/StoreController.java @@ -27,7 +27,6 @@ public class StoreController { private final StoreService storeService; - @GetMapping("/all-stores") @Operation(summary = "모든 주점 조회", description = "모든 주점을 조회합니다.") @ApiResponse(responseCode = "200", description = "모든 주점 조회 성공") @@ -50,7 +49,11 @@ public ResponseEntity getAllStores() { public ResponseEntity getAllStores(Pageable pageable) { return ResponseEntity .ok() - .body(ApiUtils.success(storeService.getAllStoresByPage(pageable))); + .body( + ApiUtils.success( + storeService.getAllStoresByPage(pageable) + ) + ); } @GetMapping("/{storeId}") From 8410ed34e6d83afb322fa44998dcd905d1fa1de7 Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Thu, 17 Jul 2025 00:26:58 +0900 Subject: [PATCH 02/10] =?UTF-8?q?feat(StoreImage):=20store=20=EC=9D=B4?= =?UTF-8?q?=EB=AF=B8=EC=A7=80=20enum=20=ED=83=80=EC=9E=85=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domaincorerdb/store/entity/ImageType.java | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/entity/ImageType.java diff --git a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/entity/ImageType.java b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/entity/ImageType.java new file mode 100644 index 00000000..db1ba0a5 --- /dev/null +++ b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/entity/ImageType.java @@ -0,0 +1,18 @@ +package com.nowait.domaincorerdb.store.entity; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Getter; +import lombok.RequiredArgsConstructor; + +@Getter +@RequiredArgsConstructor +@Schema(description = "이미지 타입 Enum") +public enum ImageType { + @Schema(description = "주점 프로필 사진") + PROFILE("프로필 사진"), + + @Schema(description = "주점 배너 사진") + BANNER("배너 사진"); + + private final String description; +} From ca2fcf563cccf3cc6af87f2063569357bf8e3c65 Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Thu, 17 Jul 2025 00:27:02 +0900 Subject: [PATCH 03/10] =?UTF-8?q?feat(StoreImage):=20store=20=EC=9D=B4?= =?UTF-8?q?=EB=AF=B8=EC=A7=80=20enum=20=ED=83=80=EC=9E=85=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/nowait/domaincorerdb/store/entity/StoreImage.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/entity/StoreImage.java b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/entity/StoreImage.java index e8c5d270..a132c4ce 100644 --- a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/entity/StoreImage.java +++ b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/entity/StoreImage.java @@ -4,6 +4,8 @@ import jakarta.persistence.Column; import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; import jakarta.persistence.FetchType; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; @@ -36,4 +38,8 @@ public class StoreImage extends BaseTimeEntity { @Column(nullable = false, length = 500) private String fileKey; + + @Column(nullable = false) + @Enumerated(EnumType.STRING) + private ImageType imageType; } From 3adaf4f4554f3f09f3dd111bf6d1e42d0039d6c4 Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Thu, 17 Jul 2025 00:27:08 +0900 Subject: [PATCH 04/10] =?UTF-8?q?feat(StoreImage):=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=ED=95=84=20=EC=82=AC=EC=A7=84=20=EC=97=85=EB=A1=9C=EB=93=9C=20?= =?UTF-8?q?=EC=97=94=EB=93=9C=ED=8F=AC=EC=9D=B8=ED=8A=B8=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/StoreImageController.java | 29 ++++++++++++++++++- 1 file changed, 28 insertions(+), 1 deletion(-) 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 61ed67f2..ad0a88d3 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 @@ -29,7 +29,7 @@ public class StoreImageController { private final StoreImageService storeImageService; - @PostMapping("/store-images/{storeId}") + @PostMapping("/banner-images/{storeId}") @Operation( summary = "주점 이미지 업로드", description = "주점에 이미지를 업로드합니다. 최대 10개의 이미지 파일을 업로드할 수 있습니다." @@ -64,6 +64,33 @@ public ResponseEntity uploadStoreImage( ); } + @PostMapping("/profile-images/{storeId}") + @Operation( + summary = "주점 프로필 이미지 업로드", + description = "주점의 프로필 이미지를 업로드합니다. 단일 이미지 파일을 업로드할 수 있습니다." + ) + @ApiResponse(responseCode = "201", description = "주점 프로필 이미지 업로드 성공") + public ResponseEntity uploadStoreProfileImage( + @PathVariable Long storeId, + @RequestParam("file") MultipartFile file + ) { + if (file == null || file.isEmpty()) { + throw new IllegalArgumentException("빈 파일은 업로드할 수 없습니다."); + } + if (file.getSize() > 10 * 1024 * 1024) { // 10MB 제한 + throw new IllegalArgumentException("파일 크기는 10MB를 초과할 수 없습니다."); + } + + StoreImageUploadResponse response = storeImageService.saveProfileImage(storeId, file); + return ResponseEntity + .status(HttpStatus.CREATED) + .body( + ApiUtils.success( + response + ) + ); + } + @DeleteMapping("/store-images/{storeImageId}") @Operation( summary = "주점 이미지 삭제", From 1d494b9d95a4f551b8332b7f90112a74657ce3ca Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Thu, 17 Jul 2025 00:27:42 +0900 Subject: [PATCH 05/10] =?UTF-8?q?feat(StoreImage):=20=EC=9D=B4=EB=AF=B8?= =?UTF-8?q?=EC=A7=80=20=ED=83=80=EC=9E=85=20=ED=8F=AC=ED=95=A8=ED=95=98?= =?UTF-8?q?=EC=97=AC=20=EC=B0=BE=EB=8A=94=20findByStoreStoreIdAndImageType?= =?UTF-8?q?=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domaincorerdb/store/repository/StoreImageRepository.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/repository/StoreImageRepository.java b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/repository/StoreImageRepository.java index 80448ab8..1ad6929e 100644 --- a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/repository/StoreImageRepository.java +++ b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/repository/StoreImageRepository.java @@ -1,10 +1,12 @@ package com.nowait.domaincorerdb.store.repository; import java.util.List; +import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import com.nowait.domaincorerdb.store.entity.ImageType; import com.nowait.domaincorerdb.store.entity.Store; import com.nowait.domaincorerdb.store.entity.StoreImage; @@ -12,4 +14,6 @@ public interface StoreImageRepository extends JpaRepository { List findByStore(Store store); + + Optional findByStoreStoreIdAndImageType(Long storeId, ImageType imageType); } From 5f700673d2ac5e97beddbc2554a02daf1da73b5b Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Thu, 17 Jul 2025 00:28:07 +0900 Subject: [PATCH 06/10] =?UTF-8?q?feat(StoreImage):=20=ED=94=84=EB=A1=9C?= =?UTF-8?q?=ED=95=84=20=EC=82=AC=EC=A7=84=20=EC=97=85=EB=A1=9C=EB=93=9C=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../store/service/StoreImageService.java | 36 ++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) 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 aef083e2..772acdcf 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 @@ -2,6 +2,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Optional; import java.util.concurrent.CompletableFuture; import org.springframework.stereotype.Service; @@ -10,6 +11,7 @@ import com.nowait.applicationadmin.store.dto.StoreImageUploadResponse; +import com.nowait.domaincorerdb.store.entity.ImageType; import com.nowait.domaincorerdb.store.entity.Store; import com.nowait.domaincorerdb.store.entity.StoreImage; import com.nowait.domaincorerdb.store.exception.StoreImageEmptyException; @@ -31,7 +33,8 @@ public class StoreImageService { @Transactional public List saveAll(Long storeId, List files) { - if (files == null || files.isEmpty()) throw new StoreImageEmptyException(); + if (files == null || files.isEmpty()) + throw new StoreImageEmptyException(); String type = "store"; Store store = storeRepository.findById(storeId) @@ -60,6 +63,7 @@ public List saveAll(Long storeId, List .store(store) .imageUrl(uploadResult.url()) .fileKey(uploadResult.key()) + .imageType(ImageType.BANNER) .build(); storeImageRepository.save(storeImage); @@ -69,6 +73,36 @@ public List saveAll(Long storeId, List return imageUploadResponses; } + @Transactional + public StoreImageUploadResponse saveProfileImage(Long storeId, MultipartFile file) { + + String type = "store"; + Store store = storeRepository.findById(storeId) + .orElseThrow(StoreNotFoundException::new); + + Optional existingProfileImage = storeImageRepository.findByStoreStoreIdAndImageType(store.getStoreId(), + ImageType.PROFILE); + + existingProfileImage.ifPresent(profile -> { + s3Service.delete(profile.getFileKey()); + storeImageRepository.delete(profile); + }); + + S3Service.S3UploadResult uploadResult = s3Service.upload(type, storeId, file).join(); + + // StoreImage 엔티티 생성 및 저장 + StoreImage storeImage = StoreImage.builder() + .store(store) + .imageUrl(uploadResult.url()) + .fileKey(uploadResult.key()) + .imageType(ImageType.PROFILE) + .build(); + + storeImageRepository.save(storeImage); + + return StoreImageUploadResponse.fromEntity(storeImage); + } + @Transactional public void delete(Long storeImageId) { StoreImage storeImage = storeImageRepository.findById(storeImageId) From db52b17a223c10b67e12b00a4f27d580650dce63 Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Thu, 17 Jul 2025 00:28:20 +0900 Subject: [PATCH 07/10] =?UTF-8?q?feat(StoreImage):=20imageType=20=ED=95=84?= =?UTF-8?q?=EB=93=9C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../applicationadmin/store/dto/StoreImageUploadResponse.java | 3 +++ .../applicationuser/store/dto/StoreImageUploadResponse.java | 3 +++ 2 files changed, 6 insertions(+) diff --git a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/dto/StoreImageUploadResponse.java b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/dto/StoreImageUploadResponse.java index a34ca422..c5407e0f 100644 --- a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/dto/StoreImageUploadResponse.java +++ b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/dto/StoreImageUploadResponse.java @@ -1,5 +1,6 @@ package com.nowait.applicationadmin.store.dto; +import com.nowait.domaincorerdb.store.entity.ImageType; import com.nowait.domaincorerdb.store.entity.StoreImage; import lombok.Builder; @@ -10,11 +11,13 @@ public class StoreImageUploadResponse { private final Long id; private final String imageUrl; + private final ImageType imageType; public static StoreImageUploadResponse fromEntity(StoreImage storeImage) { return StoreImageUploadResponse.builder() .id(storeImage.getId()) .imageUrl(storeImage.getImageUrl()) + .imageType(storeImage.getImageType()) .build(); } } diff --git a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/dto/StoreImageUploadResponse.java b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/dto/StoreImageUploadResponse.java index 5ff57643..62822b3d 100644 --- a/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/dto/StoreImageUploadResponse.java +++ b/nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/dto/StoreImageUploadResponse.java @@ -1,5 +1,6 @@ package com.nowait.applicationuser.store.dto; +import com.nowait.domaincorerdb.store.entity.ImageType; import com.nowait.domaincorerdb.store.entity.StoreImage; import lombok.Builder; @@ -10,11 +11,13 @@ public class StoreImageUploadResponse { private final Long id; private final String imageUrl; + private final ImageType imageType; public static StoreImageUploadResponse fromEntity(StoreImage storeImage) { return StoreImageUploadResponse.builder() .id(storeImage.getId()) .imageUrl(storeImage.getImageUrl()) + .imageType(storeImage.getImageType()) .build(); } } From 5773564fbcb31ca3a36966f770107e4af6399339 Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Thu, 17 Jul 2025 00:28:39 +0900 Subject: [PATCH 08/10] =?UTF-8?q?feat(StoreImage):=20profile,=20banner=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC=ED=95=98=EC=97=AC=20=EB=B3=B4=EC=97=AC?= =?UTF-8?q?=EC=A3=BC=EB=8F=84=EB=A1=9D=20dto=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../store/dto/StoreReadDto.java | 19 ++++++++++++++++--- .../store/dto/StoreReadDto.java | 19 ++++++++++++++++--- 2 files changed, 32 insertions(+), 6 deletions(-) diff --git a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/dto/StoreReadDto.java b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/dto/StoreReadDto.java index b0497dd1..68dee6be 100644 --- a/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/dto/StoreReadDto.java +++ b/nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/dto/StoreReadDto.java @@ -3,6 +3,7 @@ import java.time.LocalDateTime; import java.util.List; +import com.nowait.domaincorerdb.store.entity.ImageType; import com.nowait.domaincorerdb.store.entity.Store; import lombok.AllArgsConstructor; @@ -18,12 +19,23 @@ public class StoreReadDto { private String name; private String location; private String description; - private List images; + private StoreImageUploadResponse profileImage; + private List bannerImages; private Boolean isActive; private Boolean deleted; private LocalDateTime createdAt; - public static StoreReadDto fromEntity(Store store, List images) { + public static StoreReadDto fromEntity(Store store, List allImages) { + + StoreImageUploadResponse profile = allImages.stream() + .filter(image -> image.getImageType() == ImageType.PROFILE) + .findFirst() + .orElse(null); + + List banners = allImages.stream() + .filter(image -> image.getImageType() == ImageType.BANNER) + .toList(); + return StoreReadDto.builder() .createdAt(store.getCreatedAt()) .storeId(store.getStoreId()) @@ -33,7 +45,8 @@ public static StoreReadDto fromEntity(Store store, List images; + private StoreImageUploadResponse profileImage; + private List bannerImages; private Boolean isActive; private Boolean deleted; private LocalDateTime createdAt; - public static StoreReadDto fromEntity(Store store, List images) { + public static StoreReadDto fromEntity(Store store, List allImages) { + + StoreImageUploadResponse profile = allImages.stream() + .filter(image -> image.getImageType() == ImageType.PROFILE) + .findFirst() + .orElse(null); + + List banners = allImages.stream() + .filter(image -> image.getImageType() == ImageType.BANNER) + .toList(); + return StoreReadDto.builder() .createdAt(store.getCreatedAt()) .storeId(store.getStoreId()) @@ -33,7 +45,8 @@ public static StoreReadDto fromEntity(Store store, List Date: Thu, 17 Jul 2025 00:42:08 +0900 Subject: [PATCH 09/10] =?UTF-8?q?refactor(StoreImage):=20NONE=20ENUM=20?= =?UTF-8?q?=EA=B0=92=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/nowait/domaincorerdb/store/entity/ImageType.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/entity/ImageType.java b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/entity/ImageType.java index db1ba0a5..b7564e93 100644 --- a/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/entity/ImageType.java +++ b/nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/entity/ImageType.java @@ -12,7 +12,10 @@ public enum ImageType { PROFILE("프로필 사진"), @Schema(description = "주점 배너 사진") - BANNER("배너 사진"); + BANNER("배너 사진"), + + @Schema(description = "주점 배너 사진") + NONE("이미지 없음"); private final String description; } From 0bcfa29cdc10cd1fbd4db77c77ef9b393a647b97 Mon Sep 17 00:00:00 2001 From: Jihun Kim Date: Thu, 17 Jul 2025 00:47:33 +0900 Subject: [PATCH 10/10] =?UTF-8?q?refactor(StoreImage):=20=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20=EA=B2=80=EC=A6=9D=20=EA=B3=B5=ED=86=B5=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EB=A9=94=EC=84=9C=EB=93=9C=EB=A1=9C=20=EB=B6=84?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/StoreImageController.java | 38 ++++++++++--------- 1 file changed, 20 insertions(+), 18 deletions(-) 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 ad0a88d3..30e4202c 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 @@ -40,19 +40,8 @@ public ResponseEntity uploadStoreImage( @RequestParam("files") List files ) { // TODO 관련 정책 확정되면 메서드로 분리 예정 - // 파일 개수 제한 검증 - if (files.isEmpty() || files.size() > 10) { - throw new IllegalArgumentException("파일은 1개 이상 10개 이하로 업로드해 주세요."); - } // 파일 크기 검증 - for (MultipartFile file : files) { - if (file.isEmpty()) { - throw new IllegalArgumentException("빈 파일은 업로드할 수 없습니다."); - } - if (file.getSize() > 10 * 1024 * 1024) { // 10MB 제한 - throw new IllegalArgumentException("파일 크기는 10MB를 초과할 수 없습니다."); - } - } + validateFiles(files); List response = storeImageService.saveAll(storeId, files); return ResponseEntity @@ -74,12 +63,7 @@ public ResponseEntity uploadStoreProfileImage( @PathVariable Long storeId, @RequestParam("file") MultipartFile file ) { - if (file == null || file.isEmpty()) { - throw new IllegalArgumentException("빈 파일은 업로드할 수 없습니다."); - } - if (file.getSize() > 10 * 1024 * 1024) { // 10MB 제한 - throw new IllegalArgumentException("파일 크기는 10MB를 초과할 수 없습니다."); - } + validateFileSize(file); StoreImageUploadResponse response = storeImageService.saveProfileImage(storeId, file); return ResponseEntity @@ -108,4 +92,22 @@ public ResponseEntity deleteStoreImage(@PathVariable Long imageId) { ) ); } + + private void validateFileSize(MultipartFile file) { + if (file == null || file.isEmpty()) { + throw new IllegalArgumentException("빈 파일은 업로드할 수 없습니다."); + } + if (file.getSize() > 10 * 1024 * 1024) { // 10MB 제한 + throw new IllegalArgumentException("파일 크기는 10MB를 초과할 수 없습니다."); + } + } + + private void validateFiles(List files) { + if (files.isEmpty() || files.size() > 10) { + throw new IllegalArgumentException("파일은 1개 이상 10개 이하로 업로드해 주세요."); + } + for (MultipartFile file : files) { + validateFileSize(file); + } + } }