From 06f6a031787cff8cb890cd58121d41c4590737f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EB=B0=95=EC=84=B1=EC=98=81?= Date: Fri, 12 Dec 2025 12:24:23 +0900 Subject: [PATCH] =?UTF-8?q?###=20feat:=20=EC=B0=A8=EB=9F=89=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=EB=B0=8F=20=EC=B5=9C=EC=A2=85=EB=93=B1=EB=A1=9D?= =?UTF-8?q?=EC=9D=BC=20=EB=B3=84=ED=91=9C=20=EC=B2=98=EB=A6=AC=20=EB=A1=9C?= =?UTF-8?q?=EC=A7=81=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - **차량번호 및 최종등록일 별표(`*`) 처리 로직 구현** - 차량번호와 최종등록일 앞에 별표가 포함된 경우, 별표를 별도의 필드(`vhclno-asterisk`, `last-reg-ymd-asterisk`)로 분리하여 처리. - 별표 제거 후 본 데이터와 함께 파싱 및 조립 로직 반영: - `CarFfnlgTrgtServiceImpl`에 별표 분리 및 데이터 처리 코드 추가. - 별표가 포함된 경우 다시 앞부분에 별표를 붙이는 로직 구현. - **`application.yml` 필드 길이 설정 변경** - `vhclno-asterisk`, `last-reg-ymd-asterisk` 필드 추가 및 길이(1바이트) 정의. - 기존 필드들의 바이트 길이 수정: - `vhclno`: 13 → 12 (2바이트), 12 → 11 (3바이트) - `last-reg-ymd`: 12 → 11 (2바이트), 11 → 10 (3바이트) - 기타 관련 필드 길이 조정. - **DB 스키마 변경** - `tb_car_ffnlg_trgt` 테이블: - 날짜 필드(`RCPT_YMD`, `INSP_YMD`, `LAST_REG_YMD`, 등)의 길이 기존 8 → 10으로 확장. - `DAYCNT` 필드 길이 4 → 5, 유효기간 만료일자(`VLD_PRD_EXPRY_YMD`) 등 관련 필드 길이 변경. - **로깅 개선** - 별표 존재 여부 및 최종 데이터 확인용 DEBUG 로그 추가: - 차량번호 및 최종등록일 시 별표 처리 전후 내역 상세 기록. - **유지보수성 및 가독성 향상** - 반복적인 고정폭 필드 처리 로직 리팩토링: - `padRightBytes` 호출부 정리. - 중복 및 불필요한 변수 제거, 관련 주석 정리. --- DB/DDL/vips/tb_car_ffnlg_trgt.sql | 22 +++---- .../service/impl/CarFfnlgTrgtServiceImpl.java | 58 ++++++++++++++++--- src/main/resources/application.yml | 26 +++++---- 3 files changed, 74 insertions(+), 32 deletions(-) diff --git a/DB/DDL/vips/tb_car_ffnlg_trgt.sql b/DB/DDL/vips/tb_car_ffnlg_trgt.sql index eb4e0d9..52c9db4 100644 --- a/DB/DDL/vips/tb_car_ffnlg_trgt.sql +++ b/DB/DDL/vips/tb_car_ffnlg_trgt.sql @@ -2,26 +2,25 @@ create table tb_car_ffnlg_trgt ( CAR_FFNLG_TRGT_ID varchar(20) not null comment '자동차 과태료 대상 ID' primary key, - RCPT_YMD varchar(8) null comment '접수 일자', + RCPT_YMD varchar(10) null comment '접수 일자', INSPSTN_CD varchar(8) null comment '검사소 코드', - INSP_YMD varchar(8) null comment '검사 일자', + INSP_YMD varchar(10) null comment '검사 일자', VHCLNO varchar(30) null comment '차량번호', OWNR_NM varchar(75) null comment '소유자 명', RRNO varchar(100) null comment '주민등록번호', CAR_NM varchar(100) null comment '자동차 명', CAR_KND varchar(100) null comment '자동차 종류', CAR_USG varchar(100) null comment '자동차 용도', - INSP_END_YMD varchar(8) null comment '검사 종료 일자', + INSP_END_YMD varchar(10) null comment '검사 종료 일자', DAYCNT varchar(5) null comment '일수', FFNLG_AMT varchar(10) null comment '과태료 금액', - LAST_REG_YMD varchar(8) null comment '최종 등록 일자', + LAST_REG_YMD varchar(11) null comment '최종 등록 일자', ADDR varchar(600) null comment '주소', - VLD_PRD_EXPRY_YMD varchar(8) null comment '유효 기간 만료 일자', + VLD_PRD_EXPRY_YMD varchar(10) null comment '유효 기간 만료 일자', TRD_GDS varchar(100) null comment '매매 상품', TASK_PRCS_STTS_CD varchar(2) null comment '업무 처리 상태 코드', - TASK_PRCS_YMD varchar(8) null comment '업무 처리 일자', + TASK_PRCS_YMD varchar(10) null comment '업무 처리 일자', RMRK varchar(4000) null comment '비고', - RMRK_DTL TEXT null comment '비고 상세', CAR_BASS_MATTER_INQIRE_ID varchar(20) null comment '자동차 기본 사항 조회 ID', CAR_LEDGER_FRMBK_ID varchar(20) null comment '자동차 등록 원부 갑 ID', CAR_BSC_MTTR_INQ_FLNM varchar(75) null comment '자동차 기본 사항 조회 성명', @@ -29,17 +28,14 @@ create table tb_car_ffnlg_trgt CAR_BSC_MTTR_INQ_SGG_NM varchar(75) null comment '자동차 기본 사항 조회 시군구 명', CAR_REG_FRMBK_CHG_TASK_SE_CD varchar(2) null comment '자동차 등록 원부갑 변경 업무 구분 코드', CAR_REG_FRMBK_CHG_TASK_SE_NM varchar(75) null comment '자동차 등록 원부갑 변경 업무 구분 명', - CAR_REG_FRMBK_CHG_YMD varchar(8) null comment '자동차 등록 원부갑 변경 일자', + CAR_REG_FRMBK_CHG_YMD varchar(10) null comment '자동차 등록 원부갑 변경 일자', CAR_REG_FRMBK_DTL varchar(2000) null comment '자동차 등록 원부갑 상세', REG_DT datetime null comment '등록 일시', RGTR varchar(11) null comment '등록자', DEL_YN char not null comment '삭제 여부', DEL_DT datetime null comment '삭제 일시', - DLTR varchar(11) null comment '삭제자' + DLTR varchar(11) null comment '삭제자', + RMRK_DTL text null comment '비고 상세' ) comment '자동차 과태료 대상'; - - -ALTER TABLE tb_car_ffnlg_trgt -MODIFY COLUMN RMRK_DTL TEXT NULL COMMENT '비고 상세'; diff --git a/src/main/java/go/kr/project/carInspectionPenalty/registration/service/impl/CarFfnlgTrgtServiceImpl.java b/src/main/java/go/kr/project/carInspectionPenalty/registration/service/impl/CarFfnlgTrgtServiceImpl.java index 33a80f1..0f28eee 100644 --- a/src/main/java/go/kr/project/carInspectionPenalty/registration/service/impl/CarFfnlgTrgtServiceImpl.java +++ b/src/main/java/go/kr/project/carInspectionPenalty/registration/service/impl/CarFfnlgTrgtServiceImpl.java @@ -280,11 +280,28 @@ public class CarFfnlgTrgtServiceImpl extends EgovAbstractServiceImpl implements // 3) 데이터 라인 생성 (각 항목 2줄) for (CarFfnlgTrgtVO row : list) { + // 차량번호 별표 처리 + String vhclno = nvl(row.getVhclno()); + String vhclnoAsterisk = " "; + if (vhclno.startsWith("*")) { + vhclnoAsterisk = "*"; + vhclno = vhclno.substring(1); // 별표 제거 + } + + // 최종등록일 별표 처리 + String lastRegYmd = nvl(row.getLastRegYmd()); + String lastRegYmdAsterisk = " "; + if (lastRegYmd.startsWith("*")) { + lastRegYmdAsterisk = "*"; + lastRegYmd = lastRegYmd.substring(1); // 별표 제거 + } + // 첫째줄: 고정폭 필드들 연결 String firstLine = padRightBytes(nvl(row.getInspstnCd()), parseConfig.getFirstLineLength("inspstn-cd"), encoding) + padRightBytes(row.getInspYmd(), parseConfig.getFirstLineLength("insp-ymd"), encoding) + - padRightBytes(nvl(row.getVhclno()), parseConfig.getFirstLineLength("vhclno"), encoding) + + padRightBytes(vhclnoAsterisk, parseConfig.getFirstLineLength("vhclno-asterisk"), encoding) + + padRightBytes(vhclno, parseConfig.getFirstLineLength("vhclno"), encoding) + padRightBytes(nvl(row.getOwnrNm()), parseConfig.getFirstLineLength("ownr-nm"), encoding) + padRightBytes(nvl(row.getRrno()), parseConfig.getFirstLineLength("rrno"), encoding) + padRightBytes(nvl(row.getCarNm()), parseConfig.getFirstLineLength("car-nm"), encoding) + @@ -299,7 +316,8 @@ public class CarFfnlgTrgtServiceImpl extends EgovAbstractServiceImpl implements // 둘째줄: skip + 나머지 필드 String secondLine = padRightBytes("", parseConfig.getSecondLineLength("skip"), encoding) + - padRightBytes(row.getLastRegYmd(), parseConfig.getSecondLineLength("last-reg-ymd"), encoding) + + padRightBytes(lastRegYmdAsterisk, parseConfig.getSecondLineLength("last-reg-ymd-asterisk"), encoding) + + padRightBytes(lastRegYmd, parseConfig.getSecondLineLength("last-reg-ymd"), encoding) + padRightBytes(nvl(row.getAddr()), parseConfig.getSecondLineLength("addr"), encoding) + padRightBytes(row.getVldPrdExpryYmd(), parseConfig.getSecondLineLength("vld-prd-expry-ymd"), encoding) + padRightBytes(nvl(row.getTrdGds()), parseConfig.getSecondLineLength("trd-gds"), encoding); @@ -467,12 +485,24 @@ public class CarFfnlgTrgtServiceImpl extends EgovAbstractServiceImpl implements String inspYmd = extractByteLength(firstBytes, pos, len, encoding).trim(); log.info("[DEBUG_LOG] 검사일자(inspYmd) [{}바이트, 위치 {}-{}] = [{}]", len, pos, pos + len, inspYmd); pos += len; - - // 차량번호 (13바이트) + + // 차량번호 별표 공간 (1바이트) + len = parseConfig.getFirstLineLength("vhclno-asterisk"); + String vhclnoAsterisk = extractByteLength(firstBytes, pos, len, encoding); + log.info("[DEBUG_LOG] 차량번호 별표(vhclnoAsterisk) [{}바이트, 위치 {}-{}] = [{}]", len, pos, pos + len, vhclnoAsterisk); + pos += len; + + // 차량번호 (12바이트) len = parseConfig.getFirstLineLength("vhclno"); String vhclno = extractByteLength(firstBytes, pos, len, encoding).trim(); log.info("[DEBUG_LOG] 차량번호(vhclno) [{}바이트, 위치 {}-{}] = [{}]", len, pos, pos + len, vhclno); pos += len; + + // 별표가 있으면 차량번호 앞에 붙임 + if ("*".equals(vhclnoAsterisk.trim())) { + vhclno = "*" + vhclno; + log.info("[DEBUG_LOG] 차량번호에 별표 추가: [{}]", vhclno); + } // 소유자명 (31바이트) len = parseConfig.getFirstLineLength("ownr-nm"); @@ -509,8 +539,8 @@ public class CarFfnlgTrgtServiceImpl extends EgovAbstractServiceImpl implements String inspEndYmd = extractByteLength(firstBytes, pos, len, encoding).trim(); log.info("[DEBUG_LOG] 종료일(inspEndYmd) [{}바이트, 위치 {}-{}] = [{}]", len, pos, pos + len, inspEndYmd); pos += len; - - // 일수 (8바이트) + + // 일수 (별표 포함) len = parseConfig.getFirstLineLength("daycnt"); String daycnt = extractByteLength(firstBytes, pos, len, encoding).trim(); log.info("[DEBUG_LOG] 일수(daycnt) [{}바이트, 위치 {}-{}] = [{}]", len, pos, pos + len, daycnt); @@ -531,12 +561,24 @@ public class CarFfnlgTrgtServiceImpl extends EgovAbstractServiceImpl implements len = parseConfig.getSecondLineLength("skip"); log.info("[DEBUG_LOG] 공백 스킵 [{}바이트]", len); pos += len; - - // 최종등록일 (12바이트) + + // 최종등록일 별표 공간 (1바이트) + len = parseConfig.getSecondLineLength("last-reg-ymd-asterisk"); + String lastRegYmdAsterisk = extractByteLength(secondBytes, pos, len, encoding); + log.info("[DEBUG_LOG] 최종등록일 별표(lastRegYmdAsterisk) [{}바이트, 위치 {}-{}] = [{}]", len, pos, pos + len, lastRegYmdAsterisk); + pos += len; + + // 최종등록일 (11바이트) len = parseConfig.getSecondLineLength("last-reg-ymd"); String lastRegYmd = extractByteLength(secondBytes, pos, len, encoding).trim(); log.info("[DEBUG_LOG] 최종등록일(lastRegYmd) [{}바이트, 위치 {}-{}] = [{}]", len, pos, pos + len, lastRegYmd); pos += len; + + // 별표가 있으면 최종등록일 앞에 붙임 + if ("*".equals(lastRegYmdAsterisk.trim())) { + lastRegYmd = "*" + lastRegYmd; + log.info("[DEBUG_LOG] 최종등록일에 별표 추가: [{}]", lastRegYmd); + } // 주소 (88바이트) len = parseConfig.getSecondLineLength("addr"); diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 79ce280..10a666d 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -108,40 +108,44 @@ car-ffnlg-txt-parse: byte-size-2: first-line: # 첫째줄 필드별 바이트 길이 (2바이트 기준) inspstn-cd: 8 # 검사소 코드 - insp-ymd: 12 # 검사일자 + insp-ymd: 11 # 검사일자 + vhclno-asterisk: 1 # 차량번호 앞 별표 공간 vhclno: 13 # 차량번호 ownr-nm: 31 # 소유자명 rrno: 15 # 주민등록번호 car-nm: 16 # 자동차명 car-knd: 14 # 자동차종류 car-usg: 11 # 자동차용도 - insp-end-ymd: 12 # 검사종료일자 - daycnt: 4 # 일수 + insp-end-ymd: 11 # 검사종료일자 + daycnt: 5 # 일수 (별표 포함) ffnlg-amt: 10 # 과태료금액 second-line: # 둘째줄 필드별 바이트 길이 (2바이트 기준) - skip: 8 # 공백 (스킵) + skip: 7 # 공백 (스킵) + last-reg-ymd-asterisk: 1 # 최종등록일 앞 별표 공간 last-reg-ymd: 12 # 최종등록일자 addr: 86 # 주소 - vld-prd-expry-ymd: 12 # 유효기간만료일자 - trd-gds: 11 # 매매상품 + vld-prd-expry-ymd: 13 # 유효기간만료일자 + trd-gds: 10 # 매매상품 # ===== 3바이트 환경 설정 (UTF-8) ===== byte-size-3: - first-line: # 첫째줄 필드별 바이트 길이 (2바이트 기준) + first-line: # 첫째줄 필드별 바이트 길이 (3바이트 기준) inspstn-cd: 8 # 검사소 코드 insp-ymd: 12 # 검사일자 - vhclno: 13 # 차량번호 + vhclno-asterisk: 1 # 차량번호 앞 별표 공간 + vhclno: 12 # 차량번호 ownr-nm: 31 # 소유자명 rrno: 15 # 주민등록번호 car-nm: 16 # 자동차명 car-knd: 14 # 자동차종류 car-usg: 11 # 자동차용도 insp-end-ymd: 12 # 검사종료일자 - daycnt: 4 # 일수 + daycnt: 4 # 일수 (별표 포함) ffnlg-amt: 10 # 과태료금액 - second-line: # 둘째줄 필드별 바이트 길이 (2바이트 기준) + second-line: # 둘째줄 필드별 바이트 길이 (3바이트 기준) skip: 8 # 공백 (스킵) - last-reg-ymd: 12 # 최종등록일자 + last-reg-ymd-asterisk: 1 # 최종등록일 앞 별표 공간 + last-reg-ymd: 11 # 최종등록일자 addr: 86 # 주소 vld-prd-expry-ymd: 12 # 유효기간만료일자 trd-gds: 11 # 매매상품