### feat: `Step 0` 및 `Step 1` 로직 공통화 및 비교 체커 로직 개선

- **`Step 0` 및 `Step 1` 공통 로직 추가**
  - `ComparisonOmServiceImpl`에서 `Step 0` 및 `Step 1` API 호출을 공통화:
    - `step0Response`와 `step1Response` 객체 생성 및 유효성 검증 추가.
    - 오류 발생 시 적절한 `log.warn` 및 `log.error` 출력.
    - 모든 검사 로직에서 공통 응답 데이터를 재사용하도록 수정.

- **체커(`Checker`) 클래스의 메서드 시그니처 수정**
  - `check` 메서드가 공통화된 응답 데이터(`step0Response`, `step1Response`)를 전달받도록 변경:
    - 기존 `check(CarFfnlgTrgtIncmpVO existingData, String userOrgCd)` →
      `check(CarFfnlgTrgtIncmpVO existingData, String userOrgCd, NewBasicResponse step0Response, NewBasicResponse step1Response)`.
    - `ProductUseOmChecker`, `OwnerTransferOmChecker`, `TransferOmChecker` 등 모든 비교 체커 반영.
    - 메서드 내 중복된 API 호출 제거 및 기존 응답 데이터 활용.

- **API 호출 로직 개선**
  - `createBasicRequest` 메서드 추가:
    - `vhrno`, `vin`, `levyCrtrYmd` 기반의 API 요청 객체를 생성하는 로직 캡슐화.
    - 호출부 간소화 및 재사용성 향상.

- **코드 및 처리 흐름 정리**
  - 기존 각 체커 내부에서 수행되던 API 호출 제거:
    - `Step 0` 및 `Step 1`은 메인 서비스에서 호출 후 응답 전달 방식으로 수정.
    - 주석 보완 및 로잉 일관성 개선.

- **불필요한 호출 및 데이터 처리 제거**
  - 중복된 API 호출 및 데이터 검증 로직 제거:
    - 기존 `step0Response`, `step1Response` 응답을 재활용하여 불필요한 호출 제거.
    - 검사 결과 처리 흐름을 단계별로 정리하여 가독성 강화.

- **기타**
  - 추가된 API 호출 및 유효성 검증으로 로직 안정성 강화.
  - 메인 서비스와 각 비교 로직 간 호출 체계를 명확히 구분.
main
박성영 1 day ago
parent e113a20b23
commit 93b15f3db0

@ -1,6 +1,10 @@
package go.kr.project.carInspectionPenalty.registrationOm.service.impl;
import egovframework.util.SessionUtil;
import go.kr.project.api.model.request.NewBasicRequest;
import go.kr.project.api.model.response.NewBasicResponse;
import go.kr.project.api.service.ExternalVehicleApiService;
import go.kr.project.api.service.VmisCarBassMatterInqireLogService;
import go.kr.project.carInspectionPenalty.registrationOm.model.CarFfnlgTrgtIncmpVO;
import go.kr.project.carInspectionPenalty.registrationOm.service.ComparisonOmService;
import go.kr.project.carInspectionPenalty.registrationOm.service.impl.om_checker.*;
@ -10,6 +14,8 @@ import lombok.extern.slf4j.Slf4j;
import org.egovframe.rte.fdl.cmmn.EgovAbstractServiceImpl;
import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
/**
*
*
@ -25,13 +31,18 @@ public class ComparisonOmServiceImpl extends EgovAbstractServiceImpl implements
private final TransferOmChecker transferOmChecker;
private final OwnerTransferOmChecker ownerTransferOmChecker;
private final ExternalVehicleApiService apiService;
private final VmisCarBassMatterInqireLogService bassMatterLogService;
private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd");
/**
*
*
* <p> , .</p>
* <p> (levyCrtrYmd) existingData .</p>
*/
@Override
@Override
public String executeComparison(CarFfnlgTrgtIncmpVO existingData, LoginUserVO userInfo) {
String vhclno = existingData.getVhclno();
String levyCrtrYmd = existingData.getLevyCrtrYmd();
@ -40,22 +51,62 @@ public class ComparisonOmServiceImpl extends EgovAbstractServiceImpl implements
// 사용자 조직코드 추출
String userOrgCd = userInfo != null ? userInfo.getOrgCd() : null;
// ========== Step 0: 자동차기본정보 조회 (차량번호 + 오늘일자) - 한번만 호출 ==========
log.info("[공통] Step 0: 자동차기본정보 조회 - 차량번호: {}, 현재일", vhclno);
NewBasicResponse step0Response = null;
try {
NewBasicRequest step0Request = createBasicRequest(vhclno, null, LocalDate.now().format(DATE_FORMATTER));
step0Response = apiService.getBasicInfo(step0Request);
bassMatterLogService.updateCarFfnlgTrgtIdByTxIdNewTx(step0Response, existingData.getCarFfnlgTrgtIncmpId());
if (step0Response == null || step0Response.getRecord() == null || step0Response.getRecord().isEmpty()) {
log.warn("[공통] Step 0 응답 없음 - 차량번호: {}", vhclno);
log.info("========== 미필 비교 로직 종료 (Step 0 응답 없음): {} ==========", vhclno);
return null;
}
} catch (Exception e) {
log.error("[공통] Step 0 호출 중 오류 발생 - 차량번호: {}", vhclno, e);
log.info("========== 미필 비교 로직 종료 (Step 0 오류): {} ==========", vhclno);
return null;
}
// ========== Step 1: 자동차기본정보 조회 (차대번호 + 부과일자) - 한번만 호출 ==========
String step0vin = step0Response.getRecord().get(0).getVin();
String levyCrtrYmdFormatted = levyCrtrYmd.replace("-", "");
log.info("[공통] Step 1: 자동차기본정보 조회 - 차대번호: {}, 부과일자: {}", step0vin, levyCrtrYmdFormatted);
NewBasicResponse step1Response = null;
try {
NewBasicRequest step1Request = createBasicRequest(null, step0vin, levyCrtrYmdFormatted);
step1Response = apiService.getBasicInfo(step1Request);
bassMatterLogService.updateCarFfnlgTrgtIdByTxIdNewTx(step1Response, existingData.getCarFfnlgTrgtIncmpId());
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 = productUseOmChecker.check(existingData, userOrgCd);
String productUseResult = productUseOmChecker.check(existingData, userOrgCd, step0Response, step1Response);
if (productUseResult != null) {
log.info("========== 미필 비교 로직 종료 (상품용): {} ==========", vhclno);
return productUseResult;
}
// ========== 2. 이첩 체크 ==========
String transferResult = transferOmChecker.check(existingData, userOrgCd);
String transferResult = transferOmChecker.check(existingData, userOrgCd, step0Response, step1Response);
if (transferResult != null) {
log.info("========== 미필 비교 로직 종료 (이첩): {} ==========", vhclno);
return transferResult;
}
// ========== 3. 명의이전 소유자 확인 (검사유효기간 종료일 이후 명의이전) ==========
String ownerTransferResult = ownerTransferOmChecker.check(existingData, userOrgCd);
String ownerTransferResult = ownerTransferOmChecker.check(existingData, userOrgCd, step0Response, step1Response);
if (ownerTransferResult != null) {
log.info("========== 미필 비교 로직 종료 (명의이전 소유자 확인): {} ==========", vhclno);
return ownerTransferResult;
@ -64,4 +115,25 @@ public class ComparisonOmServiceImpl extends EgovAbstractServiceImpl implements
log.info("========== 미필 비교 로직 종료 (미적용): {} ==========", vhclno);
return null;
}
}
/**
*
*/
private NewBasicRequest createBasicRequest(String vhrno, String vin, String levyCrtrYmd) {
NewBasicRequest request = new NewBasicRequest();
NewBasicRequest.Record record = new NewBasicRequest.Record();
record.setLevyCrtrYmd(levyCrtrYmd);
if (vhrno != null) {
record.setVhrno(vhrno);
record.setInqSeCd("3"); // 3: 자동차번호
} else if (vin != null) {
record.setVin(vin);
record.setInqSeCd("2"); // 2: 차대번호
}
request.setRecord(java.util.Arrays.asList(record));
return request;
}
}

@ -1,5 +1,6 @@
package go.kr.project.carInspectionPenalty.registrationOm.service.impl.om_checker;
import go.kr.project.api.model.response.NewBasicResponse;
import go.kr.project.carInspectionPenalty.registrationOm.model.CarFfnlgTrgtIncmpVO;
/**
@ -15,7 +16,9 @@ public interface ComparisonOmChecker {
*
* @param existingData (levyCrtrYmd )
* @param userOrgCd
* @param step0Response Step 0 ( + )
* @param step1Response Step 1 ( + )
* @return null ()
*/
String check(CarFfnlgTrgtIncmpVO existingData, String userOrgCd);
String check(CarFfnlgTrgtIncmpVO existingData, String userOrgCd, NewBasicResponse step0Response, NewBasicResponse step1Response);
}

@ -52,7 +52,7 @@ public class OwnerTransferOmChecker extends AbstractComparisonOmChecker {
}
@Override
public String check(CarFfnlgTrgtIncmpVO existingData, String userOrgCd) {
public String check(CarFfnlgTrgtIncmpVO existingData, String userOrgCd, NewBasicResponse step0Response, NewBasicResponse step1Response) {
String vhclno = existingData.getVhclno();
String levyCrtrYmd = existingData.getLevyCrtrYmd().replace("-", ""); // 미필: 검사유효기간 종료일 + 146일
String inspVldPrd = existingData.getInspVldPrd(); // 검사유효기간
@ -80,12 +80,7 @@ public class OwnerTransferOmChecker extends AbstractComparisonOmChecker {
}
try {
log.info("[명의이전-미필] Step 0: 자동차기본정보 조회 - 차량번호: {}, 현재일", vhclno);
NewBasicRequest step0Request = createBasicRequest(vhclno, null, LocalDate.now().format(DATE_FORMATTER));
NewBasicResponse step0Response = apiService.getBasicInfo(step0Request);
bassMatterLogService.updateCarFfnlgTrgtIdByTxIdNewTx(step0Response, existingData.getCarFfnlgTrgtIncmpId());
// ========== Step 0, Step 1은 이미 메인 서비스에서 호출됨 ==========
if (step0Response == null || step0Response.getRecord() == null || step0Response.getRecord().isEmpty()) {
log.warn("[명의이전-미필] Step 0 응답 없음 - 차량번호: {}", vhclno);
return null;
@ -94,13 +89,6 @@ public class OwnerTransferOmChecker extends AbstractComparisonOmChecker {
NewBasicResponse.Record step0Record = step0Response.getRecord().get(0);
String step0vin = step0Record.getVin(); // 차대번호
// ========== Step 1: 자동차기본정보 조회 (차량번호, 부과일자=검사유효기간 종료일+146일) ==========
log.info("[명의이전-미필] Step 1: 자동차기본정보 조회 - 차대번호: {}, 부과일자: {}", step0vin, levyCrtrYmd);
NewBasicRequest step1Request = createBasicRequest(null, step0vin, levyCrtrYmd);
NewBasicResponse step1Response = apiService.getBasicInfo(step1Request);
bassMatterLogService.updateCarFfnlgTrgtIdByTxIdNewTx(step1Response, existingData.getCarFfnlgTrgtIncmpId());
if (step1Response == null || step1Response.getRecord() == null || step1Response.getRecord().isEmpty()) {
log.warn("[명의이전-미필] Step 1 응답 없음 - 차량번호: {}", vhclno);
return null;
@ -111,7 +99,6 @@ public class OwnerTransferOmChecker extends AbstractComparisonOmChecker {
String step1OwnerName = step1Record.getRprsOwnrNm(); // 부과일자 기준 소유자명
log.info("[명의이전-미필] Step 1 결과 - 차대번호: {}, 소유자명: {}", vin, step1OwnerName);
// 조건 1: 소유자명에 "상품용" 미포함 확인 (포함되면 다른 Checker에서 처리)
if (step1OwnerName != null && step1OwnerName.contains("상품용")) {
log.debug("[명의이전-미필] 소유자명에 '상품용' 포함 - 차량번호: {}, 소유자명: {}", vhclno, step1OwnerName);

@ -53,7 +53,7 @@ public class ProductUseOmChecker extends AbstractComparisonOmChecker {
}
@Override
public String check(CarFfnlgTrgtIncmpVO existingData, String userOrgCd) {
public String check(CarFfnlgTrgtIncmpVO existingData, String userOrgCd, NewBasicResponse step0Response, NewBasicResponse step1Response) {
String vhclno = existingData.getVhclno();
String levyCrtrYmd = existingData.getLevyCrtrYmd().replace("-", ""); // 미필: 검사유효기간 종료일 + 146일
String inspVldPrd = existingData.getInspVldPrd(); // 검사유효기간
@ -76,12 +76,7 @@ public class ProductUseOmChecker extends AbstractComparisonOmChecker {
}
try {
log.info("[상품용-미필] Step 0: 자동차기본정보 조회 - 차량번호: {}, 현재일", vhclno);
NewBasicRequest step0Request = createBasicRequest(vhclno, null, LocalDate.now().format(DATE_FORMATTER));
NewBasicResponse step0Response = apiService.getBasicInfo(step0Request);
bassMatterLogService.updateCarFfnlgTrgtIdByTxIdNewTx(step0Response, existingData.getCarFfnlgTrgtIncmpId());
// ========== Step 0, Step 1은 이미 메인 서비스에서 호출됨 ==========
if (step0Response == null || step0Response.getRecord() == null || step0Response.getRecord().isEmpty()) {
log.warn("[상품용-미필] Step 0 응답 없음 - 차량번호: {}", vhclno);
return null;
@ -90,13 +85,6 @@ public class ProductUseOmChecker extends AbstractComparisonOmChecker {
NewBasicResponse.Record step0Record = step0Response.getRecord().get(0);
String step0vin = step0Record.getVin(); // 차대번호
// ========== Step 1: 자동차기본정보 조회 (차량번호, 부과일자=검사유효기간 종료일+146일) ==========
log.info("[상품용-미필] Step 1: 자동차기본정보 조회 - 차대번호: {}, 부과일자: {}", step0vin, levyCrtrYmd);
NewBasicRequest step1Request = createBasicRequest(null, step0vin, levyCrtrYmd);
NewBasicResponse step1Response = apiService.getBasicInfo(step1Request);
bassMatterLogService.updateCarFfnlgTrgtIdByTxIdNewTx(step1Response, existingData.getCarFfnlgTrgtIncmpId());
if (step1Response == null || step1Response.getRecord() == null || step1Response.getRecord().isEmpty()) {
log.warn("[상품용-미필] Step 1 응답 없음 - 차량번호: {}", vhclno);
return null;

@ -44,7 +44,7 @@ public class TransferOmChecker extends AbstractComparisonOmChecker {
}
@Override
public String check(CarFfnlgTrgtIncmpVO existingData, String userOrgCd) {
public String check(CarFfnlgTrgtIncmpVO existingData, String userOrgCd, NewBasicResponse step0Response, NewBasicResponse step1Response) {
String vhclno = existingData.getVhclno();
try {
@ -62,34 +62,22 @@ public class TransferOmChecker extends AbstractComparisonOmChecker {
return null;
}
log.info("[상품용-미필] Step 0: 자동차기본정보 조회 - 차량번호: {}, 현재일", vhclno);
NewBasicRequest step0Request = createBasicRequest(vhclno, null, LocalDate.now().format(DATE_FORMATTER));
NewBasicResponse step0Response = apiService.getBasicInfo(step0Request);
bassMatterLogService.updateCarFfnlgTrgtIdByTxIdNewTx(step0Response, existingData.getCarFfnlgTrgtIncmpId());
// ========== Step 0, Step 1은 이미 메인 서비스에서 호출됨 ==========
if (step0Response == null || step0Response.getRecord() == null || step0Response.getRecord().isEmpty()) {
log.warn("[상품용-미필] Step 0 응답 없음 - 차량번호: {}", vhclno);
log.warn("[이첩-미필] Step 0 응답 없음 - 차량번호: {}", vhclno);
return null;
}
NewBasicResponse.Record step0Record = step0Response.getRecord().get(0);
String step0vin = step0Record.getVin(); // 차대번호
// 1단계: 자동차기본정보(차량번호, 부과일자=검사유효기간 + 146일)
// 부과일자는 이미 146일로 계산되어 있음
String step1Ymd = existingData.getLevyCrtrYmd();
log.info("[이첩-미필] 1단계 API 호출 - 차대번호: {}, 부과일자: {}", step0vin, step1Ymd);
NewBasicRequest step1Request = createBasicRequest(null, step0vin, step1Ymd);
NewBasicResponse step1Response = apiService.getBasicInfo(step1Request);
bassMatterLogService.updateCarFfnlgTrgtIdByTxIdNewTx(step1Response, existingData.getCarFfnlgTrgtIncmpId());
if (step1Response == null || step1Response.getRecord() == null || step1Response.getRecord().isEmpty()) {
log.warn("[이첩-미필] 1단계 응답 없음 - 차량번호: {}", vhclno);
log.warn("[이첩-미필] Step 1 응답 없음 - 차량번호: {}", vhclno);
return null;
}
NewBasicResponse.Record step1Record = step1Response.getRecord().get(0);
String step1Ymd = existingData.getLevyCrtrYmd(); // 부과일자
String step1RprsOwnrNm = step1Record.getRprsOwnrNm(); // 검사일 기준 소유자명
String step1RprsvOwnrIdecno = step1Record.getRprsvOwnrIdecno(); // 검사일 기준 소유자 회원번호
String step1UsgsrhldStdgCd = step1Record.getUsgsrhldStdgCd(); // 1단계 사용본거지법정동코드

Loading…
Cancel
Save