### feat: 차량번호 및 최종등록일 별표 처리 로직 추가

- **차량번호 및 최종등록일 별표(`*`) 처리 로직 구현**
  - 차량번호와 최종등록일 앞에 별표가 포함된 경우, 별표를 별도의 필드(`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` 호출부 정리.
    - 중복 및 불필요한 변수 제거, 관련 주석 정리.
main
박성영 4 days ago
parent 545832040b
commit 06f6a03178

@ -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 '비고 상세';

@ -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");

@ -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 # 매매상품

Loading…
Cancel
Save