From 2122aaf91bd0c843da5191b067e520316efc4bc9 Mon Sep 17 00:00:00 2001 From: bjkim Date: Mon, 13 Oct 2025 16:33:18 +0900 Subject: [PATCH] =?UTF-8?q?[ADD]=20MinIO=20=ED=8C=8C=EC=9D=BC=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80=20=EB=B0=8F?= =?UTF-8?q?=20=EB=8D=B0=EC=9D=B4=ED=84=B0=EA=B7=B8=EB=A3=B9=20=EC=82=AD?= =?UTF-8?q?=EC=A0=9C=20=EC=8B=9C=20=EC=B2=A8=EB=B6=80=ED=8C=8C=EC=9D=BC=20?= =?UTF-8?q?=EC=A0=95=EB=A6=AC=20=EC=B2=98=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../etri/autoflow/entity/DataGroupEntity.java | 5 ++ .../repository/MinioAttachmentRepository.java | 1 + .../autoflow/service/DataGroupService.java | 53 +++++++++++++++++-- 3 files changed, 55 insertions(+), 4 deletions(-) diff --git a/src/main/java/kr/re/etri/autoflow/entity/DataGroupEntity.java b/src/main/java/kr/re/etri/autoflow/entity/DataGroupEntity.java index 88c8a32..5c515c4 100644 --- a/src/main/java/kr/re/etri/autoflow/entity/DataGroupEntity.java +++ b/src/main/java/kr/re/etri/autoflow/entity/DataGroupEntity.java @@ -30,6 +30,11 @@ public class DataGroupEntity { @Comment("ID") private Long id; +// @Schema(description = "첨부파일 종류 (DATASET / SCRIPT)", example = "DATASET") +// @Comment("첨부파일 종류") +// @Column(nullable = false, length = 50) +// private String refType; // 구분자 (예: WORKFLOW_STEP,DATASET, TRAINING_SCRIPT) + @Schema(description = "데이터셋 이름", example = "배터리 상태 데이터 셋") @Comment("데이터셋 이름") private String dsNm; diff --git a/src/main/java/kr/re/etri/autoflow/repository/MinioAttachmentRepository.java b/src/main/java/kr/re/etri/autoflow/repository/MinioAttachmentRepository.java index 87f717a..734f328 100644 --- a/src/main/java/kr/re/etri/autoflow/repository/MinioAttachmentRepository.java +++ b/src/main/java/kr/re/etri/autoflow/repository/MinioAttachmentRepository.java @@ -12,4 +12,5 @@ import java.util.Optional; public interface MinioAttachmentRepository extends JpaRepository, JpaSpecificationExecutor { //최신버전 파일 가져오기 Optional findTopByRefIdAndRefTypeOrderByVersionDesc(Long refId, String refType); + List findAllByRefId(Long refId); } diff --git a/src/main/java/kr/re/etri/autoflow/service/DataGroupService.java b/src/main/java/kr/re/etri/autoflow/service/DataGroupService.java index 1778b45..c99af65 100644 --- a/src/main/java/kr/re/etri/autoflow/service/DataGroupService.java +++ b/src/main/java/kr/re/etri/autoflow/service/DataGroupService.java @@ -1,12 +1,18 @@ package kr.re.etri.autoflow.service; +import io.minio.MinioClient; +import io.minio.RemoveObjectArgs; import kr.re.etri.autoflow.entity.DataGroupEntity; +import kr.re.etri.autoflow.entity.MinioAttachmentEntity; import kr.re.etri.autoflow.payload.request.ProjectBaseSearchRequest; import kr.re.etri.autoflow.payload.request.ProjectRequest; import kr.re.etri.autoflow.repository.DataGroupRepository; +import kr.re.etri.autoflow.repository.MinioAttachmentRepository; import kr.re.etri.autoflow.specification.DataGroupSpecification; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; @@ -24,10 +30,13 @@ import java.util.Optional; @Service @RequiredArgsConstructor @Transactional(readOnly = true) +@Slf4j public class DataGroupService { private final DataGroupRepository dataGroupRepository; + private final MinioAttachmentRepository minioAttachmentRepository; + private final DataGroupSpecification dataGroupSpecification; private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); @@ -40,6 +49,12 @@ public class DataGroupService { return dataGroupRepository.findById(id); } + private final MinioClient minioClient; + + + @Value("${minio.bucket}") + private String bucketName; + public Page search(ProjectBaseSearchRequest request) { int pageIndex = request.getPage() > 0 ? request.getPage() - 1 : 0; @@ -93,11 +108,41 @@ public class DataGroupService { } @Transactional - public boolean delete(Long id) { - if (!dataGroupRepository.existsById(id)) { + public boolean delete(Long dataGroupId) { + try { + // 1. 데이터그룹 존재 여부 확인 + Optional dataGroupOpt = dataGroupRepository.findById(dataGroupId); + if (dataGroupOpt.isEmpty()) { + return false; + } + + // 2. refId 기준으로 MinIO 첨부파일 조회 + List attachments = + minioAttachmentRepository.findAllByRefId(dataGroupId); + + // 3. MinIO에서 파일 삭제 + for (MinioAttachmentEntity attachment : attachments) { + try { + minioClient.removeObject( + RemoveObjectArgs.builder() + .bucket(bucketName) + .object(attachment.getStoragePath()) + .build() + ); + // DB에서도 첨부파일 삭제 + minioAttachmentRepository.delete(attachment); + } catch (Exception e) { + log.error("MinIO 파일 삭제 실패: {}", attachment.getStoragePath(), e); + } + } + + // 4. 데이터그룹 삭제 + dataGroupRepository.delete(dataGroupOpt.get()); + return true; + + } catch (Exception e) { + log.error("데이터그룹 삭제 중 오류 발생 (id={})", dataGroupId, e); return false; } - dataGroupRepository.deleteById(id); - return true; } }