Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public class GlobalExceptionHandler {

@ExceptionHandler(ResourceNotFoundException.class)
public ResponseEntity<ErrorResponse> 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())
Expand All @@ -30,7 +30,7 @@ public ResponseEntity<ErrorResponse> handleResourceNotFound(ResourceNotFoundExce

@ExceptionHandler(ValidationException.class)
public ResponseEntity<ErrorResponse> 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())
Expand All @@ -40,7 +40,7 @@ public ResponseEntity<ErrorResponse> handleValidation(ValidationException ex) {

@ExceptionHandler(TokenExpiredException.class)
public ResponseEntity<ErrorResponse> 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())
Expand All @@ -50,7 +50,7 @@ public ResponseEntity<ErrorResponse> handleTokenExpired(TokenExpiredException ex

@ExceptionHandler(UnauthorizedException.class)
public ResponseEntity<ErrorResponse> 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())
Expand All @@ -73,7 +73,6 @@ public ResponseEntity<ErrorResponse> handleBadCredentials(BadCredentialsExceptio

@ExceptionHandler(PresignedUrlException.class)
public ResponseEntity<ErrorResponse> handlePresignedUrlException(PresignedUrlException ex) {
log.error("Presigned URL generation failed: {}", ex.getMessage(), ex);
ErrorResponse errorResponse = ErrorResponse.builder()
.errorCode("PRESIGNED_URL_ERROR")
.message(ex.getMessage())
Expand All @@ -90,7 +89,7 @@ public ResponseEntity<ErrorResponse> 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())
Expand All @@ -100,7 +99,7 @@ public ResponseEntity<ErrorResponse> handleMethodArgumentNotValid(MethodArgument

@ExceptionHandler(Exception.class)
public ResponseEntity<ErrorResponse> 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())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,31 +28,36 @@ public class UserCleanupScheduler {
@Value("${scheduler.refresh-token-cleanup.retention-days}")
private int refreshTokenRetentionDays;

/**
* 탈퇴 유저 30일 이후에 실제 정보 물리적 삭제.
*/
@Scheduled(cron = "0 0 4 * * *")
@Transactional
public void hardDeleteWithdrawnUsers() {
LocalDateTime threshold = LocalDateTime.now().minusDays(30);
List<User> 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);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand All @@ -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);
}
}
Expand All @@ -91,16 +89,14 @@ 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)
.expiresAt(LocalDateTime.now().plusSeconds(properties.getPresignedUrlExpiration()))
.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);
}
}
Expand Down Expand Up @@ -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;
}
}
Expand Down