Conversation
✅ 테스트 결과 for PRBuild: success 🧪 테스트 실행 with Gradle |
Codecov Report❌ Patch coverage is 📢 Thoughts on this report? Let us know! |
There was a problem hiding this comment.
Pull request overview
배치(OPEN API 호출 및 동기화) 실행 시 실행 이력을 DB(batch_execution_log)에 남기고, 이를 조회하는 관리자 API를 추가하는 PR입니다. 동시에 기존 Flyway repeatable 초기 적재 SQL을 주석 처리하여 앞으로는 “동기화 기능”으로만 데이터 적재가 이뤄지도록 방향을 변경합니다.
Changes:
batch_execution_log테이블 및 조회 API(/api/batch-logs) 구현@BatchLog+ AOP(Aspect) 기반으로 배치/동기화 실행 성공·실패 이력 자동 저장- 기존 Flyway R 스크립트 초기 적재 SQL 주석 처리 및 전반적인 import/포맷 정리
Reviewed changes
Copilot reviewed 169 out of 169 changed files in this pull request and generated 7 comments.
Show a summary per file
| File | Description |
|---|---|
| src/test/java/until/the/eternity/metalwareinfo/application/service/MetalwareInfoServiceTest.java | import 정리 |
| src/test/java/until/the/eternity/iteminfo/application/service/ItemInfoServiceTest.java | import 정리 |
| src/test/java/until/the/eternity/common/util/SegongOptionParserTest.java | import 정리 |
| src/test/java/until/the/eternity/auctionsearchoption/application/service/AuctionSearchOptionServiceTest.java | import 정리 |
| src/test/java/until/the/eternity/auctionrealtime/application/service/fetcher/AuctionRealtimeFetcherTest.java | import 정리 |
| src/test/java/until/the/eternity/auctionhistory/domain/service/AuctionHistoryDuplicateCheckerTest.java | import 정리 |
| src/test/java/until/the/eternity/auctionhistory/application/service/persister/AuctionHistoryPersisterTest.java | import 정리 |
| src/test/java/until/the/eternity/auctionhistory/application/service/fetcher/AuctionHistoryFetcherTest.java | import 정리 |
| src/test/java/until/the/eternity/auctionhistory/application/service/AuctionHistoryServiceTest.java | import 정리 |
| src/main/resources/db/migration/V21__create_batch_execution_log_table.sql | 배치 실행 로그 테이블 생성 |
| src/main/resources/db/migration/V22__fix_batch_execution_log_trigger_type_column.sql | trigger_type 컬럼 타입/코멘트 보정 마이그레이션 추가 |
| src/main/resources/db/migration/R__insert_metalware_info_table.sql | 초기 적재 SQL 주석 처리 |
| src/main/resources/db/migration/R__insert_item_option_value_info.sql | 초기 적재 SQL 주석 처리(테이블명 주석 오타 포함) |
| src/main/resources/db/migration/R__insert_item_info.sql | 초기 적재 SQL 주석 처리 |
| src/main/java/until/the/eternity/statistics/repository/weekly/TopCategoryWeeklyStatisticsRepository.java | import 정리 |
| src/main/java/until/the/eternity/statistics/repository/weekly/SubcategoryWeeklyStatisticsRepository.java | import 정리 |
| src/main/java/until/the/eternity/statistics/repository/weekly/ItemWeeklyStatisticsRepository.java | import 정리 |
| src/main/java/until/the/eternity/statistics/repository/daily/TopCategoryDailyStatisticsRepository.java | import 정리 |
| src/main/java/until/the/eternity/statistics/repository/daily/SubcategoryDailyStatisticsRepository.java | import 정리 |
| src/main/java/until/the/eternity/statistics/repository/daily/ItemDailyStatisticsRepository.java | import 정리 |
| src/main/java/until/the/eternity/statistics/interfaces/rest/dto/response/TopCategoryWeeklyStatisticsResponse.java | 포맷 정리 |
| src/main/java/until/the/eternity/statistics/interfaces/rest/dto/response/TopCategoryDailyStatisticsResponse.java | 포맷 정리 |
| src/main/java/until/the/eternity/statistics/interfaces/rest/dto/response/SubcategoryWeeklyStatisticsResponse.java | 포맷 정리 |
| src/main/java/until/the/eternity/statistics/interfaces/rest/dto/response/SubcategoryDailyStatisticsResponse.java | 포맷 정리 |
| src/main/java/until/the/eternity/statistics/interfaces/rest/dto/response/ItemWeeklyStatisticsResponse.java | 포맷 정리 |
| src/main/java/until/the/eternity/statistics/interfaces/rest/dto/response/ItemDailyStatisticsResponse.java | 포맷 정리 |
| src/main/java/until/the/eternity/statistics/interfaces/rest/dto/request/TopCategoryWeeklyStatisticsSearchRequest.java | import 정리 |
| src/main/java/until/the/eternity/statistics/interfaces/rest/dto/request/TopCategoryDailyStatisticsSearchRequest.java | import 정리 |
| src/main/java/until/the/eternity/statistics/interfaces/rest/dto/request/SubcategoryWeeklyStatisticsSearchRequest.java | import 정리 |
| src/main/java/until/the/eternity/statistics/interfaces/rest/dto/request/SubcategoryDailyStatisticsSearchRequest.java | import 정리 |
| src/main/java/until/the/eternity/statistics/interfaces/rest/dto/request/ItemWeeklyStatisticsSearchRequest.java | import 정리 |
| src/main/java/until/the/eternity/statistics/interfaces/rest/dto/request/ItemDailyStatisticsSearchRequest.java | import 정리 |
| src/main/java/until/the/eternity/statistics/interfaces/rest/dto/request/DailyStatisticsSearchRequest.java | import 정리 |
| src/main/java/until/the/eternity/statistics/domain/entity/weekly/TopCategoryWeeklyStatistics.java | import 정리 |
| src/main/java/until/the/eternity/statistics/domain/entity/weekly/SubcategoryWeeklyStatistics.java | import 정리 |
| src/main/java/until/the/eternity/statistics/domain/entity/weekly/ItemWeeklyStatistics.java | import 정리 |
| src/main/java/until/the/eternity/statistics/domain/entity/daily/TopCategoryDailyStatistics.java | import 정리 |
| src/main/java/until/the/eternity/statistics/domain/entity/daily/SubcategoryDailyStatistics.java | import 정리 |
| src/main/java/until/the/eternity/statistics/domain/entity/daily/ItemDailyStatistics.java | import 정리 |
| src/main/java/until/the/eternity/ranking/repository/RankingRepository.java | import 정리 |
| src/main/java/until/the/eternity/ranking/interfaces/rest/dto/response/VolumeRankingResponse.java | 포맷 정리 |
| src/main/java/until/the/eternity/ranking/interfaces/rest/dto/response/VolumeChangeRankingResponse.java | 포맷 정리 |
| src/main/java/until/the/eternity/ranking/interfaces/rest/dto/response/PriceRankingResponse.java | 포맷 정리 |
| src/main/java/until/the/eternity/ranking/interfaces/rest/dto/response/PriceChangeRankingResponse.java | 포맷 정리 |
| src/main/java/until/the/eternity/ranking/interfaces/rest/dto/response/AllTimeRankingResponse.java | 포맷 정리 |
| src/main/java/until/the/eternity/ranking/interfaces/rest/controller/VolumeRankingController.java | import 정리 |
| src/main/java/until/the/eternity/ranking/interfaces/rest/controller/PriceRankingController.java | import 정리 |
| src/main/java/until/the/eternity/ranking/interfaces/rest/controller/PriceChangeRankingController.java | import 정리 |
| src/main/java/until/the/eternity/ranking/interfaces/rest/controller/CategoryRankingController.java | import 정리 |
| src/main/java/until/the/eternity/ranking/interfaces/rest/controller/AllTimeRankingController.java | import 정리 |
| src/main/java/until/the/eternity/ranking/domain/mapper/RankingMapper.java | import 정리 |
| src/main/java/until/the/eternity/ranking/application/service/VolumeRankingService.java | import 정리 |
| src/main/java/until/the/eternity/ranking/application/service/PriceRankingService.java | import 정리 |
| src/main/java/until/the/eternity/ranking/application/service/PriceChangeRankingService.java | import 정리 |
| src/main/java/until/the/eternity/ranking/application/service/CategoryRankingService.java | import 정리 |
| src/main/java/until/the/eternity/ranking/application/service/AllTimeRankingService.java | import 정리 |
| src/main/java/until/the/eternity/metalwareinfo/interfaces/rest/dto/response/MetalwareInfoResponse.java | import 정리 |
| src/main/java/until/the/eternity/metalwareinfo/interfaces/rest/controller/MetalwareInfoController.java | import 정리 |
| src/main/java/until/the/eternity/metalwareinfo/interfaces/rest/controller/MetalwareAttributeInfoController.java | Swagger 어노테이션 포맷 정리 |
| src/main/java/until/the/eternity/metalwareinfo/infrastructure/persistence/MetalwareInfoRepositoryPortImpl.java | import 정리 |
| src/main/java/until/the/eternity/metalwareinfo/infrastructure/persistence/MetalwareInfoJpaRepository.java | import 정리 |
| src/main/java/until/the/eternity/metalwareinfo/infrastructure/persistence/MetalwareAttributeInfoRepositoryPortImpl.java | RepositoryPort에 count() 추가 구현 |
| src/main/java/until/the/eternity/metalwareinfo/domain/repository/MetalwareAttributeInfoRepositoryPort.java | count() 신규 메서드 추가 |
| src/main/java/until/the/eternity/metalwareinfo/application/service/MetalwareInfoService.java | import 정리 |
| src/main/java/until/the/eternity/metalwareinfo/application/service/MetalwareAttributeInfoService.java | @BatchLog 적용 및 sync 로직 변경(처리건수 계산) |
| src/main/java/until/the/eternity/itemoptioninfo/interfaces/rest/controller/ItemOptionInfoController.java | import/Swagger 어노테이션 포맷 정리 |
| src/main/java/until/the/eternity/itemoptioninfo/infrastructure/persistence/ItemOptionInfoRepositoryPortImpl.java | import 정리 |
| src/main/java/until/the/eternity/itemoptioninfo/domain/repository/ItemOptionInfoRepositoryPort.java | import 정리 |
| src/main/java/until/the/eternity/itemoptioninfo/domain/entity/ItemOptionInfoId.java | import 정리 |
| src/main/java/until/the/eternity/itemoptioninfo/application/service/ItemOptionInfoService.java | import 정리 |
| src/main/java/until/the/eternity/iteminfo/interfaces/rest/dto/response/ItemInfoSyncResponse.java | import 정리 |
| src/main/java/until/the/eternity/iteminfo/interfaces/rest/dto/response/ItemInfoSummaryResponse.java | import 정리 |
| src/main/java/until/the/eternity/iteminfo/interfaces/rest/dto/response/ItemInfoResponse.java | import 정리 |
| src/main/java/until/the/eternity/iteminfo/interfaces/rest/dto/response/ItemCategoryResponse.java | import 정리 |
| src/main/java/until/the/eternity/iteminfo/interfaces/rest/controller/ItemInfoController.java | Swagger 어노테이션 포맷 정리 |
| src/main/java/until/the/eternity/iteminfo/infrastructure/persistence/ItemInfoRepositoryPortImpl.java | import 정리 |
| src/main/java/until/the/eternity/iteminfo/infrastructure/persistence/ItemInfoQueryDslRepository.java | import 정리 |
| src/main/java/until/the/eternity/iteminfo/infrastructure/persistence/ItemInfoJpaRepository.java | import 정리 |
| src/main/java/until/the/eternity/iteminfo/domain/repository/ItemInfoRepositoryPort.java | import 정리 |
| src/main/java/until/the/eternity/iteminfo/domain/exception/ItemInfoExceptionCode.java | static import 정리 |
| src/main/java/until/the/eternity/iteminfo/domain/entity/ItemInfoId.java | import 정리 |
| src/main/java/until/the/eternity/iteminfo/application/service/ItemInfoService.java | @BatchLog 적용 |
| src/main/java/until/the/eternity/hornBugle/kafka/application/HornBugleKafkaProducerService.java | import 정리 |
| src/main/java/until/the/eternity/hornBugle/interfaces/rest/dto/response/HornBugleHistoryResponse.java | 포맷 정리 |
| src/main/java/until/the/eternity/hornBugle/interfaces/rest/controller/HornBugleController.java | Swagger 어노테이션 포맷 정리 |
| src/main/java/until/the/eternity/hornBugle/interfaces/external/dto/OpenApiHornBugleHistoryResponse.java | 포맷 정리 |
| src/main/java/until/the/eternity/hornBugle/interfaces/external/dto/OpenApiHornBugleHistoryListResponse.java | 포맷 정리 |
| src/main/java/until/the/eternity/hornBugle/infrastructure/persistence/HornBugleRepositoryPortImpl.java | import 정리 |
| src/main/java/until/the/eternity/hornBugle/infrastructure/persistence/HornBugleJpaRepository.java | import 정리 |
| src/main/java/until/the/eternity/hornBugle/infrastructure/elasticsearch/HornBugleIndexService.java | import 정리 |
| src/main/java/until/the/eternity/hornBugle/infrastructure/elasticsearch/HornBugleDocument.java | import 정리 |
| src/main/java/until/the/eternity/hornBugle/domain/service/HornBugleDuplicateChecker.java | import 정리 |
| src/main/java/until/the/eternity/hornBugle/domain/repository/HornBugleRepositoryPort.java | import 정리 |
| src/main/java/until/the/eternity/hornBugle/domain/mapper/HornBugleMapper.java | import 정리 |
| src/main/java/until/the/eternity/hornBugle/domain/enums/HornBugleServer.java | import 정리 |
| src/main/java/until/the/eternity/hornBugle/domain/entity/HornBugleWorldHistory.java | import 정리 |
| src/main/java/until/the/eternity/hornBugle/application/service/HornBugleService.java | import 정리 |
| src/main/java/until/the/eternity/hornBugle/application/scheduler/HornBugleScheduler.java | import 정리 |
| src/main/java/until/the/eternity/hornBugle/application/runner/HornBugleIndexRunner.java | import 정리 |
| src/main/java/until/the/eternity/config/openapi/OpenApiWebClientProperties.java | import 정리 |
| src/main/java/until/the/eternity/config/openapi/OpenApiRetryPolicy.java | import 정리 |
| src/main/java/until/the/eternity/config/openapi/OpenApiFilters.java | import 정리 |
| src/main/java/until/the/eternity/common/util/SegongOptionParser.java | import 정리 |
| src/main/java/until/the/eternity/common/response/PageResponseDto.java | 포맷 정리 |
| src/main/java/until/the/eternity/common/response/ApiResponse.java | import 정리 |
| src/main/java/until/the/eternity/common/exception/GlobalExceptionHandler.java | static import 정리 |
| src/main/java/until/the/eternity/common/exception/GlobalExceptionCode.java | static import 정리 |
| src/main/java/until/the/eternity/common/enums/SortField.java | 포맷 정리 |
| src/main/java/until/the/eternity/common/enums/SortDirection.java | import 정리 |
| src/main/java/until/the/eternity/common/enums/ItemCategory.java | import 정리 |
| src/main/java/until/the/eternity/common/aspect/BatchExecutionLoggingAspect.java | @BatchLog 기반 실행 이력 로깅 AOP 추가 |
| src/main/java/until/the/eternity/common/annotation/BatchLog.java | 배치 로깅용 어노테이션 추가 |
| src/main/java/until/the/eternity/batchlog/interfaces/rest/dto/response/BatchExecutionLogResponse.java | 배치 실행 로그 응답 DTO 추가 |
| src/main/java/until/the/eternity/batchlog/interfaces/rest/controller/BatchExecutionLogController.java | 배치 실행 로그 조회 API 추가 |
| src/main/java/until/the/eternity/batchlog/infrastructure/persistence/BatchExecutionLogRepositoryPortImpl.java | 저장/조회 포트 구현 추가 |
| src/main/java/until/the/eternity/batchlog/infrastructure/persistence/BatchExecutionLogJpaRepository.java | JPA Repository 추가 |
| src/main/java/until/the/eternity/batchlog/domain/repository/BatchExecutionLogRepositoryPort.java | Repository Port 추가 |
| src/main/java/until/the/eternity/batchlog/domain/enums/TriggerType.java | 실행 트리거 타입 enum 추가 |
| src/main/java/until/the/eternity/batchlog/domain/enums/BatchType.java | 배치 타입 enum 추가 |
| src/main/java/until/the/eternity/batchlog/domain/entity/BatchExecutionLog.java | 실행 이력 엔티티 추가 |
| src/main/java/until/the/eternity/batchlog/application/service/BatchExecutionLogService.java | 실행 이력 저장/조회 서비스 추가 |
| src/main/java/until/the/eternity/auctionsearchoption/interfaces/rest/dto/response/SearchOptionMetadataResponse.java | 포맷 정리 |
| src/main/java/until/the/eternity/auctionsearchoption/interfaces/rest/dto/response/FieldMetadata.java | 포맷 정리 |
| src/main/java/until/the/eternity/auctionsearchoption/interfaces/rest/AuctionSearchOptionController.java | import 정리 |
| src/main/java/until/the/eternity/auctionsearchoption/infrastructure/persistence/AuctionSearchOptionRepositoryPortImpl.java | import 정리 |
| src/main/java/until/the/eternity/auctionsearchoption/infrastructure/persistence/AuctionSearchOptionJpaRepository.java | import 정리 |
| src/main/java/until/the/eternity/auctionsearchoption/domain/repository/AuctionSearchOptionRepositoryPort.java | import 정리 |
| src/main/java/until/the/eternity/auctionsearchoption/domain/entity/AuctionSearchOptionMetadata.java | import 정리 |
| src/main/java/until/the/eternity/auctionsearchoption/application/service/AuctionSearchOptionService.java | import 정리 |
| src/main/java/until/the/eternity/auctionrealtime/interfaces/rest/dto/response/AuctionRealtimeDetailResponse.java | 포맷 정리 |
| src/main/java/until/the/eternity/auctionrealtime/interfaces/rest/dto/request/RealtimeSortField.java | 포맷 정리 |
| src/main/java/until/the/eternity/auctionrealtime/interfaces/external/dto/OpenApiAuctionRealtimeResponse.java | import 정리 |
| src/main/java/until/the/eternity/auctionrealtime/interfaces/external/dto/OpenApiAuctionRealtimeListResponse.java | 포맷 정리 |
| src/main/java/until/the/eternity/auctionrealtime/infrastructure/persistence/AuctionRealtimeQueryDslRepository.java | import 정리 |
| src/main/java/until/the/eternity/auctionrealtime/infrastructure/persistence/AuctionRealtimeItemRepositoryPortImpl.java | import 정리 |
| src/main/java/until/the/eternity/auctionrealtime/infrastructure/persistence/AuctionRealtimeItemRepository.java | import 정리 |
| src/main/java/until/the/eternity/auctionrealtime/domain/service/persister/AuctionRealtimePersisterPort.java | import 정리 |
| src/main/java/until/the/eternity/auctionrealtime/domain/service/fetcher/AuctionRealtimeFetcherPort.java | import 정리 |
| src/main/java/until/the/eternity/auctionrealtime/domain/repository/AuctionRealtimeItemRepositoryPort.java | import 정리 |
| src/main/java/until/the/eternity/auctionrealtime/domain/mapper/OpenApiAuctionRealtimeMapper.java | import 정리 |
| src/main/java/until/the/eternity/auctionrealtime/domain/mapper/AuctionRealtimeMapper.java | import 정리 |
| src/main/java/until/the/eternity/auctionrealtime/application/service/persister/AuctionRealtimePersister.java | import 정리 |
| src/main/java/until/the/eternity/auctionrealtime/application/service/fetcher/AuctionRealtimeFetcher.java | import 정리 |
| src/main/java/until/the/eternity/auctionrealtime/application/service/AuctionRealtimeService.java | import 정리 |
| src/main/java/until/the/eternity/auctionrealtime/application/scheduler/AuctionRealtimeScheduler.java | import 정리 |
| src/main/java/until/the/eternity/auctionitemoption/domain/entity/AuctionHistoryItemOption.java | import 정리 |
| src/main/java/until/the/eternity/auctionitem/domain/entity/AuctionRealtimeItemOption.java | import 정리 |
| src/main/java/until/the/eternity/auctionitem/domain/entity/AuctionRealtimeItem.java | import 정리 |
| src/main/java/until/the/eternity/auctionhistory/interfaces/rest/dto/response/AuctionHistoryDetailResponse.java | 포맷 정리 |
| src/main/java/until/the/eternity/auctionhistory/interfaces/rest/dto/enums/SortDirection.java | 포맷 정리 |
| src/main/java/until/the/eternity/auctionhistory/interfaces/rest/dto/enums/SearchStandard.java | 포맷 정리 |
| src/main/java/until/the/eternity/auctionhistory/interfaces/rest/controller/AuctionHistoryController.java | Swagger 어노테이션 포맷 정리 |
| src/main/java/until/the/eternity/auctionhistory/interfaces/external/dto/OpenApiAuctionHistoryResponse.java | import 정리 |
| src/main/java/until/the/eternity/auctionhistory/interfaces/external/dto/OpenApiAuctionHistoryListResponse.java | 포맷 정리 |
| src/main/java/until/the/eternity/auctionhistory/infrastructure/persistence/AuctionHistoryRepositoryPortImpl.java | import 정리 |
| src/main/java/until/the/eternity/auctionhistory/infrastructure/persistence/AuctionHistoryQueryDslRepository.java | import 정리 |
| src/main/java/until/the/eternity/auctionhistory/infrastructure/persistence/AuctionHistoryJpaRepository.java | import 정리 |
| src/main/java/until/the/eternity/auctionhistory/domain/service/persister/AuctionHistoryPersisterPort.java | import 정리 |
| src/main/java/until/the/eternity/auctionhistory/domain/service/fetcher/AuctionHistoryFetcherPort.java | import 정리 |
| src/main/java/until/the/eternity/auctionhistory/domain/service/AuctionHistoryDuplicateChecker.java | import 정리 |
| src/main/java/until/the/eternity/auctionhistory/domain/repository/AuctionHistoryRepositoryPort.java | import 정리 |
| src/main/java/until/the/eternity/auctionhistory/domain/mapper/OpenApiAuctionHistoryMapper.java | import 정리 |
| src/main/java/until/the/eternity/auctionhistory/domain/mapper/AuctionHistoryMapper.java | import 정리 |
| src/main/java/until/the/eternity/auctionhistory/domain/event/AuctionHistorySavedEvent.java | import 정리 |
| src/main/java/until/the/eternity/auctionhistory/domain/entity/AuctionHistory.java | import 정리 |
| src/main/java/until/the/eternity/auctionhistory/application/service/persister/AuctionHistoryPersister.java | import 정리 |
| src/main/java/until/the/eternity/auctionhistory/application/service/fetcher/AuctionHistoryFetcher.java | import 정리 |
| src/main/java/until/the/eternity/auctionhistory/application/service/AuctionHistoryService.java | import 정리 |
| src/main/java/until/the/eternity/auctionhistory/application/scheduler/AuctionHistoryScheduler.java | @BatchLog 적용 및 반환값(int) 추가(저장 건수) |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
src/main/resources/db/migration/V22__fix_batch_execution_log_trigger_type_column.sql
Show resolved
Hide resolved
| int count = extractCount(result); | ||
| String message = buildSuccessMessage(batchLog.type(), count); | ||
| batchExecutionLogService.saveSuccess( | ||
| batchLog.type(), triggerType, startedAt, count, message); | ||
| return result; | ||
| } catch (Exception e) { | ||
| String rawMessage = "실패 사유: " + e.getMessage(); | ||
| String message = | ||
| rawMessage.length() > MESSAGE_MAX_LENGTH | ||
| ? rawMessage.substring(0, MESSAGE_MAX_LENGTH) | ||
| : rawMessage; | ||
| batchExecutionLogService.saveFailure(batchLog.type(), triggerType, startedAt, message); | ||
| throw e; |
There was a problem hiding this comment.
배치 로깅 저장(saveSuccess/saveFailure)이 실패하면 원래 배치 결과/예외를 덮어써서 장애 원인 추적이 어려워질 수 있습니다. 로깅 저장은 try/catch로 감싸서 실패 시에도 원래 결과(또는 원래 예외)를 그대로 유지하고, 로깅 실패는 별도로 로그만 남기도록 처리해 주세요.
| long before = metalwareAttributeInfoRepository.count(); | ||
| int raw = metalwareAttributeInfoRepository.syncFromAuctionHistory(); | ||
| long after = metalwareAttributeInfoRepository.count(); | ||
| int inserted = (int) (after - before); | ||
| int updated = (raw - inserted) / 2; | ||
| return inserted + updated; |
There was a problem hiding this comment.
MetalwareAttributeInfo sync count 계산이 MySQL INSERT ... ON DUPLICATE KEY UPDATE의 affected rows 규칙(INSERT=1, UPDATE=2/0)에 의존하고 있어서 실제 업데이트/동기화 건수와 불일치할 수 있습니다. 또한 before/after count 기반이라 동시 실행/외부 변경이 있으면 inserted가 음수/부정확해질 수 있고 (int) 캐스팅으로 overflow 가능성도 있습니다. syncFromAuctionHistory()가 반환하는 raw 값을 그대로 사용하거나, inserted/updated를 명확히 반환하도록 쿼리/리포지토리 계약을 분리하는 방식으로 정확도를 보장해 주세요.
| @Enumerated(EnumType.ORDINAL) | ||
| @Column(name = "trigger_type", nullable = false) | ||
| private TriggerType triggerType; |
There was a problem hiding this comment.
TriggerType를 @Enumerated(EnumType.ORDINAL)로 저장하면 enum 선언 순서 변경/값 추가 시 기존 데이터가 다른 의미로 해석될 수 있어 로그 데이터가 쉽게 깨집니다. EnumType.STRING(컬럼을 VARCHAR로)로 저장하거나, 0/1을 고정 매핑하는 AttributeConverter를 두어 DB 값이 안정적으로 유지되게 해주세요.
| import until.the.eternity.batchlog.application.service.BatchExecutionLogService; | ||
| import until.the.eternity.batchlog.domain.enums.BatchType; | ||
| import until.the.eternity.batchlog.domain.enums.TriggerType; | ||
| import until.the.eternity.common.annotation.BatchLog; | ||
| import until.the.eternity.iteminfo.interfaces.rest.dto.response.ItemInfoSyncResponse; | ||
|
|
There was a problem hiding this comment.
이 Aspect가 ItemInfoSyncResponse(interfaces 레이어 DTO)에 직접 의존해서 공통(AOP) 모듈이 특정 API DTO에 강결합됩니다. 배치 메서드들이 공통적으로 int(처리건수)만 반환하도록 계약을 통일하거나, 처리건수를 노출하는 공통 인터페이스/결과 타입을 만들어 레이어 의존성을 끊어주세요.
| try { | ||
| Object result = pjp.proceed(); | ||
| int count = extractCount(result); | ||
| String message = buildSuccessMessage(batchLog.type(), count); | ||
| batchExecutionLogService.saveSuccess( | ||
| batchLog.type(), triggerType, startedAt, count, message); | ||
| return result; | ||
| } catch (Exception e) { | ||
| String rawMessage = "실패 사유: " + e.getMessage(); | ||
| String message = | ||
| rawMessage.length() > MESSAGE_MAX_LENGTH | ||
| ? rawMessage.substring(0, MESSAGE_MAX_LENGTH) | ||
| : rawMessage; | ||
| batchExecutionLogService.saveFailure(batchLog.type(), triggerType, startedAt, message); | ||
| throw e; |
There was a problem hiding this comment.
예외 로깅이 catch (Exception e)로만 처리되어 Error 등 Throwable 계열이 발생하면 배치 실행 실패 로그가 남지 않습니다. 배치 실행 이력을 반드시 남기는 목적이라면 Throwable을 잡아서 로그를 남긴 뒤 다시 던지는 방식으로 범위를 넓혀주세요.
| -- TODO: upsert문으로 변경 | ||
| -- delete from item_option_value_info; | ||
| -- insert into item_option_value_info (option_type, option_sub_type, option_value, option_value2, option_desc) | ||
| -- select distinct option_type, option_sub_type, option_value, option_value2, option_desc from auction__history_item_option; No newline at end of file |
There was a problem hiding this comment.
주석 처리된 SQL이지만, 나중에 활성화할 때를 고려하면 테이블명이 잘못되어 있습니다 (auction__history_item_option → auction_history_item_option). 오타를 바로잡아 주세요.
📋 상세 설명
batch_execution_log구현📊 체크리스트