From 88f49026b4f5b4c34bd6be4d7cbfbe2b8e03b9c9 Mon Sep 17 00:00:00 2001 From: teddy Date: Fri, 12 Dec 2025 10:34:32 +0900 Subject: [PATCH 1/7] =?UTF-8?q?=EC=82=AC=EC=9A=A9=EC=9E=90=20=EC=B4=88?= =?UTF-8?q?=EA=B8=B0=ED=99=94=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kamcoback/postgres/core/MembersCoreService.java | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/core/MembersCoreService.java b/src/main/java/com/kamco/cd/kamcoback/postgres/core/MembersCoreService.java index 77039d5a..8ef00a36 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/core/MembersCoreService.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/core/MembersCoreService.java @@ -46,7 +46,7 @@ public class MembersCoreService { MemberEntity memberEntity = new MemberEntity(); memberEntity.setUserId(addReq.getUserId()); memberEntity.setUserRole(addReq.getUserRole()); - memberEntity.setTempPassword(addReq.getTempPassword()); // 임시 패스워드는 암호화 하지 않음 + memberEntity.setTempPassword(addReq.getTempPassword().trim()); // 임시 패스워드는 암호화 하지 않음 memberEntity.setPassword(hashedPassword); memberEntity.setName(addReq.getName()); memberEntity.setEmployeeNo(addReq.getEmployeeNo()); @@ -71,7 +71,14 @@ public class MembersCoreService { // 임시 패스워드는 암호화 하지 않음 if (StringUtils.isNotBlank(updateReq.getTempPassword())) { - memberEntity.setTempPassword(updateReq.getTempPassword()); + // 임시 패스워드가 기존과 다르면 패스워드 변경으로 처리함 + // 상태 INACTIVE로 변경하여 사용자가 로그인할때 패스워드 변경하게함 + // 패스워드 리셋이므로 로그인 실패카운트 초기화처리함 + if (!memberEntity.getTempPassword().equals(updateReq.getTempPassword().trim())) { + memberEntity.setStatus(StatusType.INACTIVE.getId()); + memberEntity.setLoginFailCount(0); + } + memberEntity.setTempPassword(updateReq.getTempPassword().trim()); } if (StringUtils.isNotBlank(memberEntity.getEmployeeNo())) { From baf6ca775862eafe3a762656bff3439176a09165 Mon Sep 17 00:00:00 2001 From: teddy Date: Fri, 12 Dec 2025 10:49:47 +0900 Subject: [PATCH 2/7] =?UTF-8?q?=EB=B9=84=ED=99=9C=EC=84=B1=20=EC=83=81?= =?UTF-8?q?=ED=83=9C=20=ED=8C=A8=EC=8A=A4=EC=9B=8C=EB=93=9C=20=EB=B9=84?= =?UTF-8?q?=EA=B5=90=20=EC=A0=80=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../cd/kamcoback/members/AuthController.java | 24 ++++++++++++++----- .../members/service/AuthService.java | 10 ++++++++ .../postgres/core/MembersCoreService.java | 15 ++++++++++++ 3 files changed, 43 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/kamco/cd/kamcoback/members/AuthController.java b/src/main/java/com/kamco/cd/kamcoback/members/AuthController.java index 8596df04..5487bc2d 100644 --- a/src/main/java/com/kamco/cd/kamcoback/members/AuthController.java +++ b/src/main/java/com/kamco/cd/kamcoback/members/AuthController.java @@ -3,6 +3,9 @@ package com.kamco.cd.kamcoback.members; import com.kamco.cd.kamcoback.auth.CustomUserDetails; import com.kamco.cd.kamcoback.auth.JwtTokenProvider; import com.kamco.cd.kamcoback.auth.RefreshTokenService; +import com.kamco.cd.kamcoback.common.enums.StatusType; +import com.kamco.cd.kamcoback.common.enums.error.AuthErrorCode; +import com.kamco.cd.kamcoback.common.exception.CustomApiException; import com.kamco.cd.kamcoback.config.api.ApiResponseDto; import com.kamco.cd.kamcoback.members.dto.MembersDto; import com.kamco.cd.kamcoback.members.dto.SignInRequest; @@ -104,16 +107,25 @@ public class AuthController { SignInRequest request, HttpServletResponse response) { - Authentication authentication = - authenticationManager.authenticate( - new UsernamePasswordAuthenticationToken(request.getUsername(), request.getPassword())); - + // 사용자 상태 조회 String status = authService.getUserStatus(request); - + Authentication authentication = null; MembersDto.Member member = new MembersDto.Member(); + // 비활성 상태면 임시패스워드를 비교함 + if (StatusType.INACTIVE.getId().equals(status)) { + if (!authService.isTempPasswordValid(request)) { + throw new CustomApiException(AuthErrorCode.LOGIN_PASSWORD_MISMATCH); + } + } else { + authentication = + authenticationManager.authenticate( + new UsernamePasswordAuthenticationToken( + request.getUsername(), request.getPassword())); + } + // INACTIVE 비활성 상태(새로운 패스워드 입력 해야함), DELETED 탈퇴 - if (!"ACTIVE".equals(status)) { + if (!StatusType.ACTIVE.getId().equals(status)) { return ApiResponseDto.ok(new TokenResponse(status, null, null, member)); } diff --git a/src/main/java/com/kamco/cd/kamcoback/members/service/AuthService.java b/src/main/java/com/kamco/cd/kamcoback/members/service/AuthService.java index 287bc99b..7220ae34 100644 --- a/src/main/java/com/kamco/cd/kamcoback/members/service/AuthService.java +++ b/src/main/java/com/kamco/cd/kamcoback/members/service/AuthService.java @@ -33,4 +33,14 @@ public class AuthService { public String getUserStatus(SignInRequest request) { return membersCoreService.getUserStatus(request); } + + /** + * 임시 패스워드 비교 + * + * @param request + * @return + */ + public boolean isTempPasswordValid(SignInRequest request) { + return membersCoreService.isTempPasswordValid(request); + } } diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/core/MembersCoreService.java b/src/main/java/com/kamco/cd/kamcoback/postgres/core/MembersCoreService.java index 8ef00a36..4ddb2490 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/core/MembersCoreService.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/core/MembersCoreService.java @@ -152,6 +152,21 @@ public class MembersCoreService { return memberEntity.getStatus(); } + /** + * 임시 패스워드 비교 + * + * @param request + * @return + */ + public boolean isTempPasswordValid(SignInRequest request) { + MemberEntity memberEntity = + membersRepository + .findByUserId(request.getUsername()) + .orElseThrow(MemberNotFoundException::new); + + return memberEntity.getTempPassword().equals(request.getPassword().trim()); + } + /** * 최초 로그인 저장 마지막 로그인 저장 * From a2319709039e591c297a6150ce088cfd328ac820 Mon Sep 17 00:00:00 2001 From: DanielLee <198891672+sanghyeonhd@users.noreply.github.com> Date: Fri, 12 Dec 2025 11:03:07 +0900 Subject: [PATCH 3/7] =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20=EC=97=85=EB=A1=9C?= =?UTF-8?q?=EB=93=9C=20=ED=8C=9D=EC=97=85,=20=EC=A4=91=EB=B3=B5=ED=8C=8C?= =?UTF-8?q?=EC=9D=BC=20=EC=A0=9C=EA=B1=B0=20=ED=8C=9D=EC=97=85=20=EA=B8=B0?= =?UTF-8?q?=EB=8A=A5=20=EC=A0=81=EC=9A=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mapsheet/MapSheetMngApiController.java | 97 +++++++++++-------- .../mapsheet/dto/MapSheetMngDto.java | 12 ++- .../mapsheet/service/MapSheetMngService.java | 95 ++++++++++-------- .../postgres/core/MapSheetMngCoreService.java | 73 +++++++++++--- 4 files changed, 179 insertions(+), 98 deletions(-) diff --git a/src/main/java/com/kamco/cd/kamcoback/mapsheet/MapSheetMngApiController.java b/src/main/java/com/kamco/cd/kamcoback/mapsheet/MapSheetMngApiController.java index 03f478b7..781c92d7 100644 --- a/src/main/java/com/kamco/cd/kamcoback/mapsheet/MapSheetMngApiController.java +++ b/src/main/java/com/kamco/cd/kamcoback/mapsheet/MapSheetMngApiController.java @@ -15,7 +15,9 @@ import jakarta.validation.Valid; import java.util.List; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Page; +import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; @Tag(name = "영상 관리", description = "영상 관리 API") @RestController @@ -34,70 +36,85 @@ public class MapSheetMngApiController { */ @PostMapping("/error-list") public ApiResponseDto> findMapSheetErrorList( - @RequestBody @Valid MapSheetMngDto.searchReq searchReq) { + @RequestBody @Valid MapSheetMngDto.searchReq searchReq) { return ApiResponseDto.ok(mapSheetMngService.findMapSheetErrorList(searchReq)); } @Operation(summary = "영상데이터관리목록 조회", description = "영상데이터관리목록 조회") @ApiResponses( - value = { - @ApiResponse( - responseCode = "200", - description = "조회 성공", - content = - @Content( - mediaType = "application/json", - schema = @Schema(implementation = CommonCodeDto.Basic.class))), - @ApiResponse(responseCode = "404", description = "코드를 찾을 수 없음", content = @Content), - @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) - }) + value = { + @ApiResponse( + responseCode = "200", + description = "조회 성공", + content = + @Content( + mediaType = "application/json", + schema = @Schema(implementation = CommonCodeDto.Basic.class))), + @ApiResponse(responseCode = "404", description = "코드를 찾을 수 없음", content = @Content), + @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) + }) @PostMapping("/mng-list") public ApiResponseDto> findMapSheetMngList( - @RequestBody @Valid MapSheetMngDto.searchReq searchReq) { + @RequestBody @Valid MapSheetMngDto.searchReq searchReq) { return ApiResponseDto.ok(mapSheetMngService.findMapSheetMngList(searchReq)); } @Operation(summary = "영상관리 > 데이터 등록", description = "영상관리 > 데이터 등록") @ApiResponses( - value = { - @ApiResponse( - responseCode = "201", - description = "데이터 등록 성공", - content = - @Content( - mediaType = "application/json", - schema = @Schema(implementation = Long.class))), - @ApiResponse(responseCode = "400", description = "잘못된 요청 데이터", content = @Content), - @ApiResponse(responseCode = "404", description = "데이터를 찾을 수 없음", content = @Content), - @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) - }) + value = { + @ApiResponse( + responseCode = "201", + description = "데이터 등록 성공", + content = + @Content( + mediaType = "application/json", + schema = @Schema(implementation = Long.class))), + @ApiResponse(responseCode = "400", description = "잘못된 요청 데이터", content = @Content), + @ApiResponse(responseCode = "404", description = "데이터를 찾을 수 없음", content = @Content), + @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) + }) @PutMapping("/mng-data-save") public ApiResponseDto mngDataSave( - @RequestBody @Valid MapSheetMngDto.AddReq AddReq) { + @RequestBody @Valid MapSheetMngDto.AddReq AddReq) { return ApiResponseDto.ok(mapSheetMngService.mngDataSave(AddReq)); } + @Operation(summary = "파일 업로드", description = "파일 업로드") + @PostMapping(value = "/file-upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) + public ApiResponseDto uploadFile( + @RequestPart(value = "file") MultipartFile file, + @RequestParam(value = "hstUid") Long hstUid) { + return ApiResponseDto.ok(mapSheetMngService.uploadFile(file, hstUid)); + } + + @Operation(summary = "파일 삭제", description = "파일 삭제") + @PostMapping("/file-delete") + public ApiResponseDto deleteFile( + @RequestBody @Valid MapSheetMngDto.DeleteFileReq req) { + return ApiResponseDto.ok(mapSheetMngService.deleteFile(req)); + } + /** * @param hstUidList * @return */ @Operation(summary = "오류데이터 팝업 > 업로드 처리", description = "오류데이터 팝업 > 업로드 처리") @ApiResponses( - value = { - @ApiResponse( - responseCode = "201", - description = "공통코드 저장 성공", - content = - @Content( - mediaType = "application/json", - schema = @Schema(implementation = Long.class))), - @ApiResponse(responseCode = "400", description = "잘못된 요청 데이터", content = @Content), - @ApiResponse(responseCode = "404", description = "코드를 찾을 수 없음", content = @Content), - @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) - }) + value = { + @ApiResponse( + responseCode = "201", + description = "공통코드 저장 성공", + content = + @Content( + mediaType = "application/json", + schema = @Schema(implementation = Long.class))), + @ApiResponse(responseCode = "400", description = "잘못된 요청 데이터", content = @Content), + @ApiResponse(responseCode = "404", description = "코드를 찾을 수 없음", content = @Content), + @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) + }) @PutMapping("/upload-process") public ApiResponseDto uploadProcess( - @RequestBody @Valid List hstUidList) { + @RequestBody @Valid List hstUidList) { return ApiResponseDto.ok(mapSheetMngService.uploadProcess(hstUidList)); } @@ -108,7 +125,7 @@ public class MapSheetMngApiController { @Operation(summary = "오류데이터 팝업 > 추론 제외", description = "오류데이터 팝업 > 추론 제외") @PutMapping("/except-inference") public ApiResponseDto updateExceptUseInference( - @RequestBody @Valid List hstUidList) { + @RequestBody @Valid List hstUidList) { return ApiResponseDto.ok(mapSheetMngService.updateExceptUseInference(hstUidList)); } } diff --git a/src/main/java/com/kamco/cd/kamcoback/mapsheet/dto/MapSheetMngDto.java b/src/main/java/com/kamco/cd/kamcoback/mapsheet/dto/MapSheetMngDto.java index aaf6594a..ad61bbec 100644 --- a/src/main/java/com/kamco/cd/kamcoback/mapsheet/dto/MapSheetMngDto.java +++ b/src/main/java/com/kamco/cd/kamcoback/mapsheet/dto/MapSheetMngDto.java @@ -42,7 +42,7 @@ public class MapSheetMngDto { String[] sortParams = sort.split(","); String property = sortParams[0]; 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); @@ -77,6 +77,16 @@ public class MapSheetMngDto { private String mngPath; } + @Schema(name = "DeleteFileReq", description = "파일 삭제 요청") + @Getter + @Setter + @NoArgsConstructor + @AllArgsConstructor + public static class DeleteFileReq { + @Schema(description = "파일 경로", example = "/app/original-images/2024/00000001.tif") + private String filePath; + } + @Schema(name = "MngDto", description = "영상관리 검색 리턴") @Getter @Setter diff --git a/src/main/java/com/kamco/cd/kamcoback/mapsheet/service/MapSheetMngService.java b/src/main/java/com/kamco/cd/kamcoback/mapsheet/service/MapSheetMngService.java index b898b607..34ec4ba0 100644 --- a/src/main/java/com/kamco/cd/kamcoback/mapsheet/service/MapSheetMngService.java +++ b/src/main/java/com/kamco/cd/kamcoback/mapsheet/service/MapSheetMngService.java @@ -29,6 +29,7 @@ import org.apache.commons.io.FilenameUtils; import org.springframework.data.domain.Page; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; @Service @RequiredArgsConstructor @@ -82,8 +83,8 @@ public class MapSheetMngService { String lastModified = dttmFormat.format(new Date(file.lastModified())); files.add( - new FileDto.Basic( - fileName, parentFolderNm, parentPath, fullPath, ext, fileSize, lastModified)); + new FileDto.Basic( + fileName, parentFolderNm, parentPath, fullPath, ext, fileSize, lastModified)); fileTotCnt = fileTotCnt + 1; fileTotSize = fileTotSize + fileSize; @@ -119,35 +120,35 @@ public class MapSheetMngService { try (Stream stream = Files.walk(startPath, maxDepth)) { fileDtoList = - stream - .filter(Files::isRegularFile) - .filter( - p -> - extension == null - || extension.equals("") - || extension.equals("*") - || targetExtensions.contains(extractExtension(p))) - .sorted(getFileComparator(sortType)) - .skip(startPos) - .limit(limit) - .map( - path -> { - int depth = path.getNameCount(); + stream + .filter(Files::isRegularFile) + .filter( + p -> + extension == null + || extension.equals("") + || extension.equals("*") + || targetExtensions.contains(extractExtension(p))) + .sorted(getFileComparator(sortType)) + .skip(startPos) + .limit(limit) + .map( + path -> { + int depth = path.getNameCount(); - String fileNm = path.getFileName().toString(); - String ext = FilenameUtils.getExtension(fileNm); - String parentFolderNm = path.getParent().getFileName().toString(); - String parentPath = path.getParent().toString(); - String fullPath = path.toAbsolutePath().toString(); + String fileNm = path.getFileName().toString(); + String ext = FilenameUtils.getExtension(fileNm); + String parentFolderNm = path.getParent().getFileName().toString(); + String parentPath = path.getParent().toString(); + String fullPath = path.toAbsolutePath().toString(); - File file = new File(fullPath); - long fileSize = file.length(); - String lastModified = dttmFormat.format(new Date(file.lastModified())); + File file = new File(fullPath); + long fileSize = file.length(); + String lastModified = dttmFormat.format(new Date(file.lastModified())); - return new FileDto.Basic( - fileNm, parentFolderNm, parentPath, fullPath, ext, fileSize, lastModified); - }) - .collect(Collectors.toList()); + return new FileDto.Basic( + fileNm, parentFolderNm, parentPath, fullPath, ext, fileSize, lastModified); + }) + .collect(Collectors.toList()); fileTotCnt = fileDtoList.size(); fileTotSize = fileDtoList.stream().mapToLong(FileDto.Basic::getFileSize).sum(); @@ -166,10 +167,10 @@ public class MapSheetMngService { // "java, class" -> ["java", " class"] -> [".java", ".class"] return Arrays.stream(extensionString.split(",")) - .map(ext -> ext.trim()) - .filter(ext -> !ext.isEmpty()) - .map(ext -> "." + ext.toLowerCase()) - .collect(Collectors.toSet()); + .map(ext -> ext.trim()) + .filter(ext -> !ext.isEmpty()) + .map(ext -> "." + ext.toLowerCase()) + .collect(Collectors.toSet()); } public String extractExtension(Path path) { @@ -189,17 +190,17 @@ public class MapSheetMngService { // 파일 이름 비교 기본 Comparator (대소문자 무시) Comparator nameComparator = - Comparator.comparing(path -> path.getFileName().toString(), CASE_INSENSITIVE_ORDER); + Comparator.comparing(path -> path.getFileName().toString(), CASE_INSENSITIVE_ORDER); Comparator dateComparator = - Comparator.comparing( - path -> { - try { - return Files.getLastModifiedTime(path); - } catch (IOException e) { - return FileTime.fromMillis(0); - } - }); + Comparator.comparing( + path -> { + try { + return Files.getLastModifiedTime(path); + } catch (IOException e) { + return FileTime.fromMillis(0); + } + }); if ("name desc".equalsIgnoreCase(sortType)) { return nameComparator.reversed(); @@ -213,12 +214,12 @@ public class MapSheetMngService { } public Page findMapSheetErrorList( - MapSheetMngDto.@Valid searchReq searchReq) { + MapSheetMngDto.@Valid searchReq searchReq) { return mapSheetMngCoreService.findMapSheetErrorList(searchReq); } public Page findMapSheetMngList( - MapSheetMngDto.@Valid searchReq searchReq) { + MapSheetMngDto.@Valid searchReq searchReq) { return mapSheetMngCoreService.findMapSheetMngList(searchReq); } @@ -226,6 +227,14 @@ public class MapSheetMngService { return mapSheetMngCoreService.mngDataSave(AddReq); } + public MapSheetMngDto.DmlReturn uploadFile(MultipartFile file, Long hstUid) { + return mapSheetMngCoreService.uploadFile(file, hstUid); + } + + public MapSheetMngDto.DmlReturn deleteFile(MapSheetMngDto.DeleteFileReq req) { + return mapSheetMngCoreService.deleteFile(req); + } + public MapSheetMngDto.DmlReturn uploadProcess(@Valid List hstUidList) { return mapSheetMngCoreService.uploadProcess(hstUidList); } diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/core/MapSheetMngCoreService.java b/src/main/java/com/kamco/cd/kamcoback/postgres/core/MapSheetMngCoreService.java index c3d6c494..d258a1aa 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/core/MapSheetMngCoreService.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/core/MapSheetMngCoreService.java @@ -20,6 +20,7 @@ import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.domain.Page; import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; @Service @RequiredArgsConstructor @@ -33,24 +34,68 @@ public class MapSheetMngCoreService { private String activeEnv; public Page findMapSheetErrorList( - MapSheetMngDto.@Valid searchReq searchReq) { + MapSheetMngDto.@Valid searchReq searchReq) { return mapSheetMngRepository.findMapSheetErrorList(searchReq); } public Page findMapSheetMngList( - MapSheetMngDto.@Valid searchReq searchReq) { + MapSheetMngDto.@Valid searchReq searchReq) { return mapSheetMngRepository.findMapSheetMngList(searchReq); } + public MapSheetMngDto.DmlReturn uploadFile(MultipartFile file, Long hstUid) { + MapSheetMngHstEntity entity = + mapSheetMngRepository + .findMapSheetMngHstInfo(hstUid) + .orElseThrow(() -> new EntityNotFoundException("해당 이력이 존재하지 않습니다.")); + + String localPath = ""; + String rootDir = ORIGINAL_IMAGES_PATH + "/" + entity.getMngYyyy(); + if ("local".equals(activeEnv)) { + rootDir = localPath + rootDir; + } + + try { + Path uploadPath = Paths.get(rootDir); + if (!Files.exists(uploadPath)) { + Files.createDirectories(uploadPath); + } + + String originalFilename = file.getOriginalFilename(); + if (originalFilename == null) { + throw new IllegalArgumentException("파일명이 없습니다."); + } + Path filePath = uploadPath.resolve(originalFilename); + file.transferTo(filePath); + + return new MapSheetMngDto.DmlReturn("success", "파일 업로드 성공"); + } catch (IOException e) { + throw new RuntimeException("파일 업로드 실패", e); + } + } + + public MapSheetMngDto.DmlReturn deleteFile(MapSheetMngDto.DeleteFileReq req) { + try { + Path filePath = Paths.get(req.getFilePath()); + if (Files.deleteIfExists(filePath)) { + return new MapSheetMngDto.DmlReturn("success", "파일 삭제 성공"); + } else { + return new MapSheetMngDto.DmlReturn("fail", "파일이 존재하지 않습니다."); + } + } catch (IOException e) { + throw new RuntimeException("파일 삭제 실패", e); + } + } + public MapSheetMngDto.DmlReturn uploadProcess(@Valid List hstUidList) { int count = 0; if (!Objects.isNull(hstUidList) && !hstUidList.isEmpty()) { for (Long hstUid : hstUidList) { Optional entity = - Optional.ofNullable( - mapSheetMngRepository - .findMapSheetMngHstInfo(hstUid) - .orElseThrow(EntityNotFoundException::new)); + Optional.ofNullable( + mapSheetMngRepository + .findMapSheetMngHstInfo(hstUid) + .orElseThrow(EntityNotFoundException::new)); // TODO: local TEST 시 각자 경로 수정하기 // TODO: application.yml 에 active profile : local 로 임시 변경하여 테스트 @@ -82,10 +127,10 @@ public class MapSheetMngCoreService { if (!Objects.isNull(hstUidList) && !hstUidList.isEmpty()) { for (Long hstUid : hstUidList) { Optional entity = - Optional.ofNullable( - mapSheetMngRepository - .findMapSheetMngHstInfo(hstUid) - .orElseThrow(EntityNotFoundException::new)); + Optional.ofNullable( + mapSheetMngRepository + .findMapSheetMngHstInfo(hstUid) + .orElseThrow(EntityNotFoundException::new)); // entity.get().updateUseInference(true); } @@ -106,10 +151,10 @@ public class MapSheetMngCoreService { // 모든 파일명을 Set으로 저장 Set fileNames = - paths - .filter(Files::isRegularFile) - .map(p -> p.getFileName().toString()) - .collect(Collectors.toSet()); + paths + .filter(Files::isRegularFile) + .map(p -> p.getFileName().toString()) + .collect(Collectors.toSet()); // 모든 확장자 파일 존재 여부 확인 for (String ext : extensions) { From d3ec9fdcafe03bb3b158943a263f283a1415817f Mon Sep 17 00:00:00 2001 From: teddy Date: Fri, 12 Dec 2025 11:27:13 +0900 Subject: [PATCH 4/7] =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=9D=B8=EC=A0=84=20?= =?UTF-8?q?=EB=AF=B8=EC=82=AC=EC=9A=A9=EC=83=81=ED=83=9C=20=EC=B2=B4?= =?UTF-8?q?=ED=81=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../auth/CustomAuthenticationProvider.java | 10 +-- .../mapsheet/MapSheetMngApiController.java | 86 +++++++++---------- .../mapsheet/dto/MapSheetMngDto.java | 2 +- .../mapsheet/service/MapSheetMngService.java | 86 +++++++++---------- .../postgres/core/MapSheetMngCoreService.java | 34 ++++---- 5 files changed, 109 insertions(+), 109 deletions(-) diff --git a/src/main/java/com/kamco/cd/kamcoback/auth/CustomAuthenticationProvider.java b/src/main/java/com/kamco/cd/kamcoback/auth/CustomAuthenticationProvider.java index 0de417b1..4ab0401e 100644 --- a/src/main/java/com/kamco/cd/kamcoback/auth/CustomAuthenticationProvider.java +++ b/src/main/java/com/kamco/cd/kamcoback/auth/CustomAuthenticationProvider.java @@ -32,6 +32,11 @@ public class CustomAuthenticationProvider implements AuthenticationProvider { .findByUserId(username) .orElseThrow(() -> new CustomApiException(AuthErrorCode.LOGIN_ID_NOT_FOUND)); + // 삭제 상태 + if (member.getStatus().equals(StatusType.DELETED.getId())) { + throw new CustomApiException(AuthErrorCode.LOGIN_ID_NOT_FOUND); + } + // jBCrypt + 커스텀 salt 로 저장된 패스워드 비교 if (!BCrypt.checkpw(rawPassword, member.getPassword())) { // 실패 카운트 저장 @@ -44,11 +49,6 @@ public class CustomAuthenticationProvider implements AuthenticationProvider { throw new CustomApiException(AuthErrorCode.LOGIN_PASSWORD_MISMATCH); } - // 삭제 상태 - if (member.getStatus().equals(StatusType.DELETED.getId())) { - throw new CustomApiException(AuthErrorCode.LOGIN_ID_NOT_FOUND); - } - // 패스워드 실패 횟수 체크 if (member.getLoginFailCount() >= 5) { throw new CustomApiException(AuthErrorCode.LOGIN_PASSWORD_EXCEEDED); diff --git a/src/main/java/com/kamco/cd/kamcoback/mapsheet/MapSheetMngApiController.java b/src/main/java/com/kamco/cd/kamcoback/mapsheet/MapSheetMngApiController.java index 781c92d7..72cda420 100644 --- a/src/main/java/com/kamco/cd/kamcoback/mapsheet/MapSheetMngApiController.java +++ b/src/main/java/com/kamco/cd/kamcoback/mapsheet/MapSheetMngApiController.java @@ -36,61 +36,61 @@ public class MapSheetMngApiController { */ @PostMapping("/error-list") public ApiResponseDto> findMapSheetErrorList( - @RequestBody @Valid MapSheetMngDto.searchReq searchReq) { + @RequestBody @Valid MapSheetMngDto.searchReq searchReq) { return ApiResponseDto.ok(mapSheetMngService.findMapSheetErrorList(searchReq)); } @Operation(summary = "영상데이터관리목록 조회", description = "영상데이터관리목록 조회") @ApiResponses( - value = { - @ApiResponse( - responseCode = "200", - description = "조회 성공", - content = - @Content( - mediaType = "application/json", - schema = @Schema(implementation = CommonCodeDto.Basic.class))), - @ApiResponse(responseCode = "404", description = "코드를 찾을 수 없음", content = @Content), - @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) - }) + value = { + @ApiResponse( + responseCode = "200", + description = "조회 성공", + content = + @Content( + mediaType = "application/json", + schema = @Schema(implementation = CommonCodeDto.Basic.class))), + @ApiResponse(responseCode = "404", description = "코드를 찾을 수 없음", content = @Content), + @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) + }) @PostMapping("/mng-list") public ApiResponseDto> findMapSheetMngList( - @RequestBody @Valid MapSheetMngDto.searchReq searchReq) { + @RequestBody @Valid MapSheetMngDto.searchReq searchReq) { return ApiResponseDto.ok(mapSheetMngService.findMapSheetMngList(searchReq)); } @Operation(summary = "영상관리 > 데이터 등록", description = "영상관리 > 데이터 등록") @ApiResponses( - value = { - @ApiResponse( - responseCode = "201", - description = "데이터 등록 성공", - content = - @Content( - mediaType = "application/json", - schema = @Schema(implementation = Long.class))), - @ApiResponse(responseCode = "400", description = "잘못된 요청 데이터", content = @Content), - @ApiResponse(responseCode = "404", description = "데이터를 찾을 수 없음", content = @Content), - @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) - }) + value = { + @ApiResponse( + responseCode = "201", + description = "데이터 등록 성공", + content = + @Content( + mediaType = "application/json", + schema = @Schema(implementation = Long.class))), + @ApiResponse(responseCode = "400", description = "잘못된 요청 데이터", content = @Content), + @ApiResponse(responseCode = "404", description = "데이터를 찾을 수 없음", content = @Content), + @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) + }) @PutMapping("/mng-data-save") public ApiResponseDto mngDataSave( - @RequestBody @Valid MapSheetMngDto.AddReq AddReq) { + @RequestBody @Valid MapSheetMngDto.AddReq AddReq) { return ApiResponseDto.ok(mapSheetMngService.mngDataSave(AddReq)); } @Operation(summary = "파일 업로드", description = "파일 업로드") @PostMapping(value = "/file-upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public ApiResponseDto uploadFile( - @RequestPart(value = "file") MultipartFile file, - @RequestParam(value = "hstUid") Long hstUid) { + @RequestPart(value = "file") MultipartFile file, + @RequestParam(value = "hstUid") Long hstUid) { return ApiResponseDto.ok(mapSheetMngService.uploadFile(file, hstUid)); } @Operation(summary = "파일 삭제", description = "파일 삭제") @PostMapping("/file-delete") public ApiResponseDto deleteFile( - @RequestBody @Valid MapSheetMngDto.DeleteFileReq req) { + @RequestBody @Valid MapSheetMngDto.DeleteFileReq req) { return ApiResponseDto.ok(mapSheetMngService.deleteFile(req)); } @@ -100,21 +100,21 @@ public class MapSheetMngApiController { */ @Operation(summary = "오류데이터 팝업 > 업로드 처리", description = "오류데이터 팝업 > 업로드 처리") @ApiResponses( - value = { - @ApiResponse( - responseCode = "201", - description = "공통코드 저장 성공", - content = - @Content( - mediaType = "application/json", - schema = @Schema(implementation = Long.class))), - @ApiResponse(responseCode = "400", description = "잘못된 요청 데이터", content = @Content), - @ApiResponse(responseCode = "404", description = "코드를 찾을 수 없음", content = @Content), - @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) - }) + value = { + @ApiResponse( + responseCode = "201", + description = "공통코드 저장 성공", + content = + @Content( + mediaType = "application/json", + schema = @Schema(implementation = Long.class))), + @ApiResponse(responseCode = "400", description = "잘못된 요청 데이터", content = @Content), + @ApiResponse(responseCode = "404", description = "코드를 찾을 수 없음", content = @Content), + @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) + }) @PutMapping("/upload-process") public ApiResponseDto uploadProcess( - @RequestBody @Valid List hstUidList) { + @RequestBody @Valid List hstUidList) { return ApiResponseDto.ok(mapSheetMngService.uploadProcess(hstUidList)); } @@ -125,7 +125,7 @@ public class MapSheetMngApiController { @Operation(summary = "오류데이터 팝업 > 추론 제외", description = "오류데이터 팝업 > 추론 제외") @PutMapping("/except-inference") public ApiResponseDto updateExceptUseInference( - @RequestBody @Valid List hstUidList) { + @RequestBody @Valid List hstUidList) { return ApiResponseDto.ok(mapSheetMngService.updateExceptUseInference(hstUidList)); } } diff --git a/src/main/java/com/kamco/cd/kamcoback/mapsheet/dto/MapSheetMngDto.java b/src/main/java/com/kamco/cd/kamcoback/mapsheet/dto/MapSheetMngDto.java index ad61bbec..f21b9cdc 100644 --- a/src/main/java/com/kamco/cd/kamcoback/mapsheet/dto/MapSheetMngDto.java +++ b/src/main/java/com/kamco/cd/kamcoback/mapsheet/dto/MapSheetMngDto.java @@ -42,7 +42,7 @@ public class MapSheetMngDto { String[] sortParams = sort.split(","); String property = sortParams[0]; 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); diff --git a/src/main/java/com/kamco/cd/kamcoback/mapsheet/service/MapSheetMngService.java b/src/main/java/com/kamco/cd/kamcoback/mapsheet/service/MapSheetMngService.java index 34ec4ba0..00ccf072 100644 --- a/src/main/java/com/kamco/cd/kamcoback/mapsheet/service/MapSheetMngService.java +++ b/src/main/java/com/kamco/cd/kamcoback/mapsheet/service/MapSheetMngService.java @@ -83,8 +83,8 @@ public class MapSheetMngService { String lastModified = dttmFormat.format(new Date(file.lastModified())); files.add( - new FileDto.Basic( - fileName, parentFolderNm, parentPath, fullPath, ext, fileSize, lastModified)); + new FileDto.Basic( + fileName, parentFolderNm, parentPath, fullPath, ext, fileSize, lastModified)); fileTotCnt = fileTotCnt + 1; fileTotSize = fileTotSize + fileSize; @@ -120,35 +120,35 @@ public class MapSheetMngService { try (Stream stream = Files.walk(startPath, maxDepth)) { fileDtoList = - stream - .filter(Files::isRegularFile) - .filter( - p -> - extension == null - || extension.equals("") - || extension.equals("*") - || targetExtensions.contains(extractExtension(p))) - .sorted(getFileComparator(sortType)) - .skip(startPos) - .limit(limit) - .map( - path -> { - int depth = path.getNameCount(); + stream + .filter(Files::isRegularFile) + .filter( + p -> + extension == null + || extension.equals("") + || extension.equals("*") + || targetExtensions.contains(extractExtension(p))) + .sorted(getFileComparator(sortType)) + .skip(startPos) + .limit(limit) + .map( + path -> { + int depth = path.getNameCount(); - String fileNm = path.getFileName().toString(); - String ext = FilenameUtils.getExtension(fileNm); - String parentFolderNm = path.getParent().getFileName().toString(); - String parentPath = path.getParent().toString(); - String fullPath = path.toAbsolutePath().toString(); + String fileNm = path.getFileName().toString(); + String ext = FilenameUtils.getExtension(fileNm); + String parentFolderNm = path.getParent().getFileName().toString(); + String parentPath = path.getParent().toString(); + String fullPath = path.toAbsolutePath().toString(); - File file = new File(fullPath); - long fileSize = file.length(); - String lastModified = dttmFormat.format(new Date(file.lastModified())); + File file = new File(fullPath); + long fileSize = file.length(); + String lastModified = dttmFormat.format(new Date(file.lastModified())); - return new FileDto.Basic( - fileNm, parentFolderNm, parentPath, fullPath, ext, fileSize, lastModified); - }) - .collect(Collectors.toList()); + return new FileDto.Basic( + fileNm, parentFolderNm, parentPath, fullPath, ext, fileSize, lastModified); + }) + .collect(Collectors.toList()); fileTotCnt = fileDtoList.size(); fileTotSize = fileDtoList.stream().mapToLong(FileDto.Basic::getFileSize).sum(); @@ -167,10 +167,10 @@ public class MapSheetMngService { // "java, class" -> ["java", " class"] -> [".java", ".class"] return Arrays.stream(extensionString.split(",")) - .map(ext -> ext.trim()) - .filter(ext -> !ext.isEmpty()) - .map(ext -> "." + ext.toLowerCase()) - .collect(Collectors.toSet()); + .map(ext -> ext.trim()) + .filter(ext -> !ext.isEmpty()) + .map(ext -> "." + ext.toLowerCase()) + .collect(Collectors.toSet()); } public String extractExtension(Path path) { @@ -190,17 +190,17 @@ public class MapSheetMngService { // 파일 이름 비교 기본 Comparator (대소문자 무시) Comparator nameComparator = - Comparator.comparing(path -> path.getFileName().toString(), CASE_INSENSITIVE_ORDER); + Comparator.comparing(path -> path.getFileName().toString(), CASE_INSENSITIVE_ORDER); Comparator dateComparator = - Comparator.comparing( - path -> { - try { - return Files.getLastModifiedTime(path); - } catch (IOException e) { - return FileTime.fromMillis(0); - } - }); + Comparator.comparing( + path -> { + try { + return Files.getLastModifiedTime(path); + } catch (IOException e) { + return FileTime.fromMillis(0); + } + }); if ("name desc".equalsIgnoreCase(sortType)) { return nameComparator.reversed(); @@ -214,12 +214,12 @@ public class MapSheetMngService { } public Page findMapSheetErrorList( - MapSheetMngDto.@Valid searchReq searchReq) { + MapSheetMngDto.@Valid searchReq searchReq) { return mapSheetMngCoreService.findMapSheetErrorList(searchReq); } public Page findMapSheetMngList( - MapSheetMngDto.@Valid searchReq searchReq) { + MapSheetMngDto.@Valid searchReq searchReq) { return mapSheetMngCoreService.findMapSheetMngList(searchReq); } diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/core/MapSheetMngCoreService.java b/src/main/java/com/kamco/cd/kamcoback/postgres/core/MapSheetMngCoreService.java index d258a1aa..98607d44 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/core/MapSheetMngCoreService.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/core/MapSheetMngCoreService.java @@ -34,20 +34,20 @@ public class MapSheetMngCoreService { private String activeEnv; public Page findMapSheetErrorList( - MapSheetMngDto.@Valid searchReq searchReq) { + MapSheetMngDto.@Valid searchReq searchReq) { return mapSheetMngRepository.findMapSheetErrorList(searchReq); } public Page findMapSheetMngList( - MapSheetMngDto.@Valid searchReq searchReq) { + MapSheetMngDto.@Valid searchReq searchReq) { return mapSheetMngRepository.findMapSheetMngList(searchReq); } public MapSheetMngDto.DmlReturn uploadFile(MultipartFile file, Long hstUid) { MapSheetMngHstEntity entity = - mapSheetMngRepository - .findMapSheetMngHstInfo(hstUid) - .orElseThrow(() -> new EntityNotFoundException("해당 이력이 존재하지 않습니다.")); + mapSheetMngRepository + .findMapSheetMngHstInfo(hstUid) + .orElseThrow(() -> new EntityNotFoundException("해당 이력이 존재하지 않습니다.")); String localPath = ""; String rootDir = ORIGINAL_IMAGES_PATH + "/" + entity.getMngYyyy(); @@ -92,10 +92,10 @@ public class MapSheetMngCoreService { if (!Objects.isNull(hstUidList) && !hstUidList.isEmpty()) { for (Long hstUid : hstUidList) { Optional entity = - Optional.ofNullable( - mapSheetMngRepository - .findMapSheetMngHstInfo(hstUid) - .orElseThrow(EntityNotFoundException::new)); + Optional.ofNullable( + mapSheetMngRepository + .findMapSheetMngHstInfo(hstUid) + .orElseThrow(EntityNotFoundException::new)); // TODO: local TEST 시 각자 경로 수정하기 // TODO: application.yml 에 active profile : local 로 임시 변경하여 테스트 @@ -127,10 +127,10 @@ public class MapSheetMngCoreService { if (!Objects.isNull(hstUidList) && !hstUidList.isEmpty()) { for (Long hstUid : hstUidList) { Optional entity = - Optional.ofNullable( - mapSheetMngRepository - .findMapSheetMngHstInfo(hstUid) - .orElseThrow(EntityNotFoundException::new)); + Optional.ofNullable( + mapSheetMngRepository + .findMapSheetMngHstInfo(hstUid) + .orElseThrow(EntityNotFoundException::new)); // entity.get().updateUseInference(true); } @@ -151,10 +151,10 @@ public class MapSheetMngCoreService { // 모든 파일명을 Set으로 저장 Set fileNames = - paths - .filter(Files::isRegularFile) - .map(p -> p.getFileName().toString()) - .collect(Collectors.toSet()); + paths + .filter(Files::isRegularFile) + .map(p -> p.getFileName().toString()) + .collect(Collectors.toSet()); // 모든 확장자 파일 존재 여부 확인 for (String ext : extensions) { From 11a94829f7de6489259020db8aaae372951752f3 Mon Sep 17 00:00:00 2001 From: DanielLee <198891672+sanghyeonhd@users.noreply.github.com> Date: Fri, 12 Dec 2025 11:28:35 +0900 Subject: [PATCH 5/7] File Delete Add --- .../mapsheet/MapSheetMngApiController.java | 86 ++++++++--------- .../mapsheet/dto/MapSheetMngDto.java | 2 +- .../mapsheet/service/MapSheetMngService.java | 86 ++++++++--------- .../postgres/core/MapSheetMngCoreService.java | 94 +++++++++---------- .../mapsheet/MapSheetMngRepositoryCustom.java | 11 +++ .../mapsheet/MapSheetMngRepositoryImpl.java | 48 +++++----- 6 files changed, 169 insertions(+), 158 deletions(-) diff --git a/src/main/java/com/kamco/cd/kamcoback/mapsheet/MapSheetMngApiController.java b/src/main/java/com/kamco/cd/kamcoback/mapsheet/MapSheetMngApiController.java index 781c92d7..72cda420 100644 --- a/src/main/java/com/kamco/cd/kamcoback/mapsheet/MapSheetMngApiController.java +++ b/src/main/java/com/kamco/cd/kamcoback/mapsheet/MapSheetMngApiController.java @@ -36,61 +36,61 @@ public class MapSheetMngApiController { */ @PostMapping("/error-list") public ApiResponseDto> findMapSheetErrorList( - @RequestBody @Valid MapSheetMngDto.searchReq searchReq) { + @RequestBody @Valid MapSheetMngDto.searchReq searchReq) { return ApiResponseDto.ok(mapSheetMngService.findMapSheetErrorList(searchReq)); } @Operation(summary = "영상데이터관리목록 조회", description = "영상데이터관리목록 조회") @ApiResponses( - value = { - @ApiResponse( - responseCode = "200", - description = "조회 성공", - content = - @Content( - mediaType = "application/json", - schema = @Schema(implementation = CommonCodeDto.Basic.class))), - @ApiResponse(responseCode = "404", description = "코드를 찾을 수 없음", content = @Content), - @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) - }) + value = { + @ApiResponse( + responseCode = "200", + description = "조회 성공", + content = + @Content( + mediaType = "application/json", + schema = @Schema(implementation = CommonCodeDto.Basic.class))), + @ApiResponse(responseCode = "404", description = "코드를 찾을 수 없음", content = @Content), + @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) + }) @PostMapping("/mng-list") public ApiResponseDto> findMapSheetMngList( - @RequestBody @Valid MapSheetMngDto.searchReq searchReq) { + @RequestBody @Valid MapSheetMngDto.searchReq searchReq) { return ApiResponseDto.ok(mapSheetMngService.findMapSheetMngList(searchReq)); } @Operation(summary = "영상관리 > 데이터 등록", description = "영상관리 > 데이터 등록") @ApiResponses( - value = { - @ApiResponse( - responseCode = "201", - description = "데이터 등록 성공", - content = - @Content( - mediaType = "application/json", - schema = @Schema(implementation = Long.class))), - @ApiResponse(responseCode = "400", description = "잘못된 요청 데이터", content = @Content), - @ApiResponse(responseCode = "404", description = "데이터를 찾을 수 없음", content = @Content), - @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) - }) + value = { + @ApiResponse( + responseCode = "201", + description = "데이터 등록 성공", + content = + @Content( + mediaType = "application/json", + schema = @Schema(implementation = Long.class))), + @ApiResponse(responseCode = "400", description = "잘못된 요청 데이터", content = @Content), + @ApiResponse(responseCode = "404", description = "데이터를 찾을 수 없음", content = @Content), + @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) + }) @PutMapping("/mng-data-save") public ApiResponseDto mngDataSave( - @RequestBody @Valid MapSheetMngDto.AddReq AddReq) { + @RequestBody @Valid MapSheetMngDto.AddReq AddReq) { return ApiResponseDto.ok(mapSheetMngService.mngDataSave(AddReq)); } @Operation(summary = "파일 업로드", description = "파일 업로드") @PostMapping(value = "/file-upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public ApiResponseDto uploadFile( - @RequestPart(value = "file") MultipartFile file, - @RequestParam(value = "hstUid") Long hstUid) { + @RequestPart(value = "file") MultipartFile file, + @RequestParam(value = "hstUid") Long hstUid) { return ApiResponseDto.ok(mapSheetMngService.uploadFile(file, hstUid)); } @Operation(summary = "파일 삭제", description = "파일 삭제") @PostMapping("/file-delete") public ApiResponseDto deleteFile( - @RequestBody @Valid MapSheetMngDto.DeleteFileReq req) { + @RequestBody @Valid MapSheetMngDto.DeleteFileReq req) { return ApiResponseDto.ok(mapSheetMngService.deleteFile(req)); } @@ -100,21 +100,21 @@ public class MapSheetMngApiController { */ @Operation(summary = "오류데이터 팝업 > 업로드 처리", description = "오류데이터 팝업 > 업로드 처리") @ApiResponses( - value = { - @ApiResponse( - responseCode = "201", - description = "공통코드 저장 성공", - content = - @Content( - mediaType = "application/json", - schema = @Schema(implementation = Long.class))), - @ApiResponse(responseCode = "400", description = "잘못된 요청 데이터", content = @Content), - @ApiResponse(responseCode = "404", description = "코드를 찾을 수 없음", content = @Content), - @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) - }) + value = { + @ApiResponse( + responseCode = "201", + description = "공통코드 저장 성공", + content = + @Content( + mediaType = "application/json", + schema = @Schema(implementation = Long.class))), + @ApiResponse(responseCode = "400", description = "잘못된 요청 데이터", content = @Content), + @ApiResponse(responseCode = "404", description = "코드를 찾을 수 없음", content = @Content), + @ApiResponse(responseCode = "500", description = "서버 오류", content = @Content) + }) @PutMapping("/upload-process") public ApiResponseDto uploadProcess( - @RequestBody @Valid List hstUidList) { + @RequestBody @Valid List hstUidList) { return ApiResponseDto.ok(mapSheetMngService.uploadProcess(hstUidList)); } @@ -125,7 +125,7 @@ public class MapSheetMngApiController { @Operation(summary = "오류데이터 팝업 > 추론 제외", description = "오류데이터 팝업 > 추론 제외") @PutMapping("/except-inference") public ApiResponseDto updateExceptUseInference( - @RequestBody @Valid List hstUidList) { + @RequestBody @Valid List hstUidList) { return ApiResponseDto.ok(mapSheetMngService.updateExceptUseInference(hstUidList)); } } diff --git a/src/main/java/com/kamco/cd/kamcoback/mapsheet/dto/MapSheetMngDto.java b/src/main/java/com/kamco/cd/kamcoback/mapsheet/dto/MapSheetMngDto.java index ad61bbec..f21b9cdc 100644 --- a/src/main/java/com/kamco/cd/kamcoback/mapsheet/dto/MapSheetMngDto.java +++ b/src/main/java/com/kamco/cd/kamcoback/mapsheet/dto/MapSheetMngDto.java @@ -42,7 +42,7 @@ public class MapSheetMngDto { String[] sortParams = sort.split(","); String property = sortParams[0]; 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); diff --git a/src/main/java/com/kamco/cd/kamcoback/mapsheet/service/MapSheetMngService.java b/src/main/java/com/kamco/cd/kamcoback/mapsheet/service/MapSheetMngService.java index 34ec4ba0..00ccf072 100644 --- a/src/main/java/com/kamco/cd/kamcoback/mapsheet/service/MapSheetMngService.java +++ b/src/main/java/com/kamco/cd/kamcoback/mapsheet/service/MapSheetMngService.java @@ -83,8 +83,8 @@ public class MapSheetMngService { String lastModified = dttmFormat.format(new Date(file.lastModified())); files.add( - new FileDto.Basic( - fileName, parentFolderNm, parentPath, fullPath, ext, fileSize, lastModified)); + new FileDto.Basic( + fileName, parentFolderNm, parentPath, fullPath, ext, fileSize, lastModified)); fileTotCnt = fileTotCnt + 1; fileTotSize = fileTotSize + fileSize; @@ -120,35 +120,35 @@ public class MapSheetMngService { try (Stream stream = Files.walk(startPath, maxDepth)) { fileDtoList = - stream - .filter(Files::isRegularFile) - .filter( - p -> - extension == null - || extension.equals("") - || extension.equals("*") - || targetExtensions.contains(extractExtension(p))) - .sorted(getFileComparator(sortType)) - .skip(startPos) - .limit(limit) - .map( - path -> { - int depth = path.getNameCount(); + stream + .filter(Files::isRegularFile) + .filter( + p -> + extension == null + || extension.equals("") + || extension.equals("*") + || targetExtensions.contains(extractExtension(p))) + .sorted(getFileComparator(sortType)) + .skip(startPos) + .limit(limit) + .map( + path -> { + int depth = path.getNameCount(); - String fileNm = path.getFileName().toString(); - String ext = FilenameUtils.getExtension(fileNm); - String parentFolderNm = path.getParent().getFileName().toString(); - String parentPath = path.getParent().toString(); - String fullPath = path.toAbsolutePath().toString(); + String fileNm = path.getFileName().toString(); + String ext = FilenameUtils.getExtension(fileNm); + String parentFolderNm = path.getParent().getFileName().toString(); + String parentPath = path.getParent().toString(); + String fullPath = path.toAbsolutePath().toString(); - File file = new File(fullPath); - long fileSize = file.length(); - String lastModified = dttmFormat.format(new Date(file.lastModified())); + File file = new File(fullPath); + long fileSize = file.length(); + String lastModified = dttmFormat.format(new Date(file.lastModified())); - return new FileDto.Basic( - fileNm, parentFolderNm, parentPath, fullPath, ext, fileSize, lastModified); - }) - .collect(Collectors.toList()); + return new FileDto.Basic( + fileNm, parentFolderNm, parentPath, fullPath, ext, fileSize, lastModified); + }) + .collect(Collectors.toList()); fileTotCnt = fileDtoList.size(); fileTotSize = fileDtoList.stream().mapToLong(FileDto.Basic::getFileSize).sum(); @@ -167,10 +167,10 @@ public class MapSheetMngService { // "java, class" -> ["java", " class"] -> [".java", ".class"] return Arrays.stream(extensionString.split(",")) - .map(ext -> ext.trim()) - .filter(ext -> !ext.isEmpty()) - .map(ext -> "." + ext.toLowerCase()) - .collect(Collectors.toSet()); + .map(ext -> ext.trim()) + .filter(ext -> !ext.isEmpty()) + .map(ext -> "." + ext.toLowerCase()) + .collect(Collectors.toSet()); } public String extractExtension(Path path) { @@ -190,17 +190,17 @@ public class MapSheetMngService { // 파일 이름 비교 기본 Comparator (대소문자 무시) Comparator nameComparator = - Comparator.comparing(path -> path.getFileName().toString(), CASE_INSENSITIVE_ORDER); + Comparator.comparing(path -> path.getFileName().toString(), CASE_INSENSITIVE_ORDER); Comparator dateComparator = - Comparator.comparing( - path -> { - try { - return Files.getLastModifiedTime(path); - } catch (IOException e) { - return FileTime.fromMillis(0); - } - }); + Comparator.comparing( + path -> { + try { + return Files.getLastModifiedTime(path); + } catch (IOException e) { + return FileTime.fromMillis(0); + } + }); if ("name desc".equalsIgnoreCase(sortType)) { return nameComparator.reversed(); @@ -214,12 +214,12 @@ public class MapSheetMngService { } public Page findMapSheetErrorList( - MapSheetMngDto.@Valid searchReq searchReq) { + MapSheetMngDto.@Valid searchReq searchReq) { return mapSheetMngCoreService.findMapSheetErrorList(searchReq); } public Page findMapSheetMngList( - MapSheetMngDto.@Valid searchReq searchReq) { + MapSheetMngDto.@Valid searchReq searchReq) { return mapSheetMngCoreService.findMapSheetMngList(searchReq); } diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/core/MapSheetMngCoreService.java b/src/main/java/com/kamco/cd/kamcoback/postgres/core/MapSheetMngCoreService.java index d258a1aa..1b708a04 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/core/MapSheetMngCoreService.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/core/MapSheetMngCoreService.java @@ -12,7 +12,6 @@ import java.nio.file.Path; import java.nio.file.Paths; import java.util.List; import java.util.Objects; -import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -30,24 +29,25 @@ public class MapSheetMngCoreService { private static final String ORIGINAL_IMAGES_PATH = "/app/original-images"; - @Value("{spring.profiles.active}") + // Fix: property placeholder syntax + @Value("${spring.profiles.active}") private String activeEnv; public Page findMapSheetErrorList( - MapSheetMngDto.@Valid searchReq searchReq) { + MapSheetMngDto.@Valid searchReq searchReq) { return mapSheetMngRepository.findMapSheetErrorList(searchReq); } public Page findMapSheetMngList( - MapSheetMngDto.@Valid searchReq searchReq) { + MapSheetMngDto.@Valid searchReq searchReq) { return mapSheetMngRepository.findMapSheetMngList(searchReq); } public MapSheetMngDto.DmlReturn uploadFile(MultipartFile file, Long hstUid) { MapSheetMngHstEntity entity = - mapSheetMngRepository - .findMapSheetMngHstInfo(hstUid) - .orElseThrow(() -> new EntityNotFoundException("해당 이력이 존재하지 않습니다.")); + mapSheetMngRepository + .findMapSheetMngHstInfo(hstUid) + .orElseThrow(() -> new EntityNotFoundException("해당 이력이 존재하지 않습니다.")); String localPath = ""; String rootDir = ORIGINAL_IMAGES_PATH + "/" + entity.getMngYyyy(); @@ -62,7 +62,7 @@ public class MapSheetMngCoreService { } String originalFilename = file.getOriginalFilename(); - if (originalFilename == null) { + if (originalFilename == null || originalFilename.isBlank()) { throw new IllegalArgumentException("파일명이 없습니다."); } Path filePath = uploadPath.resolve(originalFilename); @@ -88,54 +88,48 @@ public class MapSheetMngCoreService { } public MapSheetMngDto.DmlReturn uploadProcess(@Valid List hstUidList) { - int count = 0; - if (!Objects.isNull(hstUidList) && !hstUidList.isEmpty()) { - for (Long hstUid : hstUidList) { - Optional entity = - Optional.ofNullable( - mapSheetMngRepository + if (Objects.isNull(hstUidList) || hstUidList.isEmpty()) { + throw new IllegalArgumentException("처리할 대상이 없습니다."); + } + int successCount = 0; + int failCount = 0; + + for (Long hstUid : hstUidList) { + MapSheetMngHstEntity hst = + mapSheetMngRepository .findMapSheetMngHstInfo(hstUid) - .orElseThrow(EntityNotFoundException::new)); + .orElseThrow(() -> new EntityNotFoundException("해당 이력이 존재하지 않습니다.")); - // TODO: local TEST 시 각자 경로 수정하기 - // TODO: application.yml 에 active profile : local 로 임시 변경하여 테스트 - String localPath = ""; - // String localPath = "C:\\Users\\gypark\\Desktop\\file"; - String rootDir = ORIGINAL_IMAGES_PATH + "/" + entity.get().getMngYyyy(); - if (activeEnv.equals("local")) { - rootDir = localPath + rootDir; - } + String localPath = ""; // 필요 시 로컬 테스트 경로 설정 + String rootDir = ORIGINAL_IMAGES_PATH + "/" + hst.getMngYyyy(); + if ("local".equals(activeEnv)) { + rootDir = localPath + rootDir; + } - String filename = entity.get().getMapSheetNum(); - String[] extensions = {"tif", "tfw"}; - boolean flag = allExtensionsExist(rootDir, filename, extensions); - if (flag) { - count += 1; - } + String filename = hst.getMapSheetNum(); + String[] extensions = {"tif", "tfw"}; + boolean existBoth = allExtensionsExist(rootDir, filename, extensions); - /* - MapSheetMngDto.DataState dataState = - flag ? MapSheetMngDto.DataState.SUCCESS : MapSheetMngDto.DataState.FAIL; - entity.get().updateDataState(dataState); - */ + String state = existBoth ? "SUCCESS" : "NOT"; + mapSheetMngRepository.updateUploadProcessResult(hstUid, state); + + if (existBoth) { + successCount++; + } else { + failCount++; } } - return new MapSheetMngDto.DmlReturn("success", count + "개 업로드 성공하였습니다."); + + String msg = String.format("업로드 처리 완료: 성공 %d건, 실패 %d건", successCount, failCount); + return new MapSheetMngDto.DmlReturn("success", msg); } public MapSheetMngDto.DmlReturn updateExceptUseInference(@Valid List hstUidList) { - if (!Objects.isNull(hstUidList) && !hstUidList.isEmpty()) { - for (Long hstUid : hstUidList) { - Optional entity = - Optional.ofNullable( - mapSheetMngRepository - .findMapSheetMngHstInfo(hstUid) - .orElseThrow(EntityNotFoundException::new)); - - // entity.get().updateUseInference(true); - } + if (Objects.isNull(hstUidList) || hstUidList.isEmpty()) { + throw new IllegalArgumentException("처리할 대상이 없습니다."); } - return new MapSheetMngDto.DmlReturn("success", hstUidList.size() + "개 추론제외 업데이트 하였습니다."); + long updated = mapSheetMngRepository.updateExceptUseInference(hstUidList); + return new MapSheetMngDto.DmlReturn("success", updated + "개 추론제외 업데이트 하였습니다."); } /** @@ -151,10 +145,10 @@ public class MapSheetMngCoreService { // 모든 파일명을 Set으로 저장 Set fileNames = - paths - .filter(Files::isRegularFile) - .map(p -> p.getFileName().toString()) - .collect(Collectors.toSet()); + paths + .filter(Files::isRegularFile) + .map(p -> p.getFileName().toString()) + .collect(Collectors.toSet()); // 모든 확장자 파일 존재 여부 확인 for (String ext : extensions) { diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/mapsheet/MapSheetMngRepositoryCustom.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/mapsheet/MapSheetMngRepositoryCustom.java index 817cca55..94bf57c8 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/mapsheet/MapSheetMngRepositoryCustom.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/mapsheet/MapSheetMngRepositoryCustom.java @@ -3,6 +3,7 @@ package com.kamco.cd.kamcoback.postgres.repository.mapsheet; import com.kamco.cd.kamcoback.mapsheet.dto.MapSheetMngDto; import com.kamco.cd.kamcoback.postgres.entity.MapSheetMngHstEntity; import jakarta.validation.Valid; +import java.util.List; import java.util.Optional; import org.springframework.data.domain.Page; @@ -14,4 +15,14 @@ public interface MapSheetMngRepositoryCustom { Page findMapSheetMngList(MapSheetMngDto.@Valid searchReq searchReq); Optional findMapSheetMngHstInfo(Long hstUid); + + /** + * hstUid 목록에 대해 추론 사용 여부(use_inference)를 'N'으로 업데이트하고 타임스탬프를 기록합니다. + * + * @return 업데이트된 행 수 + */ + long updateExceptUseInference(List hstUidList); + + /** 업로드 처리 결과에 따라 data_state를 업데이트합니다. 성공 시 'SUCCESS', 실패 시 'NOT' 등으로 설정합니다. */ + long updateUploadProcessResult(Long hstUid, String dataState); } diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/mapsheet/MapSheetMngRepositoryImpl.java b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/mapsheet/MapSheetMngRepositoryImpl.java index 2ca6853f..fb0b7a33 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/repository/mapsheet/MapSheetMngRepositoryImpl.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/repository/mapsheet/MapSheetMngRepositoryImpl.java @@ -16,6 +16,7 @@ import com.querydsl.core.types.dsl.NumberExpression; import com.querydsl.core.types.dsl.StringExpression; import com.querydsl.jpa.impl.JPAQueryFactory; import jakarta.validation.Valid; +import java.time.ZonedDateTime; import java.util.List; import java.util.Objects; import java.util.Optional; @@ -100,27 +101,6 @@ public class MapSheetMngRepositoryImpl extends QuerydslRepositorySupport whereBuilder.and(mapSheetMngEntity.mngYyyy.eq(searchReq.getMngYyyy())); } - /* - QMapSheetMngEntity m = mapSheetMngEntity; - QMapSheetMngHstEntity h = mapSheetMngHstEntity; - - List summaryContent = - queryFactory - .select( - Projections.constructor( - MapSheetSummaryDto.class, - mapSheetMngHstEntity.mngYyyy, - mapSheetMngHstEntity.mngYyyy.count().as("syncTotCnt"), - new CaseBuilder() - .when(mapSheetMngHstEntity.syncState.eq("DONE")).then(1L).otherwise(0L) - .sum().as("syncStateDoneCnt") - )) - .from(mapSheetMngHstEntity) - .groupBy(mapSheetMngHstEntity.mngYyyy) // mng_yyyy 별로 그룹핑 - .fetch(); - - */ - List foundContent = queryFactory .select( @@ -192,6 +172,32 @@ public class MapSheetMngRepositoryImpl extends QuerydslRepositorySupport .fetchOne()); } + @Override + public long updateExceptUseInference(List hstUidList) { + ZonedDateTime now = ZonedDateTime.now(); + long affected = + queryFactory + .update(mapSheetMngHstEntity) + .set(mapSheetMngHstEntity.useInference, "N") + .set(mapSheetMngHstEntity.useInferenceDttm, now) + .where(mapSheetMngHstEntity.hstUid.in(hstUidList)) + .execute(); + return affected; + } + + @Override + public long updateUploadProcessResult(Long hstUid, String dataState) { + ZonedDateTime now = ZonedDateTime.now(); + long affected = + queryFactory + .update(mapSheetMngHstEntity) + .set(mapSheetMngHstEntity.dataState, dataState) + .set(mapSheetMngHstEntity.dataStateDttm, now) + .where(mapSheetMngHstEntity.hstUid.eq(hstUid)) + .execute(); + return affected; + } + private NumberExpression rowNum() { return Expressions.numberTemplate( Integer.class, "row_number() over(order by {0} desc)", mapSheetMngHstEntity.createdDate); From 2a6e530dd10758e7ed9d6dd0c32820c323cc9042 Mon Sep 17 00:00:00 2001 From: teddy Date: Fri, 12 Dec 2025 11:50:23 +0900 Subject: [PATCH 6/7] =?UTF-8?q?=EC=82=AC=EC=9A=A9=EC=9E=90=20=EC=88=98?= =?UTF-8?q?=EC=A0=95=20=EC=83=81=ED=83=9C=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 --- .../auth/CustomAuthenticationProvider.java | 2 -- .../cd/kamcoback/members/dto/MembersDto.java | 7 +++- .../postgres/core/MapSheetMngCoreService.java | 34 +++++++++---------- .../postgres/core/MembersCoreService.java | 6 +++- 4 files changed, 28 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/kamco/cd/kamcoback/auth/CustomAuthenticationProvider.java b/src/main/java/com/kamco/cd/kamcoback/auth/CustomAuthenticationProvider.java index 4ab0401e..757c0a52 100644 --- a/src/main/java/com/kamco/cd/kamcoback/auth/CustomAuthenticationProvider.java +++ b/src/main/java/com/kamco/cd/kamcoback/auth/CustomAuthenticationProvider.java @@ -11,7 +11,6 @@ import org.springframework.security.authentication.AuthenticationProvider; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; -import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.stereotype.Component; @Component @@ -19,7 +18,6 @@ import org.springframework.stereotype.Component; public class CustomAuthenticationProvider implements AuthenticationProvider { private final MembersRepository membersRepository; - private final UserDetailsService userDetailsService; @Override public Authentication authenticate(Authentication authentication) throws AuthenticationException { diff --git a/src/main/java/com/kamco/cd/kamcoback/members/dto/MembersDto.java b/src/main/java/com/kamco/cd/kamcoback/members/dto/MembersDto.java index f0de1810..de69c6e3 100644 --- a/src/main/java/com/kamco/cd/kamcoback/members/dto/MembersDto.java +++ b/src/main/java/com/kamco/cd/kamcoback/members/dto/MembersDto.java @@ -153,10 +153,15 @@ public class MembersDto { @Size(max = 255) private String tempPassword; - public UpdateReq(String employeeNo, String name, String tempPassword) { + @Schema(description = "상태", example = "ACTIVE") + @EnumValid(enumClass = StatusType.class, message = "status는 ACTIVE, INACTIVE, DELETED 만 가능합니다.") + private String status; + + public UpdateReq(String employeeNo, String name, String tempPassword, String status) { this.employeeNo = employeeNo; this.name = name; this.tempPassword = tempPassword; + this.status = status; } } diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/core/MapSheetMngCoreService.java b/src/main/java/com/kamco/cd/kamcoback/postgres/core/MapSheetMngCoreService.java index d258a1aa..98607d44 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/core/MapSheetMngCoreService.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/core/MapSheetMngCoreService.java @@ -34,20 +34,20 @@ public class MapSheetMngCoreService { private String activeEnv; public Page findMapSheetErrorList( - MapSheetMngDto.@Valid searchReq searchReq) { + MapSheetMngDto.@Valid searchReq searchReq) { return mapSheetMngRepository.findMapSheetErrorList(searchReq); } public Page findMapSheetMngList( - MapSheetMngDto.@Valid searchReq searchReq) { + MapSheetMngDto.@Valid searchReq searchReq) { return mapSheetMngRepository.findMapSheetMngList(searchReq); } public MapSheetMngDto.DmlReturn uploadFile(MultipartFile file, Long hstUid) { MapSheetMngHstEntity entity = - mapSheetMngRepository - .findMapSheetMngHstInfo(hstUid) - .orElseThrow(() -> new EntityNotFoundException("해당 이력이 존재하지 않습니다.")); + mapSheetMngRepository + .findMapSheetMngHstInfo(hstUid) + .orElseThrow(() -> new EntityNotFoundException("해당 이력이 존재하지 않습니다.")); String localPath = ""; String rootDir = ORIGINAL_IMAGES_PATH + "/" + entity.getMngYyyy(); @@ -92,10 +92,10 @@ public class MapSheetMngCoreService { if (!Objects.isNull(hstUidList) && !hstUidList.isEmpty()) { for (Long hstUid : hstUidList) { Optional entity = - Optional.ofNullable( - mapSheetMngRepository - .findMapSheetMngHstInfo(hstUid) - .orElseThrow(EntityNotFoundException::new)); + Optional.ofNullable( + mapSheetMngRepository + .findMapSheetMngHstInfo(hstUid) + .orElseThrow(EntityNotFoundException::new)); // TODO: local TEST 시 각자 경로 수정하기 // TODO: application.yml 에 active profile : local 로 임시 변경하여 테스트 @@ -127,10 +127,10 @@ public class MapSheetMngCoreService { if (!Objects.isNull(hstUidList) && !hstUidList.isEmpty()) { for (Long hstUid : hstUidList) { Optional entity = - Optional.ofNullable( - mapSheetMngRepository - .findMapSheetMngHstInfo(hstUid) - .orElseThrow(EntityNotFoundException::new)); + Optional.ofNullable( + mapSheetMngRepository + .findMapSheetMngHstInfo(hstUid) + .orElseThrow(EntityNotFoundException::new)); // entity.get().updateUseInference(true); } @@ -151,10 +151,10 @@ public class MapSheetMngCoreService { // 모든 파일명을 Set으로 저장 Set fileNames = - paths - .filter(Files::isRegularFile) - .map(p -> p.getFileName().toString()) - .collect(Collectors.toSet()); + paths + .filter(Files::isRegularFile) + .map(p -> p.getFileName().toString()) + .collect(Collectors.toSet()); // 모든 확장자 파일 존재 여부 확인 for (String ext : extensions) { diff --git a/src/main/java/com/kamco/cd/kamcoback/postgres/core/MembersCoreService.java b/src/main/java/com/kamco/cd/kamcoback/postgres/core/MembersCoreService.java index 4ddb2490..b03ce3ed 100644 --- a/src/main/java/com/kamco/cd/kamcoback/postgres/core/MembersCoreService.java +++ b/src/main/java/com/kamco/cd/kamcoback/postgres/core/MembersCoreService.java @@ -81,10 +81,14 @@ public class MembersCoreService { memberEntity.setTempPassword(updateReq.getTempPassword().trim()); } - if (StringUtils.isNotBlank(memberEntity.getEmployeeNo())) { + if (StringUtils.isNotBlank(updateReq.getEmployeeNo())) { memberEntity.setEmployeeNo(updateReq.getEmployeeNo()); } + if (StringUtils.isNotBlank(updateReq.getStatus())) { + memberEntity.setStatus(updateReq.getStatus()); + } + memberEntity.setUpdtrUid(userUtil.getId()); membersRepository.save(memberEntity); From 608d330a45581109ea66f6503b09b7fbdf65de2e Mon Sep 17 00:00:00 2001 From: DanielLee <198891672+sanghyeonhd@users.noreply.github.com> Date: Fri, 12 Dec 2025 13:50:37 +0900 Subject: [PATCH 7/7] local settings change --- src/main/resources/application-local.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml index 6e8788dc..7b211531 100644 --- a/src/main/resources/application-local.yml +++ b/src/main/resources/application-local.yml @@ -6,7 +6,7 @@ spring: jpa: show-sql: true hibernate: - ddl-auto: validate # 스키마 검증만 수행, 자동 변경하지 않음 + ddl-auto: validate # 로컬만 완화(시킬려면 update으로 변경) properties: hibernate: default_batch_fetch_size: 100 # ✅ 성능 - N+1 쿼리 방지 @@ -15,8 +15,8 @@ spring: format_sql: true # ⚠️ 선택 - SQL 포맷팅 (가독성) datasource: - url: jdbc:postgresql://192.168.2.127:15432/kamco_cds - #url: jdbc:postgresql://localhost:5432/kamco_cds + #url: jdbc:postgresql://192.168.2.127:15432/kamco_cds + url: jdbc:postgresql://localhost:15432/kamco_cds username: kamco_cds password: kamco_cds_Q!W@E#R$ hikari: