### feat: 차량번호 및 소유자명 처리 로직 개선, 특수문자 제거 처리 추가

- **소유자명 검증 보완**
  - 소유자명은 null 또는 공백 입력도 가능하도록 로직 수정
  - 길이 초과(75자) 제한만 유효하게 유지

- **특수문자 '*' 제거 처리 추가**
  - 차량번호 및 일수(`daycnt`)에서 전출차량 및 재검여부를 나타내는 '*' 제거 후 검증
  - `createLedgerRequest`, `createBasicRequest` 등 차량번호를 사용하는 API 호출 로직에 적용
  - 숫자값 검증 및 비교 수행 시 특수문자 제거 처리 추가

- **차량번호 형식 검증 로직 보완**
  - '*' 특수문자 포함 여부를 허용하도록 정규식 및 검증 프로세스 수정
  - '*'만 포함된 경우는 유효하지 않도록 처리

- **Comparison 로직 수정**
  - 비교 로직 시작 시 차량번호 및 일수에서 '*' 제거 기능 추가

- **샘플 데이터 수정**
  - 샘플 데이터 파일 수정 (`docs/지연-샘플용-utf-8-1.txt`)
  - 차량번호 및 일수에서 전출차량 및 재검여부를 나타내는 '*' 적용 예시 추가

- **기타**
  - 가독성을 위한 주석 정리 및 로직 구조 개선
main
박성영 5 days ago
parent ad168358cb
commit 914f61256b

@ -8,7 +8,7 @@
검사소 검사일자 자동차번호 소유자명 주민등록번호 차 명 차 종 용 도 종료일 일수 과태료
최종등록일 주 소 유효기간만료일 매매상품용
-------------------------------------------------------------------------------------------------------------------------------------------------
H494 2025-09-01 162고6489 (주)지앤티테크 1244110241315 엠뱅크언더리프 특수차구난형소영업용 2025-08-25 7 4만원
H494 2025-09-01 *162고6489 1244110241315 엠뱅크언더리프 특수차구난형소영업용 2025-08-25 *7 4만원
2025-07-14 경기도 용인시 기흥구 강남로 9, 111-111호(신행동, 진주만프라자) 2020-12-05
H494 2025-09-01 271구5475 (주)케이비캐피탈 1301110013499 엠뱅크언더리프 특수차구난형소영업용 2024-09-24 303 60만원

@ -709,12 +709,9 @@ public class CarFfnlgTrgtServiceImpl extends EgovAbstractServiceImpl implements
dataLineNumber, vo.getVhclno()));
}
// 4. 소유자명 검증
if (vo.getOwnrNm() == null || vo.getOwnrNm().isEmpty()) {
errors.add(String.format("[데이터 %d] 소유자명이 누락되었습니다. 차량번호: %s",
dataLineNumber, vhclno));
} else if (vo.getOwnrNm().length() > 75) {
errors.add(String.format("[데이터 %d] 소유자명이 너무 깁니다. 소유자명: %s (최대 75자), 차량번호: %s",
// 4. 소유자명 검증 (소유자명에 null or 공백 들어올수 있음 - 필수 아님)
if (vo.getOwnrNm() != null && !vo.getOwnrNm().isEmpty() && vo.getOwnrNm().length() > 75) {
errors.add(String.format("[데이터 %d] 소유자명이 너무 깁니다. 소유자명: %s (최대 75자), 차량번호: %s",
dataLineNumber, vo.getOwnrNm(), vhclno));
}
@ -780,9 +777,15 @@ public class CarFfnlgTrgtServiceImpl extends EgovAbstractServiceImpl implements
}
// 9. 일수 검증 (값이 있는 경우에만)
if (vo.getDaycnt() != null && !vo.getDaycnt().isEmpty() && !isNumeric(vo.getDaycnt())) {
errors.add(String.format("[데이터 %d] 일수는 숫자여야 합니다. 일수: %s, 차량번호: %s",
dataLineNumber, vo.getDaycnt(), vhclno));
// 일수에 '*' 특수문자가 포함될 수 있음 (재검여부 표시용)
if (vo.getDaycnt() != null && !vo.getDaycnt().isEmpty()) {
String daycnt = vo.getDaycnt().trim();
// '*' 제거 후 숫자 검증
String daycntWithoutAsterisk = daycnt.replace("*", "").trim();
if (!daycntWithoutAsterisk.isEmpty() && !isNumeric(daycntWithoutAsterisk)) {
errors.add(String.format("[데이터 %d] 일수는 숫자 또는 '*숫자' 형식이어야 합니다. 일수: %s, 차량번호: %s",
dataLineNumber, vo.getDaycnt(), vhclno));
}
}
return errors;
@ -827,11 +830,12 @@ public class CarFfnlgTrgtServiceImpl extends EgovAbstractServiceImpl implements
/**
*
*
*
* :
* - : 123456, 1234567 (2~3 + + 4 )
* - : 112222 ( + + + )
*
* - '*' ( )
*
* @param vhclno
* @return
*/
@ -839,36 +843,44 @@ public class CarFfnlgTrgtServiceImpl extends EgovAbstractServiceImpl implements
if (vhclno == null || vhclno.isEmpty()) {
return false;
}
// 공백 제거
vhclno = vhclno.trim();
// 최소 길이 체크 (예: 12가3456 = 7자)
if (vhclno.length() < 7) {
// '*' 특수문자를 임시로 제거하여 검증 (전출차량 등 특정 상황 표시용)
String vhclnoWithoutAsterisk = vhclno.replace("*", "");
// '*'만 있는 경우는 제외
if (vhclnoWithoutAsterisk.isEmpty()) {
return false;
}
// 최소 길이 체크 (예: 12가3456 = 7자, *12가3456 = 8자)
if (vhclnoWithoutAsterisk.length() < 7) {
return false;
}
// 패턴1: 일반 차량번호 (2~3자리 숫자 + 한글 1자 + 4자리 숫자)
// 예: 12가3456, 123가4567
if (vhclno.matches("\\d{2,3}[가-힣]\\d{4}")) {
// 예: 12가3456, 123가4567, *12가3456
if (vhclnoWithoutAsterisk.matches("\\d{2,3}[가-힣]\\d{4}")) {
return true;
}
// 패턴2: 지역명이 포함된 차량번호 (한글 + 숫자 + 한글 + 숫자)
// 예: 경기11사2222, 서울12가3456
if (vhclno.matches("[가-힣]+\\d+[가-힣]\\d+")) {
// 예: 경기11사2222, 서울12가3456, *경기11사2222
if (vhclnoWithoutAsterisk.matches("[가-힣]+\\d+[가-힣]\\d+")) {
return true;
}
// 패턴3: 특수 차량번호 (숫자 + 한글 + 숫자)
// 예: 22고2222, 33마3333
if (vhclno.matches("\\d+[가-힣]+\\d+")) {
// 예: 22고2222, 33마3333, *22고2222
if (vhclnoWithoutAsterisk.matches("\\d+[가-힣]+\\d+")) {
return true;
}
// 그 외의 경우는 일단 허용 (실제 차량번호 형식이 다양할 수 있음)
// 최소한 한글과 숫자가 모두 포함되어 있는지 확인
return vhclno.matches(".*[가-힣].*") && vhclno.matches(".*\\d.*");
return vhclnoWithoutAsterisk.matches(".*[가-힣].*") && vhclnoWithoutAsterisk.matches(".*\\d.*");
}
/**

@ -33,6 +33,19 @@ public class ComparisonServiceImpl extends EgovAbstractServiceImpl implements Co
*/
@Override
public String executeComparison(CarFfnlgTrgtVO existingData) {
// ========== 특수문자 '*' 제거 (전출차량, 재검여부 표시용) ==========
// 차량번호에서 '*' 제거
if (existingData.getVhclno() != null) {
String cleanVhclno = existingData.getVhclno().replace("*", "");
existingData.setVhclno(cleanVhclno);
}
// 일수에서 '*' 제거
if (existingData.getDaycnt() != null) {
String cleanDaycnt = existingData.getDaycnt().replace("*", "");
existingData.setDaycnt(cleanDaycnt);
}
String vhclno = existingData.getVhclno();
log.info("========== 비교 로직 시작: {} ==========", vhclno);

@ -36,7 +36,7 @@ public abstract class AbstractComparisonChecker implements ComparisonChecker {
/**
*
*
* @param vhrno
* @param vhrno ( '*' )
* @param vin
* @param levyCrtrYmd
* @return NewBasicRequest
@ -48,7 +48,9 @@ public abstract class AbstractComparisonChecker implements ComparisonChecker {
record.setLevyCrtrYmd(levyCrtrYmd);
if (vhrno != null) {
record.setVhrno(vhrno);
// API 호출 시 '*' 특수문자 제거 (전출차량 표시용)
String cleanVhrno = vhrno.replace("*", "");
record.setVhrno(cleanVhrno);
record.setInqSeCd("3"); // 3: 자동차번호
} else if (vin != null) {
record.setVin(vin);
@ -62,7 +64,7 @@ public abstract class AbstractComparisonChecker implements ComparisonChecker {
/**
* ()
*
* @param vhrno
* @param vhrno ( '*' )
* @param ownerNm
* @param idecno
* @param legalDongCd
@ -71,8 +73,9 @@ public abstract class AbstractComparisonChecker implements ComparisonChecker {
protected NewLedgerRequest createLedgerRequest(String vhrno, String ownerNm, String idecno, String legalDongCd) {
NewLedgerRequest request = new NewLedgerRequest();
// 차량번호
request.setVhrno(vhrno);
// API 호출 시 '*' 특수문자 제거 (전출차량 표시용)
String cleanVhrno = vhrno != null ? vhrno.replace("*", "") : vhrno;
request.setVhrno(cleanVhrno);
// 민원인 정보
request.setCvlprNm(ownerNm);

@ -789,10 +789,8 @@ public class CarFfnlgTrgtIncmpServiceImpl extends EgovAbstractServiceImpl implem
errors.add(String.format("[데이터 %d] 차량번호가 너무 깁니다. 차량번호: %s (최대 30자)", dataLineNumber, vo.getVhclno()));
}
// 2. 소유자명 검증
if (vo.getOwnrNm() == null || vo.getOwnrNm().isEmpty()) {
errors.add(String.format("[데이터 %d] 소유자명이 누락되었습니다. 차량번호: %s", dataLineNumber, vhclno));
} else if (vo.getOwnrNm().length() > 75) {
// 2. 소유자명 검증 (소유자명에 null or 공백 들어올수 있음 - 필수 아님)
if (vo.getOwnrNm() != null && !vo.getOwnrNm().isEmpty() && vo.getOwnrNm().length() > 75) {
errors.add(String.format("[데이터 %d] 소유자명이 너무 깁니다. 소유자명: %s (최대 75자), 차량번호: %s",
dataLineNumber, vo.getOwnrNm(), vhclno));
}

Loading…
Cancel
Save