This commit is contained in:
2025-12-24 11:17:53 +09:00
parent 72b8a7c41c
commit b91c0dde09
6 changed files with 113 additions and 120 deletions

View File

@@ -32,42 +32,42 @@ public class ModelMngApiController {
@Operation(summary = "모델관리 목록") @Operation(summary = "모델관리 목록")
@GetMapping @GetMapping
public ApiResponseDto<Page<ModelMngDto.ModelList>> findModelMgmtList( public ApiResponseDto<Page<ModelMngDto.ModelList>> findModelMgmtList(
@RequestParam(required = false) LocalDate startDate, @RequestParam(required = false) LocalDate startDate,
@RequestParam(required = false) LocalDate endDate, @RequestParam(required = false) LocalDate endDate,
@RequestParam(required = false, defaultValue = "createCompleteDttm") String sortColumn, @RequestParam(required = false, defaultValue = "createCompleteDttm") String sortColumn,
@RequestParam(required = false) String modelType, @RequestParam(required = false) String modelType,
@RequestParam(required = false) String searchVal, @RequestParam(required = false) String searchVal,
@RequestParam(defaultValue = "0") int page, @RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "20") int size) { @RequestParam(defaultValue = "20") int size) {
ModelMngDto.searchReq searchReq = new ModelMngDto.searchReq(page, size, sortColumn + ",desc"); ModelMngDto.searchReq searchReq = new ModelMngDto.searchReq(page, size, sortColumn + ",desc");
Page<ModelMngDto.ModelList> result = Page<ModelMngDto.ModelList> result =
modelMngService.findModelMgmtList(searchReq, startDate, endDate, modelType, searchVal); modelMngService.findModelMgmtList(searchReq, startDate, endDate, modelType, searchVal);
return ApiResponseDto.ok(result); return ApiResponseDto.ok(result);
} }
@Operation(summary = "삭제", description = "모델을 삭제 합니다.") @Operation(summary = "삭제", description = "모델을 삭제 합니다.")
@ApiResponses( @ApiResponses(
value = { value = {
@ApiResponse( @ApiResponse(
responseCode = "204", responseCode = "204",
description = "모델 삭제 성공", description = "모델 삭제 성공",
content = content =
@Content( @Content(
mediaType = "application/json", mediaType = "application/json",
schema = @Schema(implementation = Long.class))), schema = @Schema(implementation = Long.class))),
@ApiResponse(responseCode = "400", description = "잘못된 요청 데이터", content = @Content), @ApiResponse(responseCode = "400", description = "잘못된 요청 데이터", content = @Content),
@ApiResponse(responseCode = "404", description = "코드를 찾을 수 없음", content = @Content), @ApiResponse(responseCode = "404", description = "코드를 찾을 수 없음", content = @Content),
@ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content)
}) })
@DeleteMapping("/{modelVer}") @DeleteMapping("/{modelVer}")
public ApiResponseDto<ApiResponseDto.ResponseObj> removeModel( public ApiResponseDto<ApiResponseDto.ResponseObj> removeModel(
@io.swagger.v3.oas.annotations.parameters.RequestBody( @io.swagger.v3.oas.annotations.parameters.RequestBody(
description = "모델 삭제 요청 정보", description = "모델 삭제 요청 정보",
required = true) required = true)
@PathVariable @PathVariable
String modelVer) { String modelVer) {
return ApiResponseDto.okObject(modelMngService.removeModel(modelVer)); return ApiResponseDto.okObject(modelMngService.removeModel(modelVer));
} }
} }

View File

@@ -45,17 +45,13 @@ public class ModelMngDto {
private Long modelUid; private Long modelUid;
private String modelVer; private String modelVer;
@JsonFormatDttm @JsonFormatDttm private ZonedDateTime createCompleteDttm;
private ZonedDateTime createCompleteDttm; @JsonFormatDttm private ZonedDateTime recentUseDttm;
@JsonFormatDttm
private ZonedDateTime recentUseDttm;
private Boolean deleted; private Boolean deleted;
@JsonFormatDttm @JsonFormatDttm private ZonedDateTime createdDttm;
private ZonedDateTime createdDttm;
private Long createdUid; private Long createdUid;
@JsonFormatDttm @JsonFormatDttm private ZonedDateTime updatedDttm;
private ZonedDateTime updatedDttm;
private Long updatedUid; private Long updatedUid;
private String modelType; private String modelType;
@@ -64,20 +60,19 @@ public class ModelMngDto {
private String memo; private String memo;
public Basic( public Basic(
Long modelUid, Long modelUid,
String modelVer, String modelVer,
ZonedDateTime createCompleteDttm, ZonedDateTime createCompleteDttm,
ZonedDateTime recentUseDttm, ZonedDateTime recentUseDttm,
Boolean deleted, Boolean deleted,
ZonedDateTime createdDttm, ZonedDateTime createdDttm,
Long createdUid, Long createdUid,
ZonedDateTime updatedDttm, ZonedDateTime updatedDttm,
Long updatedUid, Long updatedUid,
String modelType, String modelType,
String filePath, String filePath,
String fileName, String fileName,
String memo String memo) {
) {
this.modelUid = modelUid; this.modelUid = modelUid;
this.modelVer = modelVer; this.modelVer = modelVer;
this.createCompleteDttm = createCompleteDttm; this.createCompleteDttm = createCompleteDttm;
@@ -146,7 +141,7 @@ public class ModelMngDto {
String[] sortParams = sort.split(","); String[] sortParams = sort.split(",");
String property = sortParams[0]; String property = sortParams[0];
Sort.Direction direction = Sort.Direction direction =
sortParams.length > 1 ? Sort.Direction.fromString(sortParams[1]) : Sort.Direction.ASC; sortParams.length > 1 ? Sort.Direction.fromString(sortParams[1]) : Sort.Direction.ASC;
return PageRequest.of(page, size, Sort.by(direction, property)); return PageRequest.of(page, size, Sort.by(direction, property));
} }
return PageRequest.of(page, size); return PageRequest.of(page, size);

View File

@@ -15,17 +15,16 @@ public class ModelMngService {
private final ModelMngCoreService modelMngCoreService; private final ModelMngCoreService modelMngCoreService;
public Page<ModelMngDto.ModelList> findModelMgmtList( public Page<ModelMngDto.ModelList> findModelMgmtList(
ModelMngDto.searchReq searchReq, ModelMngDto.searchReq searchReq,
LocalDate startDate, LocalDate startDate,
LocalDate endDate, LocalDate endDate,
String modelType, String modelType,
String searchVal) { String searchVal) {
return modelMngCoreService.findModelMgmtList( return modelMngCoreService.findModelMgmtList(
searchReq, startDate, endDate, modelType, searchVal); searchReq, startDate, endDate, modelType, searchVal);
} }
public ApiResponseDto.ResponseObj removeModel(String modelVer) { public ApiResponseDto.ResponseObj removeModel(String modelVer) {
return modelMngCoreService.removeModel(modelVer); return modelMngCoreService.removeModel(modelVer);
} }
} }

View File

@@ -27,7 +27,7 @@ public class ModelMngEntity extends CommonDateEntity {
@Column(name = "create_complete_dttm") @Column(name = "create_complete_dttm")
private ZonedDateTime createCompleteDttm; private ZonedDateTime createCompleteDttm;
@Column(name = "recent_use_dttm") @Column(name = "recent_use_dttm")
private ZonedDateTime recentUseDttm; private ZonedDateTime recentUseDttm;

View File

@@ -9,12 +9,11 @@ import org.springframework.data.domain.Page;
public interface ModelMngRepositoryCustom { public interface ModelMngRepositoryCustom {
Page<ModelMngDto.ModelList> findModelMgmtList( Page<ModelMngDto.ModelList> findModelMgmtList(
ModelMngDto.searchReq searchReq, ModelMngDto.searchReq searchReq,
LocalDate startDate, LocalDate startDate,
LocalDate endDate, LocalDate endDate,
String modelType, String modelType,
String searchVal); String searchVal);
Optional<ModelMngEntity> findByModelUid(String modelVer); Optional<ModelMngEntity> findByModelUid(String modelVer);
} }

View File

@@ -29,7 +29,7 @@ import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport;
public class ModelMngRepositoryImpl extends QuerydslRepositorySupport public class ModelMngRepositoryImpl extends QuerydslRepositorySupport
implements ModelMngRepositoryCustom { implements ModelMngRepositoryCustom {
private final JPAQueryFactory queryFactory; private final JPAQueryFactory queryFactory;
private final StringExpression NULL_STRING = Expressions.stringTemplate("cast(null as text)"); private final StringExpression NULL_STRING = Expressions.stringTemplate("cast(null as text)");
@@ -41,19 +41,19 @@ public class ModelMngRepositoryImpl extends QuerydslRepositorySupport
@Override @Override
public Page<ModelMngDto.ModelList> findModelMgmtList( public Page<ModelMngDto.ModelList> findModelMgmtList(
ModelMngDto.searchReq searchReq, ModelMngDto.searchReq searchReq,
LocalDate startDate, LocalDate startDate,
LocalDate endDate, LocalDate endDate,
String modelType, String modelType,
String searchVal) { String searchVal) {
Pageable pageable = searchReq.toPageable(); Pageable pageable = searchReq.toPageable();
Sort sort = pageable.getSort(); Sort sort = pageable.getSort();
String property = "createCompleteDttm"; // 기본으로 생성완료일 기준 String property = "createCompleteDttm"; // 기본으로 생성완료일 기준
Map<String, Expression<?>> sortColumnMap = Map<String, Expression<?>> sortColumnMap =
Map.of( Map.of(
"createCompleteDttm", modelMngEntity.createCompleteDttm, "createCompleteDttm", modelMngEntity.createCompleteDttm,
"recentUseDttm", modelMngEntity.recentUseDttm); "recentUseDttm", modelMngEntity.recentUseDttm);
if (sort.isSorted()) { if (sort.isSorted()) {
Sort.Order order = sort.iterator().next(); Sort.Order order = sort.iterator().next();
@@ -63,46 +63,46 @@ public class ModelMngRepositoryImpl extends QuerydslRepositorySupport
Expression<?> sortColumn = sortColumnMap.get(property); Expression<?> sortColumn = sortColumnMap.get(property);
List<ModelMngDto.ModelList> foundContent = List<ModelMngDto.ModelList> foundContent =
queryFactory queryFactory
.select( .select(
Projections.constructor( Projections.constructor(
ModelMngDto.ModelList.class, ModelMngDto.ModelList.class,
Expressions.numberTemplate( Expressions.numberTemplate(
Integer.class, "row_number() over(order by {0} desc)", sortColumn), Integer.class, "row_number() over(order by {0} desc)", sortColumn),
modelMngEntity.modelVer, modelMngEntity.modelVer,
modelMngEntity.fileName, modelMngEntity.fileName,
modelMngEntity.modelType, modelMngEntity.modelType,
Expressions.stringTemplate( Expressions.stringTemplate(
"to_char({0}, 'YYYY-MM-DD')", modelMngEntity.createCompleteDttm), "to_char({0}, 'YYYY-MM-DD')", modelMngEntity.createCompleteDttm),
roundNumericToPercent(modelResultMetricEntity.f1Score), roundNumericToPercent(modelResultMetricEntity.f1Score),
roundNumericToPercent(modelResultMetricEntity.precision), roundNumericToPercent(modelResultMetricEntity.precision),
roundNumericToPercent(modelResultMetricEntity.recall), roundNumericToPercent(modelResultMetricEntity.recall),
roundNumericToPercent(modelResultMetricEntity.loss), roundNumericToPercent(modelResultMetricEntity.loss),
roundNumericToPercent(modelResultMetricEntity.iou), roundNumericToPercent(modelResultMetricEntity.iou),
modelMngEntity.memo, modelMngEntity.memo,
modelMngEntity.deleted)) modelMngEntity.deleted))
.from(modelMngEntity) .from(modelMngEntity)
.innerJoin(modelResultMetricEntity) .innerJoin(modelResultMetricEntity)
.on(modelMngEntity.modelUid.eq(modelResultMetricEntity.modelUid)) .on(modelMngEntity.modelUid.eq(modelResultMetricEntity.modelUid))
.where( .where(
eventEndedAtBetween(startDate, endDate, property), eventEndedAtBetween(startDate, endDate, property),
searchModelVersion(modelType, searchVal), searchModelVersion(modelType, searchVal),
modelMngEntity.deleted.isFalse().or(modelMngEntity.deleted.isNull())) modelMngEntity.deleted.isFalse().or(modelMngEntity.deleted.isNull()))
.offset(pageable.getOffset()) .offset(pageable.getOffset())
.limit(pageable.getPageSize()) .limit(pageable.getPageSize())
.orderBy( .orderBy(
QuerydslOrderUtil.getOrderSpecifiers( QuerydslOrderUtil.getOrderSpecifiers(
pageable, ModelMngEntity.class, "modelMngEntity")) pageable, ModelMngEntity.class, "modelMngEntity"))
.fetch(); .fetch();
Long countQuery = Long countQuery =
queryFactory queryFactory
.select(modelMngEntity.modelUid.count()) .select(modelMngEntity.modelUid.count())
.from(modelMngEntity) .from(modelMngEntity)
.where( .where(
eventEndedAtBetween(startDate, endDate, property), eventEndedAtBetween(startDate, endDate, property),
searchModelVersion(modelType, searchVal)) searchModelVersion(modelType, searchVal))
.fetchOne(); .fetchOne();
return new PageImpl<>(foundContent, pageable, countQuery); return new PageImpl<>(foundContent, pageable, countQuery);
} }
@@ -110,14 +110,14 @@ public class ModelMngRepositoryImpl extends QuerydslRepositorySupport
@Override @Override
public Optional<ModelMngEntity> findByModelUid(String modelVer) { public Optional<ModelMngEntity> findByModelUid(String modelVer) {
return Optional.ofNullable( return Optional.ofNullable(
queryFactory queryFactory
.selectFrom(modelMngEntity) .selectFrom(modelMngEntity)
.where(modelMngEntity.modelVer.eq(modelVer)) .where(modelMngEntity.modelVer.eq(modelVer))
.fetchOne()); .fetchOne());
} }
private BooleanExpression eventEndedAtBetween( private BooleanExpression eventEndedAtBetween(
LocalDate startDate, LocalDate endDate, String sortColumn) { LocalDate startDate, LocalDate endDate, String sortColumn) {
if (Objects.isNull(startDate) || Objects.isNull(endDate)) { if (Objects.isNull(startDate) || Objects.isNull(endDate)) {
return null; return null;
} }
@@ -127,14 +127,14 @@ public class ModelMngRepositoryImpl extends QuerydslRepositorySupport
if (sortColumn.equals("createCompleteDttm")) { if (sortColumn.equals("createCompleteDttm")) {
return modelMngEntity return modelMngEntity
.createCompleteDttm .createCompleteDttm
.goe(startDateTime.atZone(zone)) .goe(startDateTime.atZone(zone))
.and(modelMngEntity.createCompleteDttm.lt(endDateTime.atZone(zone))); .and(modelMngEntity.createCompleteDttm.lt(endDateTime.atZone(zone)));
} else { } else {
return modelMngEntity return modelMngEntity
.recentUseDttm .recentUseDttm
.goe(startDateTime.atZone(zone)) .goe(startDateTime.atZone(zone))
.and(modelMngEntity.recentUseDttm.lt(endDateTime.atZone(zone))); .and(modelMngEntity.recentUseDttm.lt(endDateTime.atZone(zone)));
} }
} }