From 474a3c119eeec127f434aa8997238c5d24e219fe Mon Sep 17 00:00:00 2001 From: teddy Date: Wed, 4 Feb 2026 19:51:43 +0900 Subject: [PATCH] =?UTF-8?q?=EB=AA=A8=EB=8D=B8=ED=95=99=EC=8A=B5=20config?= =?UTF-8?q?=20=EC=A0=95=EB=B3=B4=20=EC=A1=B0=ED=9A=8C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/ModelTrainMngApiController.java | 19 ++++++++++ .../cd/training/model/dto/ModelConfigDto.java | 23 ++++++++++++ .../model/service/ModelTrainMngService.java | 12 ++++++ .../core/ModelTrainMngCoreService.java | 26 +++++++++---- .../model/ModelConfigRepository.java | 3 +- .../model/ModelConfigRepositoryCustom.java | 8 ++++ .../model/ModelConfigRepositoryImpl.java | 37 +++++++++++++++++++ 7 files changed, 120 insertions(+), 8 deletions(-) create mode 100644 src/main/java/com/kamco/cd/training/model/dto/ModelConfigDto.java create mode 100644 src/main/java/com/kamco/cd/training/postgres/repository/model/ModelConfigRepositoryCustom.java create mode 100644 src/main/java/com/kamco/cd/training/postgres/repository/model/ModelConfigRepositoryImpl.java diff --git a/src/main/java/com/kamco/cd/training/model/ModelTrainMngApiController.java b/src/main/java/com/kamco/cd/training/model/ModelTrainMngApiController.java index c306895..7f190e2 100644 --- a/src/main/java/com/kamco/cd/training/model/ModelTrainMngApiController.java +++ b/src/main/java/com/kamco/cd/training/model/ModelTrainMngApiController.java @@ -1,6 +1,7 @@ package com.kamco.cd.training.model; import com.kamco.cd.training.config.api.ApiResponseDto; +import com.kamco.cd.training.model.dto.ModelConfigDto; import com.kamco.cd.training.model.dto.ModelTrainMngDto; import com.kamco.cd.training.model.dto.ModelTrainMngDto.Basic; import com.kamco.cd.training.model.service.ModelTrainMngService; @@ -91,4 +92,22 @@ public class ModelTrainMngApiController { modelTrainMngService.createModelTrain(req); return ApiResponseDto.ok("ok"); } + + @Operation(summary = "모델학습 config 정보 조회", description = "모델학습 config 정보 조회 API") + @ApiResponses( + value = { + @ApiResponse( + responseCode = "200", + description = "검색 성공", + content = + @Content( + mediaType = "application/json", + schema = @Schema(implementation = ModelConfigDto.Basic.class))), + @ApiResponse(responseCode = "400", description = "잘못된 검색 조건", content = @Content), + @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) + }) + @GetMapping("/config/{uuid}") + public ApiResponseDto updateModelTrain(@PathVariable UUID uuid) { + return ApiResponseDto.ok(modelTrainMngService.getModelConfigByModelId(uuid)); + } } diff --git a/src/main/java/com/kamco/cd/training/model/dto/ModelConfigDto.java b/src/main/java/com/kamco/cd/training/model/dto/ModelConfigDto.java new file mode 100644 index 0000000..9d6a651 --- /dev/null +++ b/src/main/java/com/kamco/cd/training/model/dto/ModelConfigDto.java @@ -0,0 +1,23 @@ +package com.kamco.cd.training.model.dto; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.NoArgsConstructor; +import lombok.Setter; + +public class ModelConfigDto { + + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class Basic { + private Long configId; + private Long modelId; + private Integer epochCount; + private Float trainPercent; + private Float validationPercent; + private Float testPercent; + private String memo; + } +} diff --git a/src/main/java/com/kamco/cd/training/model/service/ModelTrainMngService.java b/src/main/java/com/kamco/cd/training/model/service/ModelTrainMngService.java index 2c19c4d..65d4b7e 100644 --- a/src/main/java/com/kamco/cd/training/model/service/ModelTrainMngService.java +++ b/src/main/java/com/kamco/cd/training/model/service/ModelTrainMngService.java @@ -3,6 +3,7 @@ package com.kamco.cd.training.model.service; import com.kamco.cd.training.common.dto.HyperParam; import com.kamco.cd.training.common.enums.HyperParamSelectType; import com.kamco.cd.training.hyperparam.dto.HyperParamDto; +import com.kamco.cd.training.model.dto.ModelConfigDto; import com.kamco.cd.training.model.dto.ModelTrainMngDto; import com.kamco.cd.training.model.dto.ModelTrainMngDto.SearchReq; import com.kamco.cd.training.postgres.core.HyperParamCoreService; @@ -38,6 +39,7 @@ public class ModelTrainMngService { * * @param uuid */ + @Transactional public void deleteModelTrain(UUID uuid) { modelTrainMngCoreService.deleteModel(uuid); } @@ -73,4 +75,14 @@ public class ModelTrainMngService { // 모델 config 저장 modelTrainMngCoreService.saveModelConfig(modelId, req.getModelConfig()); } + + /** + * 모델학습 모델학습 uuid config정보 조회 + * + * @param uuid 모델학습 uuid + * @return + */ + public ModelConfigDto.Basic getModelConfigByModelId(UUID uuid) { + return modelTrainMngCoreService.findModelConfigByModelId(uuid); + } } diff --git a/src/main/java/com/kamco/cd/training/postgres/core/ModelTrainMngCoreService.java b/src/main/java/com/kamco/cd/training/postgres/core/ModelTrainMngCoreService.java index 7bab856..0465217 100644 --- a/src/main/java/com/kamco/cd/training/postgres/core/ModelTrainMngCoreService.java +++ b/src/main/java/com/kamco/cd/training/postgres/core/ModelTrainMngCoreService.java @@ -5,8 +5,8 @@ import com.kamco.cd.training.common.enums.ModelType; import com.kamco.cd.training.common.enums.TrainStatusType; import com.kamco.cd.training.common.exception.BadRequestException; import com.kamco.cd.training.common.exception.CustomApiException; -import com.kamco.cd.training.common.exception.NotFoundException; import com.kamco.cd.training.common.utils.UserUtil; +import com.kamco.cd.training.model.dto.ModelConfigDto; import com.kamco.cd.training.model.dto.ModelTrainMngDto; import com.kamco.cd.training.model.dto.ModelTrainMngDto.Basic; import com.kamco.cd.training.model.dto.ModelTrainMngDto.TrainingDataset; @@ -162,7 +162,7 @@ public class ModelTrainMngCoreService { * @param req 요청 파라미터 * @return */ - public Long saveModelConfig(Long modelId, ModelTrainMngDto.ModelConfig req) { + public void saveModelConfig(Long modelId, ModelTrainMngDto.ModelConfig req) { ModelMasterEntity modelMasterEntity = new ModelMasterEntity(); ModelConfigEntity entity = new ModelConfigEntity(); modelMasterEntity.setId(modelId); @@ -173,7 +173,7 @@ public class ModelTrainMngCoreService { entity.setTestPercent(req.getTestCnt()); entity.setMemo(req.getMemo()); - return modelConfigRepository.save(entity).getId(); + modelConfigRepository.save(entity); } /** @@ -198,14 +198,26 @@ public class ModelTrainMngCoreService { * @param uuid UUID * @return 모델 Entity */ - public ModelMasterEntity findByUuid(String uuid) { + public ModelMasterEntity findByUuid(UUID uuid) { try { - java.util.UUID uuidObj = java.util.UUID.fromString(uuid); return modelMngRepository - .findByUuid(uuidObj) - .orElseThrow(() -> new NotFoundException("모델을 찾을 수 없습니다. UUID: " + uuid)); + .findByUuid(uuid) + .orElseThrow(() -> new CustomApiException("NOT_FOUND_DATA", HttpStatus.NOT_FOUND)); } catch (IllegalArgumentException e) { throw new BadRequestException("잘못된 UUID 형식입니다: " + uuid); } } + + /** + * 모델학습 아이디로 config정보 조회 + * + * @param uuid + * @return + */ + public ModelConfigDto.Basic findModelConfigByModelId(UUID uuid) { + ModelMasterEntity modelEntity = findByUuid(uuid); + return modelConfigRepository + .findModelConfigByModelId(modelEntity.getId()) + .orElseThrow(() -> new CustomApiException("NOT_FOUND_DATA", HttpStatus.NOT_FOUND)); + } } diff --git a/src/main/java/com/kamco/cd/training/postgres/repository/model/ModelConfigRepository.java b/src/main/java/com/kamco/cd/training/postgres/repository/model/ModelConfigRepository.java index 8b0d02e..4974ba7 100644 --- a/src/main/java/com/kamco/cd/training/postgres/repository/model/ModelConfigRepository.java +++ b/src/main/java/com/kamco/cd/training/postgres/repository/model/ModelConfigRepository.java @@ -3,4 +3,5 @@ package com.kamco.cd.training.postgres.repository.model; import com.kamco.cd.training.postgres.entity.ModelConfigEntity; import org.springframework.data.jpa.repository.JpaRepository; -public interface ModelConfigRepository extends JpaRepository {} +public interface ModelConfigRepository + extends JpaRepository, ModelConfigRepositoryCustom {} diff --git a/src/main/java/com/kamco/cd/training/postgres/repository/model/ModelConfigRepositoryCustom.java b/src/main/java/com/kamco/cd/training/postgres/repository/model/ModelConfigRepositoryCustom.java new file mode 100644 index 0000000..53ad7f3 --- /dev/null +++ b/src/main/java/com/kamco/cd/training/postgres/repository/model/ModelConfigRepositoryCustom.java @@ -0,0 +1,8 @@ +package com.kamco.cd.training.postgres.repository.model; + +import com.kamco.cd.training.model.dto.ModelConfigDto; +import java.util.Optional; + +public interface ModelConfigRepositoryCustom { + Optional findModelConfigByModelId(Long modelId); +} diff --git a/src/main/java/com/kamco/cd/training/postgres/repository/model/ModelConfigRepositoryImpl.java b/src/main/java/com/kamco/cd/training/postgres/repository/model/ModelConfigRepositoryImpl.java new file mode 100644 index 0000000..2852218 --- /dev/null +++ b/src/main/java/com/kamco/cd/training/postgres/repository/model/ModelConfigRepositoryImpl.java @@ -0,0 +1,37 @@ +package com.kamco.cd.training.postgres.repository.model; + +import static com.kamco.cd.training.postgres.entity.QModelConfigEntity.modelConfigEntity; + +import com.kamco.cd.training.model.dto.ModelConfigDto.Basic; +import com.querydsl.core.types.Projections; +import com.querydsl.jpa.impl.JPAQueryFactory; +import java.util.Optional; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Repository; + +@Repository +@RequiredArgsConstructor +public class ModelConfigRepositoryImpl implements ModelConfigRepositoryCustom { + + private final JPAQueryFactory queryFactory; + + @Override + public Optional findModelConfigByModelId(Long modelId) { + + return Optional.ofNullable( + queryFactory + .select( + Projections.constructor( + Basic.class, + modelConfigEntity.id, + modelConfigEntity.model.id, + modelConfigEntity.epochCount, + modelConfigEntity.trainPercent, + modelConfigEntity.validationPercent, + modelConfigEntity.testPercent, + modelConfigEntity.memo)) + .from(modelConfigEntity) + .where(modelConfigEntity.model.id.eq(modelId)) + .fetchOne()); + } +}