Skip to content

Comments

feat: 배치 실행 이력 로깅 기능 추가#103

Open
dev-ant wants to merge 2 commits intodevfrom
feat/batch-exec-db-logging
Open

feat: 배치 실행 이력 로깅 기능 추가#103
dev-ant wants to merge 2 commits intodevfrom
feat/batch-exec-db-logging

Conversation

@dev-ant
Copy link
Contributor

@dev-ant dev-ant commented Feb 20, 2026

📋 상세 설명

  • 배치 (OPEN API 호출 및 동기화) 기능 실행 시 이력을 남기는 DB 테이블 batch_execution_log 구현
    • 해당 테이블의 데이터는 사용자가 생성/수정/삭제가 불가능하고 조회만이 가능함
  • 기존의 flyway R Script에서 초기 데이터 적재 SQL은 전부 주석처리함
    • 앞으로는 동기화 기능을 사용하여 데이터를 적재

📊 체크리스트

  • PR 제목이 형식에 맞나요 e.g. feat: PR을 등록한다
  • 코드가 테스트 되었나요
  • 문서는 업데이트 되었나요
  • 불필요한 코드를 제거했나요
  • 이슈와 라벨이 등록되었나요

@dev-ant dev-ant requested a review from Copilot February 20, 2026 03:29
@dev-ant dev-ant self-assigned this Feb 20, 2026
@dev-ant dev-ant added the ✨feature 새로운 기능 추가 label Feb 20, 2026
@github-actions
Copy link

github-actions bot commented Feb 20, 2026

✅ 테스트 결과 for PR

Build: success

🧪 테스트 실행 with Gradle
📈 Coverage: -0.00%

📁 테스트 결과
📁 커버리지 보고서 (HTML)

Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

Comment on lines +38 to +50
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;
Copy link

Copilot AI Feb 20, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

배치 로깅 저장(saveSuccess/saveFailure)이 실패하면 원래 배치 결과/예외를 덮어써서 장애 원인 추적이 어려워질 수 있습니다. 로깅 저장은 try/catch로 감싸서 실패 시에도 원래 결과(또는 원래 예외)를 그대로 유지하고, 로깅 실패는 별도로 로그만 남기도록 처리해 주세요.

Copilot uses AI. Check for mistakes.
Comment on lines +22 to +27
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;
Copy link

Copilot AI Feb 20, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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를 명확히 반환하도록 쿼리/리포지토리 계약을 분리하는 방식으로 정확도를 보장해 주세요.

Copilot uses AI. Check for mistakes.
Comment on lines +25 to +27
@Enumerated(EnumType.ORDINAL)
@Column(name = "trigger_type", nullable = false)
private TriggerType triggerType;
Copy link

Copilot AI Feb 20, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

TriggerType를 @Enumerated(EnumType.ORDINAL)로 저장하면 enum 선언 순서 변경/값 추가 시 기존 데이터가 다른 의미로 해석될 수 있어 로그 데이터가 쉽게 깨집니다. EnumType.STRING(컬럼을 VARCHAR로)로 저장하거나, 0/1을 고정 매핑하는 AttributeConverter를 두어 DB 값이 안정적으로 유지되게 해주세요.

Copilot uses AI. Check for mistakes.
Comment on lines +14 to +19
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;

Copy link

Copilot AI Feb 20, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

이 Aspect가 ItemInfoSyncResponse(interfaces 레이어 DTO)에 직접 의존해서 공통(AOP) 모듈이 특정 API DTO에 강결합됩니다. 배치 메서드들이 공통적으로 int(처리건수)만 반환하도록 계약을 통일하거나, 처리건수를 노출하는 공통 인터페이스/결과 타입을 만들어 레이어 의존성을 끊어주세요.

Copilot uses AI. Check for mistakes.
Comment on lines +36 to +50
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;
Copy link

Copilot AI Feb 20, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

예외 로깅이 catch (Exception e)로만 처리되어 ErrorThrowable 계열이 발생하면 배치 실행 실패 로그가 남지 않습니다. 배치 실행 이력을 반드시 남기는 목적이라면 Throwable을 잡아서 로그를 남긴 뒤 다시 던지는 방식으로 범위를 넓혀주세요.

Copilot uses AI. Check for mistakes.
-- 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
Copy link

Copilot AI Feb 20, 2026

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

주석 처리된 SQL이지만, 나중에 활성화할 때를 고려하면 테이블명이 잘못되어 있습니다 (auction__history_item_optionauction_history_item_option). 오타를 바로잡아 주세요.

Copilot uses AI. Check for mistakes.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

✨feature 새로운 기능 추가

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant