From f63ddc1ecb815121983661d8f0cb6a0040982985 Mon Sep 17 00:00:00 2001 From: ThinkKat Date: Sun, 1 Mar 2026 21:25:09 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20=EC=A0=84=EC=B2=B4=20=EB=A1=9C=EA=B7=B8?= =?UTF-8?q?=20=ED=8F=AC=EB=A7=B7=20event=3D*=20key=3Dvalue=20=ED=98=95?= =?UTF-8?q?=EC=8B=9D=EC=9C=BC=EB=A1=9C=20=ED=86=B5=EC=9D=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - PresignedUrlService: 불필요한 INFO 로그 삭제, error → event= 포맷 (generateUploadUrl/downloadUrl INFO 제거, presigned_upload_url_fail, presigned_download_url_fail, s3_check_fail 이벤트 코드 적용) - GlobalExceptionHandler: 자유 형식 → event= 포맷 통일 (PresignedUrlException 중복 로그 제거, resource_not_found, validation_error, token_expired, unauthorized_access, invalid_input, unexpected_error 이벤트 코드 적용) - UserCleanupScheduler: [UserCleanup] 접두사 → event= 포맷 통일 (scheduler_user_deleted, scheduler_user_cleanup_done, scheduler_token_cleanup_done, 대상 없을 때 불필요 INFO 제거) --- .../practice/exception/GlobalExceptionHandler.java | 13 ++++++------- .../practice/scheduler/UserCleanupScheduler.java | 13 +++++++++---- .../opic/practice/service/PresignedUrlService.java | 10 +++------- 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/src/main/java/me/thinkcat/opic/practice/exception/GlobalExceptionHandler.java b/src/main/java/me/thinkcat/opic/practice/exception/GlobalExceptionHandler.java index 165e3f5..1c2dd3e 100644 --- a/src/main/java/me/thinkcat/opic/practice/exception/GlobalExceptionHandler.java +++ b/src/main/java/me/thinkcat/opic/practice/exception/GlobalExceptionHandler.java @@ -20,7 +20,7 @@ public class GlobalExceptionHandler { @ExceptionHandler(ResourceNotFoundException.class) public ResponseEntity handleResourceNotFound(ResourceNotFoundException ex) { - log.warn("Resource not found: {}", ex.getMessage()); + log.warn("event=resource_not_found | msg={}", ex.getMessage()); ErrorResponse errorResponse = ErrorResponse.builder() .errorCode("RESOURCE_NOT_FOUND") .message(ex.getMessage()) @@ -30,7 +30,7 @@ public ResponseEntity handleResourceNotFound(ResourceNotFoundExce @ExceptionHandler(ValidationException.class) public ResponseEntity handleValidation(ValidationException ex) { - log.warn("Validation error: {}", ex.getMessage()); + log.warn("event=validation_error | msg={}", ex.getMessage()); ErrorResponse errorResponse = ErrorResponse.builder() .errorCode("VALIDATION_ERROR") .message(ex.getMessage()) @@ -40,7 +40,7 @@ public ResponseEntity handleValidation(ValidationException ex) { @ExceptionHandler(TokenExpiredException.class) public ResponseEntity handleTokenExpired(TokenExpiredException ex) { - log.warn("Token expired: {}", ex.getMessage()); + log.warn("event=token_expired | msg={}", ex.getMessage()); ErrorResponse errorResponse = ErrorResponse.builder() .errorCode("REFRESH_TOKEN_EXPIRED") .message(ex.getMessage()) @@ -50,7 +50,7 @@ public ResponseEntity handleTokenExpired(TokenExpiredException ex @ExceptionHandler(UnauthorizedException.class) public ResponseEntity handleUnauthorized(UnauthorizedException ex) { - log.warn("Unauthorized access: {}", ex.getMessage()); + log.warn("event=unauthorized_access | msg={}", ex.getMessage()); ErrorResponse errorResponse = ErrorResponse.builder() .errorCode("UNAUTHORIZED") .message(ex.getMessage()) @@ -73,7 +73,6 @@ public ResponseEntity handleBadCredentials(BadCredentialsExceptio @ExceptionHandler(PresignedUrlException.class) public ResponseEntity handlePresignedUrlException(PresignedUrlException ex) { - log.error("Presigned URL generation failed: {}", ex.getMessage(), ex); ErrorResponse errorResponse = ErrorResponse.builder() .errorCode("PRESIGNED_URL_ERROR") .message(ex.getMessage()) @@ -90,7 +89,7 @@ public ResponseEntity handleMethodArgumentNotValid(MethodArgument errors.put(fieldName, errorMessage); }); - log.warn("Method argument validation failed: {}", errors); + log.warn("event=invalid_input | errors={}", errors); ErrorResponse errorResponse = ErrorResponse.builder() .errorCode("INVALID_INPUT") .message("Validation failed: " + errors.toString()) @@ -100,7 +99,7 @@ public ResponseEntity handleMethodArgumentNotValid(MethodArgument @ExceptionHandler(Exception.class) public ResponseEntity handleGeneral(Exception ex) { - log.error("Unexpected error occurred: {}", ex.getMessage(), ex); + log.error("event=unexpected_error | msg={}", ex.getMessage(), ex); ErrorResponse errorResponse = ErrorResponse.builder() .errorCode("INTERNAL_SERVER_ERROR") .message("An unexpected error occurred: " + ex.getMessage()) diff --git a/src/main/java/me/thinkcat/opic/practice/scheduler/UserCleanupScheduler.java b/src/main/java/me/thinkcat/opic/practice/scheduler/UserCleanupScheduler.java index 7403530..de5c3f8 100644 --- a/src/main/java/me/thinkcat/opic/practice/scheduler/UserCleanupScheduler.java +++ b/src/main/java/me/thinkcat/opic/practice/scheduler/UserCleanupScheduler.java @@ -28,6 +28,9 @@ public class UserCleanupScheduler { @Value("${scheduler.refresh-token-cleanup.retention-days}") private int refreshTokenRetentionDays; + /** + * 탈퇴 유저 30일 이후에 실제 정보 물리적 삭제. + */ @Scheduled(cron = "0 0 4 * * *") @Transactional public void hardDeleteWithdrawnUsers() { @@ -35,24 +38,26 @@ public void hardDeleteWithdrawnUsers() { List targets = userRepository.findSoftDeletedBefore(threshold); if (targets.isEmpty()) { - log.info("[UserCleanup] No withdrawn users to delete."); return; } for (User user : targets) { refreshTokenRepository.deleteByUserId(user.getId()); userRepository.delete(user); - log.info("[UserCleanup] Hard deleted user id={}, deletedAt={}", user.getId(), user.getDeletedAt()); + log.info("event=scheduler_user_deleted | userId={} | deletedAt={}", user.getId(), user.getDeletedAt()); } - log.info("[UserCleanup] Hard deleted {} withdrawn users.", targets.size()); + log.info("event=scheduler_user_cleanup_done | count={}", targets.size()); } + /** + * 90일 지난 refresh token 삭제 + */ @Scheduled(cron = "${scheduler.refresh-token-cleanup.cron}") @Transactional public void cleanupOldRefreshTokens() { LocalDateTime cutoff = LocalDateTime.now().minusDays(refreshTokenRetentionDays); refreshTokenRepository.deleteOlderThan(cutoff); - log.info("[UserCleanup] Old refresh tokens deleted (cutoff={})", cutoff); + log.info("event=scheduler_token_cleanup_done | cutoff={}", cutoff); } } diff --git a/src/main/java/me/thinkcat/opic/practice/service/PresignedUrlService.java b/src/main/java/me/thinkcat/opic/practice/service/PresignedUrlService.java index 438fc42..f404d23 100644 --- a/src/main/java/me/thinkcat/opic/practice/service/PresignedUrlService.java +++ b/src/main/java/me/thinkcat/opic/practice/service/PresignedUrlService.java @@ -57,8 +57,6 @@ public PresignedUrlResponse generateUploadUrl(PresignedUrlRequest request) { // Presigned URL 생성 PresignedPutObjectRequest presignedRequest = s3Presigner.presignPutObject(presignRequest); - log.info("Generated upload URL for key: {}", request.getFileKey()); - return PresignedUrlResponse.builder() .uploadUrl(presignedRequest.url().toString()) .fileKey(request.getFileKey()) @@ -70,7 +68,7 @@ public PresignedUrlResponse generateUploadUrl(PresignedUrlRequest request) { .build(); } catch (Exception e) { - log.error("Failed to generate upload URL for key: {}", request.getFileKey(), e); + log.error("event=presigned_upload_url_fail | fileKey={}", request.getFileKey(), e); throw new PresignedUrlException("Failed to generate upload URL", e); } } @@ -91,8 +89,6 @@ public PresignedUrlResponse generateDownloadUrl(String fileKey) { PresignedGetObjectRequest presignedRequest = s3Presigner.presignGetObject(presignRequest); - log.info("Generated download URL for key: {}", fileKey); - return PresignedUrlResponse.builder() .uploadUrl(presignedRequest.url().toString()) .fileKey(fileKey) @@ -100,7 +96,7 @@ public PresignedUrlResponse generateDownloadUrl(String fileKey) { .build(); } catch (Exception e) { - log.error("Failed to generate download URL for file: {}", fileKey, e); + log.error("event=presigned_download_url_fail | fileKey={}", fileKey, e); throw new PresignedUrlException("Failed to generate download URL", e); } } @@ -157,7 +153,7 @@ public boolean checkFileExists(String fileKey) { log.debug("File does not exist in S3: {}", fileKey); return false; } catch (Exception e) { - log.error("Error checking file existence in S3: {}", fileKey, e); + log.error("event=s3_check_fail | fileKey={}", fileKey, e); return false; } }