From 349a0c1ce58f99929bd4aee9a7d134487b990dcc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=84=B1=EC=98=81?= Date: Tue, 15 Jul 2025 15:19:13 +0900 Subject: [PATCH] =?UTF-8?q?=EB=B0=B0=EC=B9=98=20=EC=A0=84=EB=B0=98?= =?UTF-8?q?=EC=A0=81=EC=9C=BC=EB=A1=9C=20=EC=88=98=EC=A0=95,=20ZIP=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20=EC=95=95=EC=B6=95=ED=95=B4=EC=A0=9C=20?= =?UTF-8?q?=EB=B0=B0=EC=B9=98=20=EC=B6=94=EA=B0=80=20=ED=85=8C=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...l => seq_batch_zip_file_detail_log_id.sql} | 2 +- .../seq_batch_zip_file_process_log_id.sql | 6 +++++ ...g.sql => tb_batch_zip_file_detail_log.sql} | 14 +++++------ ....sql => tb_batch_zip_file_process_log.sql} | 8 +++---- README_ZIP_BATCH.md | 24 +++++++++---------- .../batch/job/ZipFileProcessBatchJob.java | 11 +++++++++ src/main/resources/application-dev.yml | 1 + src/main/resources/application-local.yml | 1 + src/main/resources/application-prd.yml | 1 + .../batch/ZipFileDetailLogMapper_maria.xml | 24 +++++++++---------- .../batch/ZipFileProcessLogMapper_maria.xml | 18 +++++++------- 11 files changed, 65 insertions(+), 45 deletions(-) rename DB-DDL/maria/ddl/xitframework/{seq_zip_file_process_log_id.sql => seq_batch_zip_file_detail_log_id.sql} (55%) create mode 100644 DB-DDL/maria/ddl/xitframework/seq_batch_zip_file_process_log_id.sql rename DB-DDL/maria/ddl/xitframework/{tb_zip_file_detail_log.sql => tb_batch_zip_file_detail_log.sql} (80%) rename DB-DDL/maria/ddl/xitframework/{tb_zip_file_process_log.sql => tb_batch_zip_file_process_log.sql} (90%) diff --git a/DB-DDL/maria/ddl/xitframework/seq_zip_file_process_log_id.sql b/DB-DDL/maria/ddl/xitframework/seq_batch_zip_file_detail_log_id.sql similarity index 55% rename from DB-DDL/maria/ddl/xitframework/seq_zip_file_process_log_id.sql rename to DB-DDL/maria/ddl/xitframework/seq_batch_zip_file_detail_log_id.sql index 3118184..ecf2c0a 100644 --- a/DB-DDL/maria/ddl/xitframework/seq_zip_file_process_log_id.sql +++ b/DB-DDL/maria/ddl/xitframework/seq_batch_zip_file_detail_log_id.sql @@ -1,4 +1,4 @@ -CREATE SEQUENCE seq_zip_file_process_log_id +CREATE SEQUENCE seq_batch_zip_file_detail_log_id START WITH 1 INCREMENT BY 1 MINVALUE 1 diff --git a/DB-DDL/maria/ddl/xitframework/seq_batch_zip_file_process_log_id.sql b/DB-DDL/maria/ddl/xitframework/seq_batch_zip_file_process_log_id.sql new file mode 100644 index 0000000..fd45ebb --- /dev/null +++ b/DB-DDL/maria/ddl/xitframework/seq_batch_zip_file_process_log_id.sql @@ -0,0 +1,6 @@ +CREATE SEQUENCE seq_batch_zip_file_process_log_id + START WITH 1 + INCREMENT BY 1 + MINVALUE 1 + MAXVALUE 99999999 + CYCLE; \ No newline at end of file diff --git a/DB-DDL/maria/ddl/xitframework/tb_zip_file_detail_log.sql b/DB-DDL/maria/ddl/xitframework/tb_batch_zip_file_detail_log.sql similarity index 80% rename from DB-DDL/maria/ddl/xitframework/tb_zip_file_detail_log.sql rename to DB-DDL/maria/ddl/xitframework/tb_batch_zip_file_detail_log.sql index 10ae905..3b27c6b 100644 --- a/DB-DDL/maria/ddl/xitframework/tb_zip_file_detail_log.sql +++ b/DB-DDL/maria/ddl/xitframework/tb_batch_zip_file_detail_log.sql @@ -1,4 +1,4 @@ -create table tb_zip_file_detail_log +create table tb_batch_zip_file_detail_log ( detail_log_id varchar(12) not null comment '상세로그ID' primary key, @@ -14,20 +14,20 @@ create table tb_zip_file_detail_log process_time datetime default current_timestamp() null comment '처리시간', reg_date datetime default current_timestamp() null comment '등록일시', reg_user_id varchar(20) default 'BATCH_SYSTEM' null comment '등록자ID', - constraint fk_zip_detail_log_id - foreign key (log_id) references tb_zip_file_process_log (log_id) + constraint fk_batch_zip_detail_log_id + foreign key (log_id) references tb_batch_zip_file_process_log (log_id) on delete cascade ) comment 'ZIP파일처리상세로그' collate = utf8mb4_unicode_ci; create index idx_log_id - on tb_zip_file_detail_log (log_id); + on tb_batch_zip_file_detail_log (log_id); create index idx_file_name - on tb_zip_file_detail_log (file_name); + on tb_batch_zip_file_detail_log (file_name); create index idx_process_status - on tb_zip_file_detail_log (process_status); + on tb_batch_zip_file_detail_log (process_status); create index idx_is_image - on tb_zip_file_detail_log (is_image); \ No newline at end of file + on tb_batch_zip_file_detail_log (is_image); \ No newline at end of file diff --git a/DB-DDL/maria/ddl/xitframework/tb_zip_file_process_log.sql b/DB-DDL/maria/ddl/xitframework/tb_batch_zip_file_process_log.sql similarity index 90% rename from DB-DDL/maria/ddl/xitframework/tb_zip_file_process_log.sql rename to DB-DDL/maria/ddl/xitframework/tb_batch_zip_file_process_log.sql index 7ede15d..00a2f24 100644 --- a/DB-DDL/maria/ddl/xitframework/tb_zip_file_process_log.sql +++ b/DB-DDL/maria/ddl/xitframework/tb_batch_zip_file_process_log.sql @@ -1,4 +1,4 @@ -create table tb_zip_file_process_log +create table tb_batch_zip_file_process_log ( log_id varchar(12) not null comment '로그ID' primary key, @@ -24,10 +24,10 @@ create table tb_zip_file_process_log comment 'ZIP파일처리로그' collate = utf8mb4_unicode_ci; create index idx_zip_file_name - on tb_zip_file_process_log (zip_file_name); + on tb_batch_zip_file_process_log (zip_file_name); create index idx_process_status - on tb_zip_file_process_log (process_status); + on tb_batch_zip_file_process_log (process_status); create index idx_start_time - on tb_zip_file_process_log (start_time); \ No newline at end of file + on tb_batch_zip_file_process_log (start_time); \ No newline at end of file diff --git a/README_ZIP_BATCH.md b/README_ZIP_BATCH.md index dbdcd2a..5b56ed2 100644 --- a/README_ZIP_BATCH.md +++ b/README_ZIP_BATCH.md @@ -6,10 +6,10 @@ ## 구현된 기능 ### 1. 데이터베이스 테이블 -- **tb_zip_file_process_log**: ZIP 파일 처리 메인 로그 테이블 -- **tb_zip_file_detail_log**: ZIP 파일 내 개별 파일 처리 상세 로그 테이블 -- **seq_zip_file_process_log_id**: 메인 로그 ID 시퀀스 -- **seq_zip_file_detail_log_id**: 상세 로그 ID 시퀀스 +- **tb_batch_zip_file_process_log**: ZIP 파일 처리 메인 로그 테이블 +- **tb_batch_zip_file_detail_log**: ZIP 파일 내 개별 파일 처리 상세 로그 테이블 +- **seq_batch_zip_file_process_log_id**: 메인 로그 ID 시퀀스 +- **seq_batch_zip_file_detail_log_id**: 상세 로그 ID 시퀀스 ### 2. 주요 클래스 @@ -79,12 +79,12 @@ ${user.home}/batch/zip/ ### 1. 데이터베이스 테이블 생성 ```sql -- 시퀀스 생성 -source DB-DDL/maria/ddl/xitframework/seq_zip_file_process_log_id.sql -source DB-DDL/maria/ddl/xitframework/seq_zip_file_detail_log_id.sql +source DB-DDL/maria/ddl/xitframework/seq_batch_zip_file_process_log_id.sql +source DB-DDL/maria/ddl/xitframework/seq_batch_zip_file_detail_log_id.sql -- 테이블 생성 -source DB-DDL/maria/ddl/xitframework/tb_zip_file_process_log.sql -source DB-DDL/maria/ddl/xitframework/tb_zip_file_detail_log.sql +source DB-DDL/maria/ddl/xitframework/tb_batch_zip_file_process_log.sql +source DB-DDL/maria/ddl/xitframework/tb_batch_zip_file_detail_log.sql ``` ### 2. 배치 작업 등록 @@ -99,13 +99,13 @@ Quartz 스케줄러를 통해 `ZipFileProcessBatchJob` 클래스를 등록하여 ### 메인 처리 로그 조회 ```sql -SELECT * FROM tb_zip_file_process_log +SELECT * FROM tb_batch_zip_file_process_log ORDER BY start_time DESC; ``` ### 상세 처리 로그 조회 ```sql -SELECT * FROM tb_zip_file_detail_log +SELECT * FROM tb_batch_zip_file_detail_log WHERE log_id = 'ZPFL00000001' ORDER BY process_time ASC; ``` @@ -118,7 +118,7 @@ SELECT is_corrupted, process_status, error_message -FROM tb_zip_file_detail_log +FROM tb_batch_zip_file_detail_log WHERE log_id = 'ZPFL00000001' AND is_image = 'Y'; ``` @@ -132,4 +132,4 @@ WHERE log_id = 'ZPFL00000001' 1. 디렉토리 권한 확인 필요 2. 대용량 ZIP 파일 처리 시 메모리 사용량 모니터링 필요 3. 동일한 파일명의 ZIP 파일 처리 시 타임스탬프 추가하여 중복 방지 -4. 배치 작업은 `@DisallowConcurrentExecution` 어노테이션으로 동시 실행 방지 \ No newline at end of file +4. 배치 작업은 `@DisallowConcurrentExecution` 어노테이션으로 동시 실행 방지 diff --git a/src/main/java/go/kr/project/batch/job/ZipFileProcessBatchJob.java b/src/main/java/go/kr/project/batch/job/ZipFileProcessBatchJob.java index 0194de7..446be0e 100644 --- a/src/main/java/go/kr/project/batch/job/ZipFileProcessBatchJob.java +++ b/src/main/java/go/kr/project/batch/job/ZipFileProcessBatchJob.java @@ -65,6 +65,9 @@ public class ZipFileProcessBatchJob implements Job { @Value("${batch.zip.create-date-subdir:false}") private boolean createDateSubdir; + @Value("${batch.zip.create-zip-name-subdir:false}") + private boolean createZipNameSubdir; + // =========================================================== // 의존성 주입 // =========================================================== @@ -355,6 +358,14 @@ public class ZipFileProcessBatchJob implements Job { extractPath = extractPath.resolve(dateStr); } + // ZIP 파일명으로 하위 디렉토리 생성 + if (createZipNameSubdir) { + String zipFileName = zipFile.getFileName().toString(); + // 확장자 제거 (.zip) + String zipNameWithoutExt = zipFileName.substring(0, zipFileName.lastIndexOf('.')); + extractPath = extractPath.resolve(zipNameWithoutExt); + } + // 추출 디렉토리 생성 if (!Files.exists(extractPath)) { Files.createDirectories(extractPath); diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index dbf811c..27aafc5 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -90,3 +90,4 @@ batch: extract-dir: /data/xit-framework/batch/zip/extract # ZIP 파일 압축 해제 디렉토리 archive-dir: /data/xit-framework/batch/zip/archive # ZIP 파일 아카이브 디렉토리 create-date-subdir: true # yyyymmdd 하위 디렉토리 생성 여부 + create-zip-name-subdir: true # ZIP 파일명으로 하위 디렉토리 생성 여부 diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml index 3121aec..a9663af 100644 --- a/src/main/resources/application-local.yml +++ b/src/main/resources/application-local.yml @@ -95,3 +95,4 @@ batch: extract-dir: d:/data/xit-framework/batch/zip/extract # ZIP 파일 압축 해제 디렉토리 archive-dir: d:/data/xit-framework/batch/zip/archive # ZIP 파일 아카이브 디렉토리 create-date-subdir: true # yyyymmdd 하위 디렉토리 생성 여부 + create-zip-name-subdir: true # ZIP 파일명으로 하위 디렉토리 생성 여부 diff --git a/src/main/resources/application-prd.yml b/src/main/resources/application-prd.yml index 577be04..28bc977 100644 --- a/src/main/resources/application-prd.yml +++ b/src/main/resources/application-prd.yml @@ -90,3 +90,4 @@ batch: extract-dir: /data/xit-framework/batch/zip/extract # ZIP 파일 압축 해제 디렉토리 archive-dir: /data/xit-framework/batch/zip/archive # ZIP 파일 아카이브 디렉토리 create-date-subdir: true # yyyymmdd 하위 디렉토리 생성 여부 + create-zip-name-subdir: true # ZIP 파일명으로 하위 디렉토리 생성 여부 diff --git a/src/main/resources/mybatis/mapper/batch/ZipFileDetailLogMapper_maria.xml b/src/main/resources/mybatis/mapper/batch/ZipFileDetailLogMapper_maria.xml index db68512..dc08372 100644 --- a/src/main/resources/mybatis/mapper/batch/ZipFileDetailLogMapper_maria.xml +++ b/src/main/resources/mybatis/mapper/batch/ZipFileDetailLogMapper_maria.xml @@ -5,15 +5,15 @@ - SELECT CONCAT('ZFDL', LPAD(NEXTVAL(seq_zip_file_detail_log_id), 8, '0')) + SELECT CONCAT('ZFDL', LPAD(NEXTVAL(seq_batch_zip_file_detail_log_id), 8, '0')) - INSERT INTO tb_zip_file_detail_log ( + INSERT INTO tb_batch_zip_file_detail_log ( detail_log_id, log_id, file_name, @@ -46,7 +46,7 @@ - INSERT INTO tb_zip_file_detail_log ( + INSERT INTO tb_batch_zip_file_detail_log ( detail_log_id, log_id, file_name, @@ -63,7 +63,7 @@ ) VALUES ( - CONCAT('ZFDL', LPAD(NEXTVAL(seq_zip_file_detail_log_id), 8, '0')), + CONCAT('ZFDL', LPAD(NEXTVAL(seq_batch_zip_file_detail_log_id), 8, '0')), #{item.logId}, #{item.fileName}, #{item.filePath}, @@ -82,13 +82,13 @@ - DELETE FROM tb_zip_file_detail_log + DELETE FROM tb_batch_zip_file_detail_log WHERE detail_log_id = #{detailLogId} - DELETE FROM tb_zip_file_detail_log + DELETE FROM tb_batch_zip_file_detail_log WHERE log_id = #{logId} @@ -108,7 +108,7 @@ process_time AS processTime, reg_date AS regDate, reg_user_id AS regUserId - FROM tb_zip_file_detail_log + FROM tb_batch_zip_file_detail_log WHERE detail_log_id = #{detailLogId} @@ -128,7 +128,7 @@ process_time AS processTime, reg_date AS regDate, reg_user_id AS regUserId - FROM tb_zip_file_detail_log + FROM tb_batch_zip_file_detail_log WHERE log_id = #{logId} ORDER BY process_time ASC @@ -136,7 +136,7 @@ - \ No newline at end of file + diff --git a/src/main/resources/mybatis/mapper/batch/ZipFileProcessLogMapper_maria.xml b/src/main/resources/mybatis/mapper/batch/ZipFileProcessLogMapper_maria.xml index 0e1b77d..e8437d5 100644 --- a/src/main/resources/mybatis/mapper/batch/ZipFileProcessLogMapper_maria.xml +++ b/src/main/resources/mybatis/mapper/batch/ZipFileProcessLogMapper_maria.xml @@ -5,12 +5,12 @@ - INSERT INTO tb_zip_file_process_log ( + INSERT INTO tb_batch_zip_file_process_log ( log_id, zip_file_name, zip_file_path, @@ -55,7 +55,7 @@ - UPDATE tb_zip_file_process_log + UPDATE tb_batch_zip_file_process_log SET extract_path = #{extractPath}, archive_path = #{archivePath}, @@ -75,7 +75,7 @@ - DELETE FROM tb_zip_file_process_log + DELETE FROM tb_batch_zip_file_process_log WHERE log_id = #{logId} @@ -101,14 +101,14 @@ reg_user_id AS regUserId, mod_date AS modDate, mod_user_id AS modUserId - FROM tb_zip_file_process_log + FROM tb_batch_zip_file_process_log WHERE log_id = #{logId} - \ No newline at end of file +