### feat: `Step 1` 로직 공통화 및 `delay_checker` 메서드 시그니처 수정

- **`Step 1` 공통 로직 도입**
  - `ComparisonServiceImpl`에서 차대번호 기반 API 호출(`Step 1`)을 공통화:
    - `step1Response` 생성 및 응답 데이터 유효성 검증 추가.
    - 오류 처리 및 로깅(`log.warn`, `log.error`) 강화.
    - 응답 객체를 각 검사 로직에서 재사용하도록 수정.

- **`delay_checker` 메서드 시그니처 업데이트**
  - 기존 `check(CarFfnlgTrgtVO existingData, String userOrgCd, NewBasicResponse step0Response)` →
    `check(CarFfnlgTrgtVO existingData, String userOrgCd, NewBasicResponse step0Response, NewBasicResponse step1Response)`로 변경:
    - 모든 `delay_checker`(`OwnerCloseWithin31Checker`, `ProductUseChecker`, `TransferCase115DayChecker` 등)에 반영.
    - 공통 API 호출(`Step 1`) 결과를 재활용하여 불필요한 중복 호출 제거.
    - `createBasicRequest`, `bassMatterLogService.updateCarFfnlgTrgtIdByTxIdNewTx` 처리 로직 정리.

- **로직 순서 정리 및 가독성 개선**
  - 처리 흐름 단순화:
    - 검사 단계 순서를 공통 체크 → 내사종결 → 날짜 수정 후 부과로 정리.
    - 각 체커 로직에서 호출 단계별 주석 추가.

- **`ComparisonOmServiceImpl` 로직 재정렬**
  - 명의이전 로직(`ownerTransferOmChecker`) 순서를 뒤로 이동:
    - 기존 이첩 로직 다음 단계로 조정하여 처리 가독성 강화.

- **불필요한 호출 제거**
  - `delay_checker` 내 중복된 `Step 1` 호출 제거:
    - 공통화된 `step1Response` 객체를 활용하도록 모든 로직 간소화.

- **기타**
  - 주석 및 로깅 일관성 개선:
    - 호출 단계별 로그 추가 및 기존 주석 정리.
    - `step1Response` 응답 유효성 검증 및 오류 시 로깅 처리 강화.
onlyExternalApi
박성영 2 days ago
parent eb4a466a3c
commit e113a20b23

@ -85,50 +85,71 @@ public class ComparisonServiceImpl extends EgovAbstractServiceImpl implements Co
return null;
}
// ========== Step 1: 자동차기본정보 조회 (차대번호 + 검사일) - 한번만 호출 ==========
String step0vin = step0Response.getRecord().get(0).getVin();
String inspYmd = existingData.getInspYmd().replace("-", "");
log.info("[공통] Step 1: 자동차기본정보 조회 - 차대번호: {}, 검사일: {}", step0vin, inspYmd);
NewBasicResponse step1Response = null;
try {
NewBasicRequest step1Request = createBasicRequest(null, step0vin, inspYmd);
step1Response = apiService.getBasicInfo(step1Request);
bassMatterLogService.updateCarFfnlgTrgtIdByTxIdNewTx(step1Response, existingData.getCarFfnlgTrgtId());
if (step1Response == null || step1Response.getRecord() == null || step1Response.getRecord().isEmpty()) {
log.warn("[공통] Step 1 응답 없음 - 차대번호: {}", step0vin);
log.info("========== 비교 로직 종료 (Step 1 응답 없음): {} ==========", vhclno);
return null;
}
} catch (Exception e) {
log.error("[공통] Step 1 호출 중 오류 발생 - 차대번호: {}", step0vin, e);
log.info("========== 비교 로직 종료 (Step 1 오류): {} ==========", vhclno);
return null;
}
// ========== 1. 상품용 체크 - api-1번호출.소유자명.contains("상품용") ==========
String productUseResult = productUseChecker.check(existingData, userOrgCd, step0Response);
String productUseResult = productUseChecker.check(existingData, userOrgCd, step0Response, step1Response);
if (productUseResult != null) {
log.info("========== 비교 로직 종료 (상품용): {} ==========", vhclno);
return productUseResult;
}
// ========== 2. 상품용 체크 - api-1번호출.소유자명.contains("상품용-변경등록") ==========
String productUseChangeResult = productUseChnageChecker.check(existingData, userOrgCd, step0Response);
String productUseChangeResult = productUseChnageChecker.check(existingData, userOrgCd, step0Response, step1Response);
if (productUseChangeResult != null) {
log.info("========== 비교 로직 종료 (상품용-변경등록): {} ==========", vhclno);
return productUseChangeResult;
}
// ========== 3. 내사종결 체크 - 명의이전 이전소유자 상품용, 31일 이내 ==========
String investigationClosedByProductResult = productCloseWithin31Checker.check(existingData, userOrgCd, step0Response);
String investigationClosedByProductResult = productCloseWithin31Checker.check(existingData, userOrgCd, step0Response, step1Response);
if (investigationClosedByProductResult != null) {
log.info("========== 비교 로직 종료 (내사종결 - 명의이전 이전소유자 상품용, 31일 이내): {} ==========", vhclno);
return investigationClosedByProductResult;
}
// ========== 4. 내사종결 체크 - 명의이전, 31일 이내 ==========
String investigationClosedByOwnerChangeResult = ownerCloseWithin31Checker.check(existingData, userOrgCd, step0Response);
String investigationClosedByOwnerChangeResult = ownerCloseWithin31Checker.check(existingData, userOrgCd, step0Response, step1Response);
if (investigationClosedByOwnerChangeResult != null) {
log.info("========== 비교 로직 종료 (내사종결 - 명의이전, 31일 이내): {} ==========", vhclno);
return investigationClosedByOwnerChangeResult;
}
// ========== 5. 이첩 체크 ==========
String transferResult = transferCase115DayChecker.check(existingData, userOrgCd, step0Response);
String transferResult = transferCase115DayChecker.check(existingData, userOrgCd, step0Response, step1Response);
if (transferResult != null) {
log.info("========== 비교 로직 종료 (이첩): {} ==========", vhclno);
return transferResult;
}
// ========== 6. 날짜 수정 후 부과 체크 - 명의이전 이전소유자 상품용, 31일 초과 ==========
String dateModifiedLevyByProductResult = productLevyOver31Checker.check(existingData, userOrgCd, step0Response);
String dateModifiedLevyByProductResult = productLevyOver31Checker.check(existingData, userOrgCd, step0Response, step1Response);
if (dateModifiedLevyByProductResult != null) {
log.info("========== 비교 로직 종료 (날짜 수정 후 부과 - 명의이전 이전소유자, 31일 초과): {} ==========", vhclno);
return dateModifiedLevyByProductResult;
}
// ========== 7. 날짜 수정 후 부과 체크 - 명의이전, 31일 초과 ==========
String dateModifiedLevyByOwnerChangeOverResult = ownerLevyOver31Checker.check(existingData, userOrgCd, step0Response);
String dateModifiedLevyByOwnerChangeOverResult = ownerLevyOver31Checker.check(existingData, userOrgCd, step0Response, step1Response);
if (dateModifiedLevyByOwnerChangeOverResult != null) {
log.info("========== 비교 로직 종료 (날짜 수정 후 부과 - 명의이전, 31일 초과): {} ==========", vhclno);
return dateModifiedLevyByOwnerChangeOverResult;

@ -16,7 +16,8 @@ public interface ComparisonChecker {
* @param existingData
* @param userOrgCd
* @param step0Response Step 0 API ( + )
* @param step1Response Step 1 API ( + )
* @return null ()
*/
String check(CarFfnlgTrgtVO existingData, String userOrgCd, NewBasicResponse step0Response);
String check(CarFfnlgTrgtVO existingData, String userOrgCd, NewBasicResponse step0Response, NewBasicResponse step1Response);
}

@ -36,7 +36,7 @@ public class OwnerCloseWithin31Checker extends AbstractComparisonChecker {
}
@Override
public String check(CarFfnlgTrgtVO existingData, String userOrgCd, NewBasicResponse step0Response) {
public String check(CarFfnlgTrgtVO existingData, String userOrgCd, NewBasicResponse step0Response, NewBasicResponse step1Response) {
String vhclno = existingData.getVhclno();
String inspYmd = existingData.getInspYmd().replace("-", "");
String vldPrdExpryYmd = existingData.getVldPrdExpryYmd().replace("-", "");
@ -53,13 +53,7 @@ public class OwnerCloseWithin31Checker extends AbstractComparisonChecker {
NewBasicResponse.Record step0Record = step0Response.getRecord().get(0);
String step0vin = step0Record.getVin(); // 차대번호
// ========== Step 1: 자동차기본정보 조회 (차량번호, 부과일자=검사일) ==========
log.info("[내사종결-명의이전] Step 1: 자동차기본정보 조회 - 차대번호: {}, 검사일: {}", step0vin, inspYmd);
NewBasicRequest step1Request = createBasicRequest(null, step0vin, inspYmd);
NewBasicResponse step1Response = apiService.getBasicInfo(step1Request);
bassMatterLogService.updateCarFfnlgTrgtIdByTxIdNewTx(step1Response, existingData.getCarFfnlgTrgtId());
// Step 1: 공통으로 이미 호출됨 - step1Response 사용
if (step1Response == null || step1Response.getRecord() == null || step1Response.getRecord().isEmpty()) {
log.warn("[내사종결-명의이전] Step 1 응답 없음 - 차량번호: {}", vhclno);
return null;

@ -36,7 +36,7 @@ public class OwnerLevyOver31Checker extends AbstractComparisonChecker {
}
@Override
public String check(CarFfnlgTrgtVO existingData, String userOrgCd, NewBasicResponse step0Response) {
public String check(CarFfnlgTrgtVO existingData, String userOrgCd, NewBasicResponse step0Response, NewBasicResponse step1Response) {
String vhclno = existingData.getVhclno();
String inspYmd = existingData.getInspYmd().replace("-", "");
String vldPrdExpryYmd = existingData.getVldPrdExpryYmd().replace("-", "");
@ -53,13 +53,7 @@ public class OwnerLevyOver31Checker extends AbstractComparisonChecker {
NewBasicResponse.Record step0Record = step0Response.getRecord().get(0);
String step0vin = step0Record.getVin(); // 차대번호
// ========== Step 1: 자동차기본정보 조회 (차량번호, 부과일자=검사일) ==========
log.info("[날짜수정후부과-명의이전] Step 1: 자동차기본정보 조회 - 차대번호: {}, 검사일: {}", step0vin, inspYmd);
NewBasicRequest step1Request = createBasicRequest(null, step0vin, inspYmd);
NewBasicResponse step1Response = apiService.getBasicInfo(step1Request);
bassMatterLogService.updateCarFfnlgTrgtIdByTxIdNewTx(step1Response, existingData.getCarFfnlgTrgtId());
// Step 1: 공통으로 이미 호출됨 - step1Response 사용
if (step1Response == null || step1Response.getRecord() == null || step1Response.getRecord().isEmpty()) {
log.warn("[날짜수정후부과-명의이전] Step 1 응답 없음 - 차량번호: {}", vhclno);
return null;

@ -36,7 +36,7 @@ public class ProductCloseWithin31Checker extends AbstractComparisonChecker {
}
@Override
public String check(CarFfnlgTrgtVO existingData, String userOrgCd, NewBasicResponse step0Response) {
public String check(CarFfnlgTrgtVO existingData, String userOrgCd, NewBasicResponse step0Response, NewBasicResponse step1Response) {
String vhclno = existingData.getVhclno();
String inspYmd = existingData.getInspYmd().replace("-", "");
String vldPrdExpryYmd = existingData.getVldPrdExpryYmd().replace("-", "");
@ -53,13 +53,7 @@ public class ProductCloseWithin31Checker extends AbstractComparisonChecker {
NewBasicResponse.Record step0Record = step0Response.getRecord().get(0);
String step0vin = step0Record.getVin(); // 차대번호
// ========== Step 1: 자동차기본정보 조회 (차량번호, 부과일자=검사일) ==========
log.info("[내사종결-명의이전 상품용] Step 1: 자동차기본정보 조회 - 차대번호: {}, 검사일: {}", step0vin, inspYmd);
NewBasicRequest step1Request = createBasicRequest(null, step0vin, inspYmd);
NewBasicResponse step1Response = apiService.getBasicInfo(step1Request);
bassMatterLogService.updateCarFfnlgTrgtIdByTxIdNewTx(step1Response, existingData.getCarFfnlgTrgtId());
// Step 1: 공통으로 이미 호출됨 - step1Response 사용
if (step1Response == null || step1Response.getRecord() == null || step1Response.getRecord().isEmpty()) {
log.warn("[내사종결-명의이전 상품용] Step 1 응답 없음 - 차량번호: {}", vhclno);
return null;

@ -36,7 +36,7 @@ public class ProductLevyOver31Checker extends AbstractComparisonChecker {
}
@Override
public String check(CarFfnlgTrgtVO existingData, String userOrgCd, NewBasicResponse step0Response) {
public String check(CarFfnlgTrgtVO existingData, String userOrgCd, NewBasicResponse step0Response, NewBasicResponse step1Response) {
String vhclno = existingData.getVhclno();
String inspYmd = existingData.getInspYmd().replace("-", "");
String vldPrdExpryYmd = existingData.getVldPrdExpryYmd().replace("-", "");
@ -53,13 +53,7 @@ public class ProductLevyOver31Checker extends AbstractComparisonChecker {
NewBasicResponse.Record step0Record = step0Response.getRecord().get(0);
String step0vin = step0Record.getVin(); // 차대번호
// ========== Step 1: 자동차기본정보 조회 (차량번호, 부과일자=검사일) ==========
log.info("[날짜수정후부과-명의이전 상품용] Step 1: 자동차기본정보 조회 - 차대번호: {}, 검사일: {}", step0vin, inspYmd);
NewBasicRequest step1Request = createBasicRequest(null, step0vin, inspYmd);
NewBasicResponse step1Response = apiService.getBasicInfo(step1Request);
bassMatterLogService.updateCarFfnlgTrgtIdByTxIdNewTx(step1Response, existingData.getCarFfnlgTrgtId());
// Step 1: 공통으로 이미 호출됨 - step1Response 사용
if (step1Response == null || step1Response.getRecord() == null || step1Response.getRecord().isEmpty()) {
log.warn("[날짜수정후부과-명의이전 상품용] Step 1 응답 없음 - 차량번호: {}", vhclno);
return null;

@ -36,7 +36,7 @@ public class ProductUseChecker extends AbstractComparisonChecker {
}
@Override
public String check(CarFfnlgTrgtVO existingData, String userOrgCd, NewBasicResponse step0Response) {
public String check(CarFfnlgTrgtVO existingData, String userOrgCd, NewBasicResponse step0Response, NewBasicResponse step1Response) {
String vhclno = existingData.getVhclno();
String inspYmd = existingData.getInspYmd().replace("-", "");
String vldPrdExpryYmd = existingData.getVldPrdExpryYmd().replace("-", "");
@ -53,13 +53,7 @@ public class ProductUseChecker extends AbstractComparisonChecker {
NewBasicResponse.Record step0Record = step0Response.getRecord().get(0);
String step0vin = step0Record.getVin(); // 차대번호
// ========== Step 1: 자동차기본정보 조회 (차대번호, 부과일자=검사일) ==========
log.info("[상품용] Step 1: 자동차기본정보 조회 - 차대번호: {}, 검사일: {}", step0vin, inspYmd);
NewBasicRequest step1Request = createBasicRequest(null, step0vin, inspYmd);
NewBasicResponse step1Response = apiService.getBasicInfo(step1Request);
bassMatterLogService.updateCarFfnlgTrgtIdByTxIdNewTx(step1Response, existingData.getCarFfnlgTrgtId());
// Step 1: 공통으로 이미 호출됨 - step1Response 사용
if (step1Response == null || step1Response.getRecord() == null || step1Response.getRecord().isEmpty()) {
log.warn("[상품용] Step 1 응답 없음 - 차량번호: {}", vhclno);
return null;

@ -36,7 +36,7 @@ public class ProductUseChnageChecker extends AbstractComparisonChecker {
}
@Override
public String check(CarFfnlgTrgtVO existingData, String userOrgCd, NewBasicResponse step0Response) {
public String check(CarFfnlgTrgtVO existingData, String userOrgCd, NewBasicResponse step0Response, NewBasicResponse step1Response) {
String vhclno = existingData.getVhclno();
String inspYmd = existingData.getInspYmd().replace("-", "");
String vldPrdExpryYmd = existingData.getVldPrdExpryYmd().replace("-", "");
@ -53,13 +53,7 @@ public class ProductUseChnageChecker extends AbstractComparisonChecker {
NewBasicResponse.Record step0Record = step0Response.getRecord().get(0);
String step0vin = step0Record.getVin(); // 차대번호
// ========== Step 1: 자동차기본정보 조회 (차량번호, 부과일자=검사일) ==========
log.info("[상품용-변경등록] Step 1: 자동차기본정보 조회 - 차대번호: {}, 검사일: {}", step0vin, inspYmd);
NewBasicRequest step1Request = createBasicRequest(null, step0vin, inspYmd);
NewBasicResponse step1Response = apiService.getBasicInfo(step1Request);
bassMatterLogService.updateCarFfnlgTrgtIdByTxIdNewTx(step1Response, existingData.getCarFfnlgTrgtId());
// Step 1: 공통으로 이미 호출됨 - step1Response 사용
if (step1Response == null || step1Response.getRecord() == null || step1Response.getRecord().isEmpty()) {
log.warn("[상품용-변경등록] Step 1 응답 없음 - 차량번호: {}", vhclno);
return null;

@ -33,7 +33,7 @@ public class TransferCase115DayChecker extends AbstractComparisonChecker {
}
@Override
public String check(CarFfnlgTrgtVO existingData, String userOrgCd, NewBasicResponse step0Response) {
public String check(CarFfnlgTrgtVO existingData, String userOrgCd, NewBasicResponse step0Response, NewBasicResponse step1Response) {
String vhclno = existingData.getVhclno();
try {

@ -47,20 +47,20 @@ public class ComparisonOmServiceImpl extends EgovAbstractServiceImpl implements
return productUseResult;
}
// ========== 2. 명의이전 소유자 확인 (검사유효기간 종료일 이후 명의이전) ==========
String ownerTransferResult = ownerTransferOmChecker.check(existingData, userOrgCd);
if (ownerTransferResult != null) {
log.info("========== 미필 비교 로직 종료 (명의이전 소유자 확인): {} ==========", vhclno);
return ownerTransferResult;
}
// ========== 3. 이첩 체크 ==========
// ========== 2. 이첩 체크 ==========
String transferResult = transferOmChecker.check(existingData, userOrgCd);
if (transferResult != null) {
log.info("========== 미필 비교 로직 종료 (이첩): {} ==========", vhclno);
return transferResult;
}
// ========== 3. 명의이전 소유자 확인 (검사유효기간 종료일 이후 명의이전) ==========
String ownerTransferResult = ownerTransferOmChecker.check(existingData, userOrgCd);
if (ownerTransferResult != null) {
log.info("========== 미필 비교 로직 종료 (명의이전 소유자 확인): {} ==========", vhclno);
return ownerTransferResult;
}
log.info("========== 미필 비교 로직 종료 (미적용): {} ==========", vhclno);
return null;
}

Loading…
Cancel
Save