From 75531ab5e52c3d9ce5a976dd28391a002401c3de Mon Sep 17 00:00:00 2001 From: Kim JiMyeung Date: Mon, 22 Dec 2025 13:11:25 +0900 Subject: [PATCH] =?UTF-8?q?startDate,=20endDate=EB=A1=9C=EC=A7=81=EC=B2=98?= =?UTF-8?q?=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jobs/event/batch/dto/EventDetailDto.java | 6 +- .../jobs/event/batch/dto/EventPeriod.java | 12 ++++ .../event/batch/entity/EventDetailEntity.java | 7 ++- .../batch/processor/EventDataProcessor.java | 4 +- .../event/batch/reader/EventDataReader.java | 58 ++++++++++++++----- .../batch/repository/EventRepositoryImpl.java | 14 +++-- .../jobs/event/batch/repository/EventSql.java | 6 +- 7 files changed, 83 insertions(+), 24 deletions(-) create mode 100644 src/main/java/com/snp/batch/jobs/event/batch/dto/EventPeriod.java diff --git a/src/main/java/com/snp/batch/jobs/event/batch/dto/EventDetailDto.java b/src/main/java/com/snp/batch/jobs/event/batch/dto/EventDetailDto.java index 15f13ac..38a2fd6 100644 --- a/src/main/java/com/snp/batch/jobs/event/batch/dto/EventDetailDto.java +++ b/src/main/java/com/snp/batch/jobs/event/batch/dto/EventDetailDto.java @@ -6,6 +6,8 @@ import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; +import java.time.LocalDate; +import java.time.LocalDateTime; import java.util.List; @Data @@ -16,7 +18,7 @@ public class EventDetailDto { @JsonProperty("IncidentID") private Integer incidentID; @JsonProperty("EventID") - private Integer eventID; + private Long eventID; @JsonProperty("EventTypeID") private Integer eventTypeID; @JsonProperty("EventType") @@ -93,6 +95,8 @@ public class EventDetailDto { private String component2; @JsonProperty("FiredUpon") private String firedUpon; + private String eventStartDate; + private String eventEndDate; @JsonProperty("Cargoes") private List cargoes; diff --git a/src/main/java/com/snp/batch/jobs/event/batch/dto/EventPeriod.java b/src/main/java/com/snp/batch/jobs/event/batch/dto/EventPeriod.java new file mode 100644 index 0000000..05e4703 --- /dev/null +++ b/src/main/java/com/snp/batch/jobs/event/batch/dto/EventPeriod.java @@ -0,0 +1,12 @@ +package com.snp.batch.jobs.event.batch.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +@AllArgsConstructor +public class EventPeriod { + private String eventStartDate; + private String eventEndDate;} diff --git a/src/main/java/com/snp/batch/jobs/event/batch/entity/EventDetailEntity.java b/src/main/java/com/snp/batch/jobs/event/batch/entity/EventDetailEntity.java index b8f04ee..58b4bda 100644 --- a/src/main/java/com/snp/batch/jobs/event/batch/entity/EventDetailEntity.java +++ b/src/main/java/com/snp/batch/jobs/event/batch/entity/EventDetailEntity.java @@ -1,5 +1,6 @@ package com.snp.batch.jobs.event.batch.entity; +import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer; import com.snp.batch.common.batch.entity.BaseEntity; import lombok.AllArgsConstructor; import lombok.Data; @@ -7,6 +8,7 @@ import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; import lombok.experimental.SuperBuilder; +import java.time.LocalDateTime; import java.util.List; @Data @@ -16,7 +18,7 @@ import java.util.List; @EqualsAndHashCode(callSuper = true) public class EventDetailEntity extends BaseEntity { private Integer incidentID; - private Integer eventID; + private Long eventID; private Integer eventTypeID; private String eventType; private String significance; @@ -56,6 +58,9 @@ public class EventDetailEntity extends BaseEntity { private String component2; private String firedUpon; + private String eventStartDate; + private String eventEndDate; + private List cargoes; private List humanCasualties; private List relationships; diff --git a/src/main/java/com/snp/batch/jobs/event/batch/processor/EventDataProcessor.java b/src/main/java/com/snp/batch/jobs/event/batch/processor/EventDataProcessor.java index 9d48d89..74dd115 100644 --- a/src/main/java/com/snp/batch/jobs/event/batch/processor/EventDataProcessor.java +++ b/src/main/java/com/snp/batch/jobs/event/batch/processor/EventDataProcessor.java @@ -19,8 +19,8 @@ public class EventDataProcessor extends BaseProcessor { + + private Map eventPeriodMap; private final JdbcTemplate jdbcTemplate; private final BatchDateService batchDateService; // ✨ BatchDateService 필드 추가 @@ -39,10 +39,13 @@ public class EventDataReader extends BaseApiReader { return "/MaritimeWCF/MaritimeAndTradeEventsService.svc/RESTFul/GetEventListByEventChangeDateRange"; } - protected String getEventDetailApiPath(){ + protected String getEventDetailApiPath() { return "/MaritimeWCF/MaritimeAndTradeEventsService.svc/RESTFul/GetEventDataByEventID"; } - protected String getApiKey() {return "EVENT_IMPORT_JOB";} + + protected String getApiKey() { + return "EVENT_IMPORT_JOB"; + } // 배치 처리 상태 private List eventIds; @@ -54,9 +57,11 @@ public class EventDataReader extends BaseApiReader { protected void resetCustomState() { this.currentBatchIndex = 0; this.eventIds = null; + this.eventPeriodMap = new HashMap<>(); } + @Override - protected void beforeFetch(){ + protected void beforeFetch() { // 1. 기간내 기록된 Event List 조회 (API 요청) log.info("Event API 호출"); EventResponse response = callEventApiWithBatch(); @@ -65,8 +70,19 @@ public class EventDataReader extends BaseApiReader { eventIds = extractEventIdList(response); log.info("EvnetId List 추출 완료 : {} 개", eventIds.size()); + eventPeriodMap = response.getMaritimeEvents().stream() + .filter(e -> e.getEventId() != null) + .collect(Collectors.toMap( + EventDto::getEventId, + e -> new EventPeriod( + e.getStartDate(), + e.getEndDate() + ) + )); + updateApiCallStats(eventIds.size(), 0); } + @Override protected List fetchNextBatch() throws Exception { // 3. EventID List 로 Event Detail 조회 (API요청) : 청크단위 실행 @@ -95,12 +111,21 @@ public class EventDataReader extends BaseApiReader { currentBatchIndex = endIndex; List eventDetailList = new ArrayList<>(); - // TODO: getEventDetailDto에 Map> 데이터 세팅 - eventDetailList.add(response.getEventDetailDto()); // 응답 처리 if (response != null && response.getEventDetailDto() != null) { - + + // TODO: getEventDetailDto에 Map> 데이터 세팅 + EventDetailDto detailDto = response.getEventDetailDto(); + Long eventId = detailDto.getEventID(); + EventPeriod period = eventPeriodMap.get(eventId); + + if (period != null) { + detailDto.setEventStartDate(period.getEventStartDate()); + detailDto.setEventEndDate(period.getEventEndDate()); + } + + eventDetailList.add(response.getEventDetailDto()); log.info("[{}] 배치 {}/{} 완료: {} 건 조회", getReaderName(), currentBatchNumber, totalBatches, eventDetailList.size()); @@ -141,7 +166,7 @@ public class EventDataReader extends BaseApiReader { @Override protected void afterFetch(List data) { int totalBatches = (int) Math.ceil((double) eventIds.size() / batchSize); - try{ + try { if (data == null) { // 3. ✨ 배치 성공 시 상태 업데이트 (트랜잭션 커밋 직전에 실행) LocalDate successDate = LocalDate.now(); // 현재 배치 실행 시점의 날짜 (Reader의 toDay와 동일한 값) @@ -152,7 +177,7 @@ public class EventDataReader extends BaseApiReader { log.info("[{}] 총 {} 개의 Event ID에 대한 API 호출 종료", getReaderName(), eventIds.size()); } - }catch (Exception e){ + } catch (Exception e) { log.info("[{}] 전체 {} 개 배치 처리 실패", getReaderName(), totalBatches); log.info("[{}] 총 {} 개의 Event ID에 대한 API 호출 종료", getReaderName(), eventIds.size()); @@ -163,7 +188,7 @@ public class EventDataReader extends BaseApiReader { if (response.getMaritimeEvents() == null) { return Collections.emptyList(); } - return response.getMaritimeEvents() .stream() + return response.getMaritimeEvents().stream() // ShipDto 객체에서 imoNumber 필드 (String 타입)를 추출 .map(EventDto::getEventId) // IMO 번호가 null이 아닌 경우만 필터링 (선택 사항이지만 안전성을 위해) @@ -207,4 +232,11 @@ public class EventDataReader extends BaseApiReader { .block(); } + private LocalDateTime parseToLocalDate(String value) { + if (value == null || value.isBlank()) { + return null; + } + return LocalDateTime.parse(value); + } + } diff --git a/src/main/java/com/snp/batch/jobs/event/batch/repository/EventRepositoryImpl.java b/src/main/java/com/snp/batch/jobs/event/batch/repository/EventRepositoryImpl.java index d955bba..5cbe1e0 100644 --- a/src/main/java/com/snp/batch/jobs/event/batch/repository/EventRepositoryImpl.java +++ b/src/main/java/com/snp/batch/jobs/event/batch/repository/EventRepositoryImpl.java @@ -162,14 +162,16 @@ public class EventRepositoryImpl extends BaseJdbcRepository