diff --git a/build.gradle b/build.gradle index bb3df95..8e8f7ea 100644 --- a/build.gradle +++ b/build.gradle @@ -3,6 +3,7 @@ plugins { id 'org.springframework.boot' version '3.5.7' id 'io.spring.dependency-management' version '1.1.7' id 'com.diffplug.spotless' version '6.25.0' + id 'idea' } group = 'com.kamco.cd' @@ -21,11 +22,23 @@ configurations { } } +// QueryDSL 생성된 소스 디렉토리 정의 +def generatedSourcesDir = file("$buildDir/generated/sources/annotationProcessor/java/main") + repositories { mavenCentral() maven { url "https://repo.osgeo.org/repository/release/" } } +// Gradle이 생성된 소스를 컴파일 경로에 포함하도록 설정 +sourceSets { + main { + java { + srcDirs += generatedSourcesDir + } + } +} + dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-web' @@ -87,6 +100,21 @@ dependencies { implementation 'org.apache.commons:commons-csv:1.10.0' } +// IntelliJ가 생성된 소스를 인식하도록 설정 +idea { + module { + // 소스 디렉토리로 인식 + sourceDirs += generatedSourcesDir + + // Generated Sources Root로 마킹 (IntelliJ에서 특별 처리) + generatedSourceDirs += generatedSourcesDir + + // 소스 및 Javadoc 다운로드 + downloadJavadoc = true + downloadSources = true + } +} + configurations.configureEach { exclude group: 'javax.media', module: 'jai_core' } @@ -95,6 +123,21 @@ tasks.named('test') { useJUnitPlatform() } +// 컴파일 전 생성된 소스 디렉토리 생성 보장 +tasks.named('compileJava') { + doFirst { + generatedSourcesDir.mkdirs() + } +} + +// 생성된 소스 정리 태스크 +tasks.register('cleanGeneratedSources', Delete) { + delete generatedSourcesDir +} + +tasks.named('clean') { + dependsOn 'cleanGeneratedSources' +} bootJar { archiveFileName = 'ROOT.jar' diff --git a/src/main/java/com/kamco/cd/training/common/dto/HyperParam.java b/src/main/java/com/kamco/cd/training/common/dto/HyperParam.java index cfc78fc..5175c5f 100644 --- a/src/main/java/com/kamco/cd/training/common/dto/HyperParam.java +++ b/src/main/java/com/kamco/cd/training/common/dto/HyperParam.java @@ -1,5 +1,6 @@ package com.kamco.cd.training.common.dto; +import com.kamco.cd.training.common.enums.ModelType; import io.swagger.v3.oas.annotations.media.Schema; import lombok.AllArgsConstructor; import lombok.Getter; @@ -14,6 +15,10 @@ public class HyperParam { // ------------------------- // Important // ------------------------- + + @Schema(description = "모델", example = "large") + private ModelType model; // backbone + @Schema(description = "백본 네트워크", example = "large") private String backbone; // backbone diff --git a/src/main/java/com/kamco/cd/training/common/enums/ModelType.java b/src/main/java/com/kamco/cd/training/common/enums/ModelType.java index 8eb327d..c78d45b 100644 --- a/src/main/java/com/kamco/cd/training/common/enums/ModelType.java +++ b/src/main/java/com/kamco/cd/training/common/enums/ModelType.java @@ -2,6 +2,7 @@ package com.kamco.cd.training.common.enums; import com.kamco.cd.training.common.utils.enums.CodeExpose; import com.kamco.cd.training.common.utils.enums.EnumType; +import java.util.Arrays; import lombok.AllArgsConstructor; import lombok.Getter; @@ -15,6 +16,13 @@ public enum ModelType implements EnumType { private String desc; + public static ModelType getValueData(String modelNo) { + return Arrays.stream(ModelType.values()) + .filter(m -> m.getId().equals(modelNo)) + .findFirst() + .orElse(G1); + } + @Override public String getId() { return name(); diff --git a/src/main/java/com/kamco/cd/training/hyperparam/HyperParamApiController.java b/src/main/java/com/kamco/cd/training/hyperparam/HyperParamApiController.java index 964ba74..80ce295 100644 --- a/src/main/java/com/kamco/cd/training/hyperparam/HyperParamApiController.java +++ b/src/main/java/com/kamco/cd/training/hyperparam/HyperParamApiController.java @@ -1,6 +1,7 @@ package com.kamco.cd.training.hyperparam; import com.kamco.cd.training.common.dto.HyperParam; +import com.kamco.cd.training.common.enums.ModelType; import com.kamco.cd.training.config.api.ApiResponseDto; import com.kamco.cd.training.hyperparam.dto.HyperParamDto; import com.kamco.cd.training.hyperparam.dto.HyperParamDto.List; @@ -65,7 +66,7 @@ public class HyperParamApiController { mediaType = "application/json", schema = @Schema(implementation = String.class))), @ApiResponse(responseCode = "400", description = "잘못된 요청", content = @Content), - @ApiResponse(responseCode = "422", description = "HPs_0001 수정 불가", content = @Content), + @ApiResponse(responseCode = "422", description = "default는 삭제불가", content = @Content), @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) }) @PutMapping("/{uuid}") @@ -98,8 +99,11 @@ public class HyperParamApiController { LocalDate startDate, @Parameter(description = "종료일", example = "2026-02-28") @RequestParam(required = false) LocalDate endDate, - @Parameter(description = "버전명", example = "HPs_0001") @RequestParam(required = false) + @Parameter(description = "버전명", example = "G_000001") @RequestParam(required = false) String hyperVer, + @Parameter(description = "모델 타입 (G1, G2, G3 중 하나)", example = "G1") + @RequestParam(required = false) + ModelType model, @Parameter( description = "정렬", example = "createdDttm desc", @@ -124,7 +128,7 @@ public class HyperParamApiController { searchReq.setSort(sort); searchReq.setPage(page); searchReq.setSize(size); - Page list = hyperParamService.getHyperParamList(searchReq); + Page list = hyperParamService.getHyperParamList(model, searchReq); return ApiResponseDto.ok(list); } @@ -133,7 +137,7 @@ public class HyperParamApiController { @ApiResponses( value = { @ApiResponse(responseCode = "200", description = "삭제 성공", content = @Content), - @ApiResponse(responseCode = "422", description = "HPs_0001 삭제 불가", content = @Content), + @ApiResponse(responseCode = "422", description = "default 삭제 불가", content = @Content), @ApiResponse(responseCode = "404", description = "하이퍼파라미터를 찾을 수 없음", content = @Content), }) @DeleteMapping("/{uuid}") @@ -179,8 +183,9 @@ public class HyperParamApiController { @ApiResponse(responseCode = "404", description = "하이퍼파라미터를 찾을 수 없음", content = @Content), @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) }) - @GetMapping("/init") - public ApiResponseDto getInitHyperParam() { - return ApiResponseDto.ok(hyperParamService.getInitHyperParam()); + @GetMapping("/init/{model}") + public ApiResponseDto getInitHyperParam(@PathVariable ModelType model) { + + return ApiResponseDto.ok(hyperParamService.getInitHyperParam(model)); } } diff --git a/src/main/java/com/kamco/cd/training/hyperparam/dto/HyperParamDto.java b/src/main/java/com/kamco/cd/training/hyperparam/dto/HyperParamDto.java index 2ed4934..1a46cf1 100644 --- a/src/main/java/com/kamco/cd/training/hyperparam/dto/HyperParamDto.java +++ b/src/main/java/com/kamco/cd/training/hyperparam/dto/HyperParamDto.java @@ -1,5 +1,6 @@ package com.kamco.cd.training.hyperparam.dto; +import com.kamco.cd.training.common.enums.ModelType; import com.kamco.cd.training.common.utils.enums.CodeExpose; import com.kamco.cd.training.common.utils.enums.EnumType; import com.kamco.cd.training.common.utils.interfaces.JsonFormatDttm; @@ -24,6 +25,7 @@ public class HyperParamDto { @AllArgsConstructor public static class Basic { + private ModelType model; // 20250212 modeltype추가 private UUID uuid; private String hyperVer; @JsonFormatDttm private ZonedDateTime createdDttm; @@ -98,6 +100,8 @@ public class HyperParamDto { private Integer gpuCnt; private String gpuIds; private Integer masterPort; + + private Boolean isDefault; } @Getter @@ -106,9 +110,11 @@ public class HyperParamDto { @AllArgsConstructor public static class List { private UUID uuid; + private ModelType model; private String hyperVer; @JsonFormatDttm private ZonedDateTime createDttm; @JsonFormatDttm private ZonedDateTime lastUsedDttm; + private String memo; private Long m1UseCnt; private Long m2UseCnt; private Long m3UseCnt; diff --git a/src/main/java/com/kamco/cd/training/hyperparam/service/HyperParamService.java b/src/main/java/com/kamco/cd/training/hyperparam/service/HyperParamService.java index d738af3..4d355b7 100644 --- a/src/main/java/com/kamco/cd/training/hyperparam/service/HyperParamService.java +++ b/src/main/java/com/kamco/cd/training/hyperparam/service/HyperParamService.java @@ -1,8 +1,10 @@ package com.kamco.cd.training.hyperparam.service; import com.kamco.cd.training.common.dto.HyperParam; +import com.kamco.cd.training.common.enums.ModelType; import com.kamco.cd.training.hyperparam.dto.HyperParamDto; import com.kamco.cd.training.hyperparam.dto.HyperParamDto.List; +import com.kamco.cd.training.hyperparam.dto.HyperParamDto.SearchReq; import com.kamco.cd.training.postgres.core.HyperParamCoreService; import java.util.UUID; import lombok.RequiredArgsConstructor; @@ -20,11 +22,12 @@ public class HyperParamService { /** * 하이퍼 파라미터 목록 조회 * + * @param model * @param req * @return 목록 */ - public Page getHyperParamList(HyperParamDto.SearchReq req) { - return hyperParamCoreService.findByHyperVerList(req); + public Page getHyperParamList(ModelType model, SearchReq req) { + return hyperParamCoreService.findByHyperVerList(model, req); } /** @@ -59,8 +62,8 @@ public class HyperParamService { } /** 하이퍼파라미터 최적화 설정값 조회 */ - public HyperParamDto.Basic getInitHyperParam() { - return hyperParamCoreService.getInitHyperParam(); + public HyperParamDto.Basic getInitHyperParam(ModelType model) { + return hyperParamCoreService.getInitHyperParam(model); } /** 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 016c778..c6fd192 100644 --- a/src/main/java/com/kamco/cd/training/model/ModelTrainMngApiController.java +++ b/src/main/java/com/kamco/cd/training/model/ModelTrainMngApiController.java @@ -74,7 +74,7 @@ public class ModelTrainMngApiController { @ApiResponses( value = { @ApiResponse(responseCode = "200", description = "삭제 성공", content = @Content), - @ApiResponse(responseCode = "409", description = "HPs_0001 삭제 불가", content = @Content) + @ApiResponse(responseCode = "409", description = "G1_000001 삭제 불가", content = @Content) }) @DeleteMapping("/{uuid}") public ApiResponseDto deleteModelTrain( diff --git a/src/main/java/com/kamco/cd/training/postgres/core/HyperParamCoreService.java b/src/main/java/com/kamco/cd/training/postgres/core/HyperParamCoreService.java index 16262e5..e2cf5b1 100644 --- a/src/main/java/com/kamco/cd/training/postgres/core/HyperParamCoreService.java +++ b/src/main/java/com/kamco/cd/training/postgres/core/HyperParamCoreService.java @@ -1,10 +1,12 @@ package com.kamco.cd.training.postgres.core; import com.kamco.cd.training.common.dto.HyperParam; +import com.kamco.cd.training.common.enums.ModelType; import com.kamco.cd.training.common.exception.CustomApiException; import com.kamco.cd.training.common.utils.UserUtil; import com.kamco.cd.training.hyperparam.dto.HyperParamDto; import com.kamco.cd.training.hyperparam.dto.HyperParamDto.Basic; +import com.kamco.cd.training.hyperparam.dto.HyperParamDto.SearchReq; import com.kamco.cd.training.postgres.entity.ModelHyperParamEntity; import com.kamco.cd.training.postgres.repository.hyperparam.HyperParamRepository; import java.time.ZonedDateTime; @@ -17,6 +19,7 @@ import org.springframework.stereotype.Service; @Service @RequiredArgsConstructor public class HyperParamCoreService { + private final HyperParamRepository hyperParamRepository; private final UserUtil userUtil; @@ -27,7 +30,7 @@ public class HyperParamCoreService { * @return 등록된 버전명 */ public Basic createHyperParam(HyperParam createReq) { - String firstVersion = getFirstHyperParamVersion(); + String firstVersion = getFirstHyperParamVersion(createReq.getModel()); ModelHyperParamEntity entity = new ModelHyperParamEntity(); entity.setHyperVer(firstVersion); @@ -57,7 +60,7 @@ public class HyperParamCoreService { .findHyperParamByUuid(uuid) .orElseThrow(() -> new CustomApiException("NOT_FOUND_DATA", HttpStatus.NOT_FOUND)); - if (entity.getHyperVer().equals("HPs_0001")) { + if (entity.getIsDefault()) { throw new CustomApiException("UNPROCESSABLE_ENTITY_UPDATE", HttpStatus.UNPROCESSABLE_ENTITY); } applyHyperParam(entity, createReq); @@ -69,11 +72,112 @@ public class HyperParamCoreService { return entity.getHyperVer(); } + /** + * 하이퍼파라미터 삭제 + * + * @param uuid + */ + public void deleteHyperParam(UUID uuid) { + ModelHyperParamEntity entity = + hyperParamRepository + .findHyperParamByUuid(uuid) + .orElseThrow(() -> new CustomApiException("NOT_FOUND_DATA", HttpStatus.NOT_FOUND)); + + // if (entity.getHyperVer().equals("HPs_0001")) { + // throw new CustomApiException("UNPROCESSABLE_ENTITY", HttpStatus.UNPROCESSABLE_ENTITY); + // } + + // 디폴트면 삭제불가 + if (entity.getIsDefault()) { + throw new CustomApiException("UNPROCESSABLE_ENTITY", HttpStatus.UNPROCESSABLE_ENTITY); + } + + entity.setDelYn(true); + entity.setUpdatedUid(userUtil.getId()); + entity.setUpdatedDttm(ZonedDateTime.now()); + } + + /** + * 하이퍼파라미터 최적화 설정값 조회 + * + * @return + */ + public HyperParamDto.Basic getInitHyperParam(ModelType model) { + ModelHyperParamEntity entity = + hyperParamRepository.getHyperparamByType(model).stream() + .filter(e -> e.getIsDefault() == Boolean.TRUE) + .findFirst() + .orElseThrow(() -> new CustomApiException("NOT_FOUND_DATA", HttpStatus.NOT_FOUND)); + return entity.toDto(); + } + + /** + * 하이퍼파라미터 상세 조회 + * + * @return + */ + public HyperParamDto.Basic getHyperParam(UUID uuid) { + ModelHyperParamEntity entity = + hyperParamRepository + .findHyperParamByUuid(uuid) + .orElseThrow(() -> new CustomApiException("NOT_FOUND_DATA", HttpStatus.NOT_FOUND)); + return entity.toDto(); + } + + /** + * 하이퍼파라미터 목록 조회 + * + * @param model + * @param req + * @return + */ + public Page findByHyperVerList(ModelType model, SearchReq req) { + return hyperParamRepository.findByHyperVerList(model, req); + } + + /** + * 하이퍼파라미터 버전 조회 + * + * @param model 모델 타입 + * @return ver + */ + public String getFirstHyperParamVersion(ModelType model) { + return hyperParamRepository + .findHyperParamVerByModelType(model) + .map(ModelHyperParamEntity::getHyperVer) + .map(ver -> increase(ver, model)) + .orElse(model.name() + "_000001"); + } + + /** + * 하이퍼 파라미터의 버전을 증가시킨다. + * + * @param hyperVer 현재 버전 + * @param modelType 모델 타입 + * @return 증가된 버전 + */ + private String increase(String hyperVer, ModelType modelType) { + String prefix = modelType.name() + "_"; + int num = Integer.parseInt(hyperVer.substring(prefix.length())); + return prefix + String.format("%06d", num + 1); + } + private void applyHyperParam(ModelHyperParamEntity entity, HyperParam src) { + + ModelType model = src.getModel(); + + // 하드코딩 모델별로 다른경우 250212 bbn 하드코딩 + if (model == ModelType.G3) { + entity.setCropSize("512,512"); + } else { + entity.setCropSize("256,256"); + } + // entity.setCropSize(src.getCropSize()); + // Important + entity.setModelType(model); // 20250212 modeltype추가 entity.setBackbone(src.getBackbone()); entity.setInputSize(src.getInputSize()); - entity.setCropSize(src.getCropSize()); entity.setBatchSize(src.getBatchSize()); // Data @@ -110,79 +214,4 @@ public class HyperParamCoreService { // memo entity.setMemo(src.getMemo()); } - - /** - * 하이퍼파라미터 삭제 - * - * @param uuid - */ - public void deleteHyperParam(UUID uuid) { - ModelHyperParamEntity entity = - hyperParamRepository - .findHyperParamByUuid(uuid) - .orElseThrow(() -> new CustomApiException("NOT_FOUND_DATA", HttpStatus.NOT_FOUND)); - - if (entity.getHyperVer().equals("HPs_0001")) { - throw new CustomApiException("UNPROCESSABLE_ENTITY", HttpStatus.UNPROCESSABLE_ENTITY); - } - - entity.setDelYn(true); - entity.setUpdatedUid(userUtil.getId()); - entity.setUpdatedDttm(ZonedDateTime.now()); - } - - /** - * 하이퍼파라미터 최적화 설정값 조회 - * - * @return - */ - public HyperParamDto.Basic getInitHyperParam() { - ModelHyperParamEntity entity = - hyperParamRepository - .findHyperParamByHyperVer("HPs_0001") - .orElseThrow(() -> new CustomApiException("NOT_FOUND_DATA", HttpStatus.NOT_FOUND)); - return entity.toDto(); - } - - /** - * 하이퍼파라미터 상세 조회 - * - * @return - */ - public HyperParamDto.Basic getHyperParam(UUID uuid) { - ModelHyperParamEntity entity = - hyperParamRepository - .findHyperParamByUuid(uuid) - .orElseThrow(() -> new CustomApiException("NOT_FOUND_DATA", HttpStatus.NOT_FOUND)); - return entity.toDto(); - } - - /** - * 하이퍼파라미터 목록 조회 - * - * @param req - * @return - */ - public Page findByHyperVerList(HyperParamDto.SearchReq req) { - return hyperParamRepository.findByHyperVerList(req); - } - - /** - * 하이퍼파라미터 버전 조회 - * - * @return ver - */ - public String getFirstHyperParamVersion() { - return hyperParamRepository - .findHyperParamVer() - .map(ModelHyperParamEntity::getHyperVer) - .map(this::increase) - .orElse("HPs_0001"); - } - - private String increase(String hyperVer) { - String prefix = "HPs_"; - int num = Integer.parseInt(hyperVer.substring(prefix.length())); - return prefix + String.format("%04d", num + 1); - } } 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 0a331d4..c6d3c91 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 @@ -83,9 +83,15 @@ public class ModelTrainMngCoreService { ModelMasterEntity entity = new ModelMasterEntity(); ModelHyperParamEntity hyperParamEntity = new ModelHyperParamEntity(); - // 최적화 파라미터는 HPs_0001 사용 + // 최적화 파라미터는 모델 type의 디폴트사용 if (HyperParamSelectType.OPTIMIZED.getId().equals(addReq.getHyperParamType())) { - hyperParamEntity = hyperParamRepository.findByHyperVer("HPs_0001").orElse(null); + ModelType modelType = ModelType.getValueData(addReq.getModelNo()); + hyperParamEntity = + hyperParamRepository.getHyperparamByType(modelType).stream() + .filter(e -> e.getIsDefault() == Boolean.TRUE) + .findFirst() + .orElse(null); + // hyperParamEntity = hyperParamRepository.findByHyperVer("HPs_0001").orElse(null); } else { hyperParamEntity = diff --git a/src/main/java/com/kamco/cd/training/postgres/entity/ModelHyperParamEntity.java b/src/main/java/com/kamco/cd/training/postgres/entity/ModelHyperParamEntity.java index b1fe789..7f0f215 100644 --- a/src/main/java/com/kamco/cd/training/postgres/entity/ModelHyperParamEntity.java +++ b/src/main/java/com/kamco/cd/training/postgres/entity/ModelHyperParamEntity.java @@ -1,5 +1,6 @@ package com.kamco.cd.training.postgres.entity; +import com.kamco.cd.training.common.enums.ModelType; import com.kamco.cd.training.hyperparam.dto.HyperParamDto; import jakarta.persistence.*; import jakarta.validation.constraints.NotNull; @@ -311,8 +312,16 @@ public class ModelHyperParamEntity { @Column(name = "m3_use_cnt") private Long m3UseCnt = 0L; + @Column(name = "model_type") + @Enumerated(EnumType.STRING) + private ModelType modelType; + + @Column(name = "default_param") + private Boolean isDefault = false; + public HyperParamDto.Basic toDto() { return new HyperParamDto.Basic( + this.modelType, this.uuid, this.hyperVer, this.createdDttm, @@ -385,6 +394,7 @@ public class ModelHyperParamEntity { // ------------------------- this.gpuCnt, this.gpuIds, - this.masterPort); + this.masterPort, + this.isDefault); } } diff --git a/src/main/java/com/kamco/cd/training/postgres/repository/hyperparam/HyperParamRepositoryCustom.java b/src/main/java/com/kamco/cd/training/postgres/repository/hyperparam/HyperParamRepositoryCustom.java index b50511b..9b00aaf 100644 --- a/src/main/java/com/kamco/cd/training/postgres/repository/hyperparam/HyperParamRepositoryCustom.java +++ b/src/main/java/com/kamco/cd/training/postgres/repository/hyperparam/HyperParamRepositoryCustom.java @@ -1,7 +1,10 @@ package com.kamco.cd.training.postgres.repository.hyperparam; +import com.kamco.cd.training.common.enums.ModelType; import com.kamco.cd.training.hyperparam.dto.HyperParamDto; +import com.kamco.cd.training.hyperparam.dto.HyperParamDto.SearchReq; import com.kamco.cd.training.postgres.entity.ModelHyperParamEntity; +import java.util.List; import java.util.Optional; import java.util.UUID; import org.springframework.data.domain.Page; @@ -13,11 +16,22 @@ public interface HyperParamRepositoryCustom { * * @return */ + @Deprecated Optional findHyperParamVer(); + /** + * 모델 타입별 마지막 버전 조회 + * + * @param modelType 모델 타입 + * @return + */ + Optional findHyperParamVerByModelType(ModelType modelType); + Optional findHyperParamByHyperVer(String hyperVer); Optional findHyperParamByUuid(UUID uuid); - Page findByHyperVerList(HyperParamDto.SearchReq req); + Page findByHyperVerList(ModelType model, SearchReq req); + + List getHyperparamByType(ModelType modelType); } diff --git a/src/main/java/com/kamco/cd/training/postgres/repository/hyperparam/HyperParamRepositoryImpl.java b/src/main/java/com/kamco/cd/training/postgres/repository/hyperparam/HyperParamRepositoryImpl.java index 7a2949d..7dcaa2a 100644 --- a/src/main/java/com/kamco/cd/training/postgres/repository/hyperparam/HyperParamRepositoryImpl.java +++ b/src/main/java/com/kamco/cd/training/postgres/repository/hyperparam/HyperParamRepositoryImpl.java @@ -2,8 +2,10 @@ package com.kamco.cd.training.postgres.repository.hyperparam; import static com.kamco.cd.training.postgres.entity.QModelHyperParamEntity.modelHyperParamEntity; +import com.kamco.cd.training.common.enums.ModelType; import com.kamco.cd.training.hyperparam.dto.HyperParamDto; import com.kamco.cd.training.hyperparam.dto.HyperParamDto.HyperType; +import com.kamco.cd.training.hyperparam.dto.HyperParamDto.SearchReq; import com.kamco.cd.training.postgres.entity.ModelHyperParamEntity; import com.querydsl.core.BooleanBuilder; import com.querydsl.core.types.Projections; @@ -41,6 +43,23 @@ public class HyperParamRepositoryImpl implements HyperParamRepositoryCustom { .fetchOne()); } + @Override + public Optional findHyperParamVerByModelType(ModelType modelType) { + + return Optional.ofNullable( + queryFactory + .select(modelHyperParamEntity) + .from(modelHyperParamEntity) + .where( + modelHyperParamEntity + .delYn + .isFalse() + .and(modelHyperParamEntity.modelType.eq(modelType))) + .orderBy(modelHyperParamEntity.hyperVer.desc()) + .limit(1) + .fetchOne()); + } + @Override public Optional findHyperParamByHyperVer(String hyperVer) { @@ -68,10 +87,13 @@ public class HyperParamRepositoryImpl implements HyperParamRepositoryCustom { } @Override - public Page findByHyperVerList(HyperParamDto.SearchReq req) { + public Page findByHyperVerList(ModelType model, SearchReq req) { Pageable pageable = req.toPageable(); BooleanBuilder builder = new BooleanBuilder(); + if (model != null) { + builder.and(modelHyperParamEntity.modelType.eq(model)); + } builder.and(modelHyperParamEntity.delYn.isFalse()); if (req.getHyperVer() != null && !req.getHyperVer().isEmpty()) { @@ -109,9 +131,11 @@ public class HyperParamRepositoryImpl implements HyperParamRepositoryCustom { Projections.constructor( HyperParamDto.List.class, modelHyperParamEntity.uuid, + modelHyperParamEntity.modelType.as("model"), modelHyperParamEntity.hyperVer, modelHyperParamEntity.createdDttm, modelHyperParamEntity.lastUsedDttm, + modelHyperParamEntity.memo, modelHyperParamEntity.m1UseCnt, modelHyperParamEntity.m2UseCnt, modelHyperParamEntity.m3UseCnt, @@ -161,4 +185,17 @@ public class HyperParamRepositoryImpl implements HyperParamRepositoryCustom { return new PageImpl<>(content, pageable, totalCount); } + + @Override + public List getHyperparamByType(ModelType modelType) { + return queryFactory + .select(modelHyperParamEntity) + .from(modelHyperParamEntity) + .where( + modelHyperParamEntity + .delYn + .isFalse() + .and(modelHyperParamEntity.modelType.eq(modelType))) + .fetch(); + } } diff --git a/src/main/resources/application-prod.yml b/src/main/resources/application-prod.yml index 73806e1..2668b13 100644 --- a/src/main/resources/application-prod.yml +++ b/src/main/resources/application-prod.yml @@ -4,7 +4,7 @@ spring: on-profile: prod jpa: - show-sql: false + show-sql: true hibernate: ddl-auto: validate properties: @@ -12,41 +12,40 @@ spring: default_batch_fetch_size: 100 # ✅ 성능 - N+1 쿼리 방지 order_updates: true # ✅ 성능 - 업데이트 순서 정렬로 데드락 방지 use_sql_comments: true # ⚠️ 선택 - SQL에 주석 추가 (디버깅용) + format_sql: true # ⚠️ 선택 - SQL 포맷팅 (가독성) datasource: - url: jdbc:postgresql://10.100.0.10:25432/temp - username: temp - password: temp123! + url: jdbc:postgresql://127.0.01:15432/kamco_training_db + # url: jdbc:postgresql://localhost:15432/kamco_training_db + username: kamco_training_user + password: kamco_training_user_2025_!@# hikari: minimum-idle: 10 maximum-pool-size: 20 + connection-timeout: 60000 # 60초 연결 타임아웃 + idle-timeout: 300000 # 5분 유휴 타임아웃 + max-lifetime: 1800000 # 30분 최대 수명 + leak-detection-threshold: 60000 # 연결 누수 감지 + + transaction: + default-timeout: 300 # 5분 트랜잭션 타임아웃 jwt: - secret: "kamco_token_prod_dfc6446d-68fc-4eba-a2ff-c80a14a0bf3a" + secret: "kamco_token_dev_dfc6446d-68fc-4eba-a2ff-c80a14a0bf3a" access-token-validity-in-ms: 86400000 # 1일 refresh-token-validity-in-ms: 604800000 # 7일 token: refresh-cookie-name: kamco # 개발용 쿠키 이름 - refresh-cookie-secure: true # 로컬 http 테스트면 false + refresh-cookie-secure: false # 로컬 http 테스트면 false + +springdoc: + swagger-ui: + persist-authorization: true # 스웨거 새로고침해도 토큰 유지, 로컬스토리지에 저장 member: init_password: kamco1234! -swagger: - local-port: 9080 - -file: - sync-root-dir: /app/original-images/ - sync-tmp-dir: ${file.sync-root-dir}tmp/ - sync-file-extention: tfw,tif - - dataset-dir: /home/kcomu/data/request/ - dataset-tmp-dir: ${file.dataset-dir}tmp/ - - pt-path: /home/kcomu/data/response/v6-cls-checkpoints/ - pt-FileName: yolov8_6th-6m.pt - train: docker: image: "kamco-cd-train:latest" diff --git a/src/main/resources/db/migration/dump-kamco_training_db-202512261611.sql b/src/main/resources/db/migration/dump-kamco_training_db-202512261611.sql index 16b5869..226df24 100644 --- a/src/main/resources/db/migration/dump-kamco_training_db-202512261611.sql +++ b/src/main/resources/db/migration/dump-kamco_training_db-202512261611.sql @@ -9667,7 +9667,7 @@ INSERT INTO public.tb_audit_log VALUES (1813, 3, 'CREATE', 'SUCCESS', 'SYSTEM', INSERT INTO public.tb_audit_log VALUES (1814, 3, 'READ', 'SUCCESS', 'SYSTEM', '127.0.0.1', NULL, '2025-12-26 00:44:49.832926+00', NULL, '', '/api/models/train'); INSERT INTO public.tb_audit_log VALUES (1815, NULL, 'CREATE', 'FAILED', 'SYSTEM', '127.0.0.1', NULL, '2025-12-26 00:53:40.899603+00', 467, '{ "username": "1234567", - "password":"****" + "password":"****" }', '/api/auth/signin'); INSERT INTO public.tb_audit_log VALUES (1816, NULL, 'CREATE', 'SUCCESS', 'SYSTEM', '127.0.0.1', NULL, '2025-12-26 00:55:27.731595+00', NULL, '{ "username": "1234567", @@ -30396,6 +30396,8 @@ ALTER TABLE ONLY public.tb_menu ADD CONSTRAINT fksw914diut87r7lfykekc7xm2a FOREIGN KEY (parent_menu_uid) REFERENCES public.tb_menu(menu_uid); + + -- Completed on 2025-12-26 16:11:11 KST -- @@ -30404,3 +30406,5 @@ ALTER TABLE ONLY public.tb_menu \unrestrict IYrUYfSgA4Fo2gubHcb84jDXfbBZEIiOZnyLtZgnMi641GaRQa5QDogarpTr7IG + +