From 88a8e9c8a937f4f7cdd8bbec8546da648790fbd0 Mon Sep 17 00:00:00 2001 From: HYOJIN Date: Wed, 25 Mar 2026 10:58:19 +0900 Subject: [PATCH] =?UTF-8?q?refactor:=20=EB=8F=99=EA=B8=B0=ED=99=94=20?= =?UTF-8?q?=ED=98=84=ED=99=A9=20=ED=99=94=EB=A9=B4=20=EB=85=B8=EC=B6=9C=20?= =?UTF-8?q?=ED=85=8C=EC=9D=B4=EB=B8=94=20=EB=AA=A9=EB=A1=9D=20=EC=A0=95?= =?UTF-8?q?=EB=A6=AC=20(#11)=20(#13)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/RELEASE-NOTES.md | 1 + .../snp/batch/common/util/TableMetaInfo.java | 12 ++--- .../batch/ship/repository/ShipDataSql.java | 53 ------------------- .../batch/ship/repository/ShipRepository.java | 1 - .../ship/repository/ShipRepositoryImpl.java | 47 ---------------- .../batch/ship/writer/ShipDataWriter.java | 1 - .../snp/batch/service/SyncStatusService.java | 4 +- src/main/resources/application.yml | 8 ++- 8 files changed, 10 insertions(+), 117 deletions(-) diff --git a/docs/RELEASE-NOTES.md b/docs/RELEASE-NOTES.md index 4697cdf..76d7341 100644 --- a/docs/RELEASE-NOTES.md +++ b/docs/RELEASE-NOTES.md @@ -11,6 +11,7 @@ - abandon/stale 실행 관리 엔드포인트 구현 (#7) ### 변경 +- 동기화 현황 노출 테이블 목록 정리: ship-001/ship-002 제거, source-target 키 매핑 정리 (#11) - BaseSyncReader 추출: 49개 Reader 공통 로직 통합, 1 chunk = 1 job_execution_id 보장 - chunk 경계 제어를 GroupByExecutionIdPolicy에서 Reader 자체 제어로 변경 - BatchWriteListener: SQL을 실행 시점에 생성하여 SOURCE_SCHEMA null 문제 해결 diff --git a/src/main/java/com/snp/batch/common/util/TableMetaInfo.java b/src/main/java/com/snp/batch/common/util/TableMetaInfo.java index bdf6863..1bc9bfc 100644 --- a/src/main/java/com/snp/batch/common/util/TableMetaInfo.java +++ b/src/main/java/com/snp/batch/common/util/TableMetaInfo.java @@ -13,9 +13,6 @@ public class TableMetaInfo { */ // Ship Tables - @Value("${app.batch.source-schema.tables.ship-001}") - public String sourceShipData; - @Value("${app.batch.source-schema.tables.ship-002}") public String sourceShipDetailData; @@ -158,10 +155,10 @@ public class TableMetaInfo { @Value("${app.batch.source-schema.tables.risk-compliance-001}") public String sourceRisk; - @Value("${app.batch.source-schema.tables.risk-compliance-002}") + @Value("${app.batch.source-schema.tables.risk-compliance-003}") public String sourceCompliance; - @Value("${app.batch.source-schema.tables.risk-compliance-003}") + @Value("${app.batch.source-schema.tables.risk-compliance-006}") public String sourceTbCompanyComplianceInfo; @@ -172,11 +169,8 @@ public class TableMetaInfo { */ // Ship Tables - @Value("${app.batch.target-schema.tables.ship-001}") - public String targetTbShipInfoMst; - @Value("${app.batch.target-schema.tables.ship-002}") - public String targetTbShipMainInfo; + public String targetTbShipInfoMst; @Value("${app.batch.target-schema.tables.ship-003}") public String targetTbShipAddInfo; diff --git a/src/main/java/com/snp/batch/jobs/datasync/batch/ship/repository/ShipDataSql.java b/src/main/java/com/snp/batch/jobs/datasync/batch/ship/repository/ShipDataSql.java index e5c0d06..354698f 100644 --- a/src/main/java/com/snp/batch/jobs/datasync/batch/ship/repository/ShipDataSql.java +++ b/src/main/java/com/snp/batch/jobs/datasync/batch/ship/repository/ShipDataSql.java @@ -142,59 +142,6 @@ public class ShipDataSql { """.formatted(TARGET_SCHEMA, targetTable); } - public static String getShipMainInfoUpsertSql(String targetTable) { - return """ - INSERT INTO %s.%s ( - crt_dt, creatr_id, - imo_no, mmsi_no, ship_nm, clsgn_no, country_nm, - ship_reg_hrbr, clfic_asctn_nm, ship_knd_lv_five, ship_knd_dtl_lv_five, - ship_build_yy, shpyrd_nm, ship_whlnth, ship_molbth, ship_depth, ship_draft, - ship_total_ton, dwt, cntnr_units, svc_crspd, main_engine_fom, - ship_status, ship_operator, ship_country_cd, ship_knd_lv_two, cargo_type, - last_mdfcn_dt - ) - VALUES ( - CURRENT_TIMESTAMP, 'SYSTEM', - ?, ?, ?, ?, ?, - ?, ?, ?, ?, ?, - ?, ?, ?, ?, ?, - ?, ?, ?, ?, ?, - ?, ?, ?, ?, ?, - ? - ) - ON CONFLICT (imo_no) - DO UPDATE SET - mdfcn_dt = CURRENT_TIMESTAMP, - mdfr_id = 'SYSTEM', - mmsi_no = EXCLUDED.mmsi_no, - ship_nm = EXCLUDED.ship_nm, - clsgn_no = EXCLUDED.clsgn_no, - country_nm = EXCLUDED.country_nm, - ship_reg_hrbr = EXCLUDED.ship_reg_hrbr, - clfic_asctn_nm = EXCLUDED.clfic_asctn_nm, - ship_knd_lv_five = EXCLUDED.ship_knd_lv_five, - ship_knd_dtl_lv_five = EXCLUDED.ship_knd_dtl_lv_five, - ship_build_yy = EXCLUDED.ship_build_yy, - shpyrd_nm = EXCLUDED.shpyrd_nm, - ship_whlnth = EXCLUDED.ship_whlnth, - ship_molbth = EXCLUDED.ship_molbth, - ship_depth = EXCLUDED.ship_depth, - ship_draft = EXCLUDED.ship_draft, - ship_total_ton = EXCLUDED.ship_total_ton, - dwt = EXCLUDED.dwt, - cntnr_units = EXCLUDED.cntnr_units, - svc_crspd = EXCLUDED.svc_crspd, - main_engine_fom = EXCLUDED.main_engine_fom, - ship_status = EXCLUDED.ship_status, - ship_operator = EXCLUDED.ship_operator, - ship_country_cd = EXCLUDED.ship_country_cd, - ship_knd_lv_two = EXCLUDED.ship_knd_lv_two, - cargo_type = EXCLUDED.cargo_type, - last_mdfcn_dt = EXCLUDED.last_mdfcn_dt; - """.formatted(TARGET_SCHEMA, targetTable); - } - - public static String getShipAddInfoUpsertSql(String targetTable) { return """ INSERT INTO %s.%s ( diff --git a/src/main/java/com/snp/batch/jobs/datasync/batch/ship/repository/ShipRepository.java b/src/main/java/com/snp/batch/jobs/datasync/batch/ship/repository/ShipRepository.java index bfe8ea9..ee8bc23 100644 --- a/src/main/java/com/snp/batch/jobs/datasync/batch/ship/repository/ShipRepository.java +++ b/src/main/java/com/snp/batch/jobs/datasync/batch/ship/repository/ShipRepository.java @@ -35,7 +35,6 @@ import java.util.List; */ public interface ShipRepository { void saveShipInfoMst(List shipInfoMstEntityList); - void saveShipMainInfo(List shipInfoMstEntityList); void saveShipAddInfo(List shipAddInfoEntityList); void saveBareboatCharterHistory(List bareboatCharterHistoryEntityList); void saveCallsignAndMmsiHistory(List callsignAndMmsiHistoryEntityList); diff --git a/src/main/java/com/snp/batch/jobs/datasync/batch/ship/repository/ShipRepositoryImpl.java b/src/main/java/com/snp/batch/jobs/datasync/batch/ship/repository/ShipRepositoryImpl.java index ce4ec40..c0f075b 100644 --- a/src/main/java/com/snp/batch/jobs/datasync/batch/ship/repository/ShipRepositoryImpl.java +++ b/src/main/java/com/snp/batch/jobs/datasync/batch/ship/repository/ShipRepositoryImpl.java @@ -96,23 +96,6 @@ public class ShipRepositoryImpl extends MultiDataSourceJdbcRepository shipInfoMstEntityList) { - String core20Sql = ShipDataSql.getShipMainInfoUpsertSql(tableMetaInfo.targetTbShipMainInfo); - if (shipInfoMstEntityList == null || shipInfoMstEntityList.isEmpty()) { - return; - } - batchJdbcTemplate.batchUpdate(core20Sql, shipInfoMstEntityList, shipInfoMstEntityList.size(), - (ps, entity) -> { - try { - bindShipMainInfo(ps, (ShipInfoMstEntity) entity); - } catch (Exception e) { - log.error("배치 삽입 파라미터 설정 실패", e); - throw new RuntimeException(e); - } - }); - } - public void bindShipInfoMst(PreparedStatement pstmt, ShipInfoMstEntity entity) throws Exception { int idx = 1; pstmt.setString(idx++, entity.getDatasetVer()); @@ -201,36 +184,6 @@ public class ShipRepositoryImpl extends MultiDataSourceJdbcRepository shipAddInfoEntityList) { String sql = ShipDataSql.getShipAddInfoUpsertSql(tableMetaInfo.targetTbShipAddInfo); diff --git a/src/main/java/com/snp/batch/jobs/datasync/batch/ship/writer/ShipDataWriter.java b/src/main/java/com/snp/batch/jobs/datasync/batch/ship/writer/ShipDataWriter.java index bfa118c..872ae56 100644 --- a/src/main/java/com/snp/batch/jobs/datasync/batch/ship/writer/ShipDataWriter.java +++ b/src/main/java/com/snp/batch/jobs/datasync/batch/ship/writer/ShipDataWriter.java @@ -22,6 +22,5 @@ public class ShipDataWriter extends BaseChunkedWriter { return; } shipRepository.saveShipInfoMst(items); // 선박_정보_마스터 [ID: S&P-SHIP-001] - shipRepository.saveShipMainInfo(items); // 선박_주요_정보 [ID: S&P-SHIP-002] } } diff --git a/src/main/java/com/snp/batch/service/SyncStatusService.java b/src/main/java/com/snp/batch/service/SyncStatusService.java index bc7010d..10f4286 100644 --- a/src/main/java/com/snp/batch/service/SyncStatusService.java +++ b/src/main/java/com/snp/batch/service/SyncStatusService.java @@ -70,11 +70,13 @@ public class SyncStatusService { ExecutorService executor = Executors.newFixedThreadPool( Math.min(sourceTables.size(), 10)); + // source와 target 양쪽 모두 매핑된 테이블만 조회 List> futures = sourceTables.entrySet().stream() + .filter(entry -> targetTables.containsKey(entry.getKey())) .map(entry -> CompletableFuture.supplyAsync(() -> { String tableKey = entry.getKey(); String sourceTable = entry.getValue(); - String targetTable = targetTables.getOrDefault(tableKey, ""); + String targetTable = targetTables.get(tableKey); try { return queryTableStatus(tableKey, sourceTable, targetTable); diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 11faca0..734cc4c 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -107,7 +107,6 @@ app: source-schema: name: std_snp_data tables: - ship-001: tb_ship_default_info ship-002: tb_ship_info_mst ship-003: tb_ship_add_info ship-004: tb_ship_bbctr_hstry @@ -153,13 +152,12 @@ app: code-001: tb_ship_type_cd code-002: tb_ship_country_cd risk-compliance-001: tb_ship_risk_info - risk-compliance-002: tb_ship_compliance_info - risk-compliance-003: tb_company_compliance_info + risk-compliance-003: tb_ship_compliance_info + risk-compliance-006: tb_company_compliance_info target-schema: name: std_snp_svc tables: - ship-001: tb_ship_info_mst - ship-002: tb_ship_main_info + ship-002: tb_ship_info_mst ship-003: tb_ship_add_info ship-004: tb_ship_bbctr_hstry ship-005: tb_ship_idntf_info_hstry