diff --git a/src/main/java/go/kr/project/api/controller/VehicleInterfaceController.java b/src/main/java/go/kr/project/api/controller/VehicleInterfaceController.java
index b6a9c74..2ab739a 100644
--- a/src/main/java/go/kr/project/api/controller/VehicleInterfaceController.java
+++ b/src/main/java/go/kr/project/api/controller/VehicleInterfaceController.java
@@ -131,7 +131,7 @@ public class VehicleInterfaceController {
mediaType = MediaType.APPLICATION_JSON_VALUE,
examples = @ExampleObject(
name = "등록원부 조회 예제",
- value = "{\"data\": [{\"VHRNO\": \"12가3456\",\"ONES_INFORMATION_OPEN\": \"1\",\"CPTTR_NM\": \"홍길동\",\"CPTTR_IHIDNUM\": \"8801011234567\",\"CPTTR_LEGALDONG_CODE\": \"1111011700\",\"ROUTE_SE_CODE\": \"3\",\"DETAIL_EXPRESSION\": \"1\",\"INQIRE_SE_CODE\": \"1\"}]}"
+ value = "{\"data\": [{\"VHRNO\": \"12가3456\",\"ONES_INFORMATION_OPEN\": \"1\",\"CPTTR_NM\": \"홍길동\",\"CPTTR_IHIDNUM\": \"8801011234567\",\"CPTTR_LEGALDONG_CODE\": \"1111011700\",\"DETAIL_EXPRESSION\": \"1\",\"INQIRE_SE_CODE\": \"1\"}]}"
)
)
)
diff --git a/src/main/java/go/kr/project/carInspectionPenalty/registration/comparison/ComparisonContext.java b/src/main/java/go/kr/project/carInspectionPenalty/registration/comparison/ComparisonContext.java
deleted file mode 100644
index ba8a3dc..0000000
--- a/src/main/java/go/kr/project/carInspectionPenalty/registration/comparison/ComparisonContext.java
+++ /dev/null
@@ -1,36 +0,0 @@
-package go.kr.project.carInspectionPenalty.registration.comparison;
-
-import go.kr.project.api.model.VehicleApiResponseVO;
-import go.kr.project.carInspectionPenalty.registration.model.CarFfnlgTrgtVO;
-import lombok.Builder;
-import lombok.Getter;
-
-/**
- * 비교 로직 실행에 필요한 컨텍스트 정보
- */
-@Getter
-@Builder
-public class ComparisonContext {
-
- /**
- * 기존 과태료 대상 데이터
- */
- private final CarFfnlgTrgtVO existingData;
-
- /**
- * API 응답 데이터
- */
- private final VehicleApiResponseVO apiResponse;
-
- /**
- * 등록자 (사용자 ID)
- */
- private final String userId;
-
- /**
- * 차량번호 (편의성을 위해 추가)
- */
- public String getVhclno() {
- return existingData != null ? existingData.getVhclno() : null;
- }
-}
diff --git a/src/main/java/go/kr/project/carInspectionPenalty/registration/comparison/ComparisonResult.java b/src/main/java/go/kr/project/carInspectionPenalty/registration/comparison/ComparisonResult.java
deleted file mode 100644
index a169646..0000000
--- a/src/main/java/go/kr/project/carInspectionPenalty/registration/comparison/ComparisonResult.java
+++ /dev/null
@@ -1,50 +0,0 @@
-package go.kr.project.carInspectionPenalty.registration.comparison;
-
-import lombok.Builder;
-import lombok.Getter;
-
-/**
- * 비교 로직 실행 결과
- */
-@Getter
-@Builder
-public class ComparisonResult {
-
- /**
- * 비교 로직이 적용되었는지 여부
- * true: 이 규칙이 적용되어 처리됨 (다음 규칙 실행 중단)
- * false: 이 규칙에 해당하지 않음 (다음 규칙 계속 실행)
- */
- private final boolean applied;
-
- /**
- * 처리 상태 코드
- * 02=상품용, 03=이첩, 04=내사종결 등
- */
- private final String statusCode;
-
- /**
- * 처리 결과 메시지
- */
- private final String message;
-
- /**
- * 비교 로직에 해당하지 않는 경우의 결과 생성
- */
- public static ComparisonResult notApplied() {
- return ComparisonResult.builder()
- .applied(false)
- .build();
- }
-
- /**
- * 비교 로직이 적용된 경우의 결과 생성
- */
- public static ComparisonResult applied(String statusCode, String message) {
- return ComparisonResult.builder()
- .applied(true)
- .statusCode(statusCode)
- .message(message)
- .build();
- }
-}
diff --git a/src/main/java/go/kr/project/carInspectionPenalty/registration/comparison/ComparisonRule.java b/src/main/java/go/kr/project/carInspectionPenalty/registration/comparison/ComparisonRule.java
deleted file mode 100644
index 1db12c4..0000000
--- a/src/main/java/go/kr/project/carInspectionPenalty/registration/comparison/ComparisonRule.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package go.kr.project.carInspectionPenalty.registration.comparison;
-
-/**
- * 과태료 대상 비교 규칙 인터페이스
- *
- *
Chain of Responsibility 패턴을 사용하여 여러 비교 규칙을 순차적으로 실행합니다.
- *
- * 각 규칙은 다음 순서로 동작합니다:
- *
- * - 비교 로직 실행
- * - 해당 규칙에 적용되면 DB 업데이트 후 ComparisonResult.applied() 반환
- * - 해당 규칙에 적용되지 않으면 ComparisonResult.notApplied() 반환
- *
- *
- * 규칙이 applied=true를 반환하면 체인 실행이 중단되고, false를 반환하면 다음 규칙이 실행됩니다.
- */
-public interface ComparisonRule {
-
- /**
- * 비교 규칙을 실행합니다.
- *
- * @param context 비교에 필요한 컨텍스트 정보
- * @return 비교 결과 (applied=true면 체인 중단, false면 다음 규칙 실행)
- */
- ComparisonResult execute(ComparisonContext context);
-
- /**
- * 규칙의 이름을 반환합니다. (로깅 및 디버깅용)
- *
- * @return 규칙 이름
- */
- String getRuleName();
-
- /**
- * 규칙의 실행 순서를 반환합니다. (낮을수록 먼저 실행)
- *
- * @return 실행 순서 (기본값: 100)
- */
- default int getOrder() {
- return 100;
- }
-}
diff --git a/src/main/java/go/kr/project/carInspectionPenalty/registration/comparison/ComparisonRuleProcessor.java b/src/main/java/go/kr/project/carInspectionPenalty/registration/comparison/ComparisonRuleProcessor.java
deleted file mode 100644
index 7ae5ecd..0000000
--- a/src/main/java/go/kr/project/carInspectionPenalty/registration/comparison/ComparisonRuleProcessor.java
+++ /dev/null
@@ -1,90 +0,0 @@
-package go.kr.project.carInspectionPenalty.registration.comparison;
-
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Component;
-
-import java.util.Comparator;
-import java.util.List;
-import java.util.stream.Collectors;
-
-/**
- * 비교 규칙 프로세서
- *
- * 여러 비교 규칙을 순차적으로 실행하고 결과를 반환합니다.
- *
- * 실행 방식:
- *
- * - 모든 규칙을 getOrder() 순서대로 정렬
- * - 순서대로 각 규칙 실행
- * - 규칙이 applied=true를 반환하면 즉시 중단
- * - 모든 규칙이 applied=false를 반환하면 null 반환
- *
- */
-@Slf4j
-@Component
-public class ComparisonRuleProcessor {
-
- private final List rules;
-
- /**
- * 생성자 주입으로 모든 ComparisonRule 빈을 자동으로 주입받습니다.
- * Spring이 자동으로 모든 ComparisonRule 구현체를 찾아서 리스트로 주입합니다.
- */
- public ComparisonRuleProcessor(List rules) {
- // getOrder() 순서대로 정렬
- this.rules = rules.stream()
- .sorted(Comparator.comparingInt(ComparisonRule::getOrder))
- .collect(Collectors.toList());
-
- log.info("========== 비교 규칙 프로세서 초기화 ==========");
- log.info("등록된 규칙 개수: {}", this.rules.size());
- this.rules.forEach(rule ->
- log.info(" - [순서: {}] {}", rule.getOrder(), rule.getRuleName())
- );
- log.info("============================================");
- }
-
- /**
- * 모든 비교 규칙을 순차적으로 실행합니다.
- *
- * @param context 비교 컨텍스트
- * @return 처리 결과 (적용된 규칙이 없으면 null)
- */
- public ComparisonResult process(ComparisonContext context) {
- String vhclno = context.getVhclno();
- log.debug("========== 비교 규칙 체인 시작: {} ==========", vhclno);
-
- for (ComparisonRule rule : rules) {
- log.debug("[{}] 규칙 실행 중... 차량번호: {}", rule.getRuleName(), vhclno);
-
- try {
- ComparisonResult result = rule.execute(context);
-
- if (result.isApplied()) {
- log.info("[{}] 규칙 적용됨! 차량번호: {}, 상태코드: {}, 메시지: {}",
- rule.getRuleName(), vhclno, result.getStatusCode(), result.getMessage());
- log.debug("========== 비교 규칙 체인 종료 (규칙 적용): {} ==========", vhclno);
- return result;
- }
-
- log.debug("[{}] 규칙 적용되지 않음. 다음 규칙으로 이동...", rule.getRuleName());
-
- } catch (Exception e) {
- log.error("[{}] 규칙 실행 중 오류 발생! 차량번호: {}", rule.getRuleName(), vhclno, e);
- throw new RuntimeException(
- String.format("[%s] 규칙 실행 중 오류 발생: %s - %s",
- rule.getRuleName(), vhclno, e.getMessage()), e);
- }
- }
-
- log.debug("========== 비교 규칙 체인 종료 (적용된 규칙 없음): {} ==========", vhclno);
- return null; // 적용된 규칙이 없음
- }
-
- /**
- * 등록된 규칙 목록을 반환합니다. (디버깅용)
- */
- public List getRules() {
- return rules;
- }
-}
diff --git a/src/main/java/go/kr/project/carInspectionPenalty/registration/comparison/rules/ProductUseComparisonRule.java b/src/main/java/go/kr/project/carInspectionPenalty/registration/comparison/rules/ProductUseComparisonRule.java
deleted file mode 100644
index 095f75f..0000000
--- a/src/main/java/go/kr/project/carInspectionPenalty/registration/comparison/rules/ProductUseComparisonRule.java
+++ /dev/null
@@ -1,97 +0,0 @@
-package go.kr.project.carInspectionPenalty.registration.comparison.rules;
-
-import go.kr.project.carInspectionPenalty.registration.comparison.ComparisonContext;
-import go.kr.project.carInspectionPenalty.registration.comparison.ComparisonResult;
-import go.kr.project.carInspectionPenalty.registration.comparison.ComparisonRule;
-import go.kr.project.carInspectionPenalty.registration.mapper.CarFfnlgTrgtMapper;
-import go.kr.project.carInspectionPenalty.registration.model.CarFfnlgTrgtVO;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Component;
-
-import java.time.LocalDate;
-import java.time.format.DateTimeFormatter;
-
-/**
- * 상품용 비교 규칙
- *
- * 대표소유자성명(MBER_NM)에서 "상품용" 문자열을 찾아 처리합니다.
- *
- * 적용 조건:
- *
- * - 자동차 기본 사항 조회 대표소유자성명에 "상품용" 문자열 포함
- *
- *
- * 처리 내용:
- *
- * - TASK_PRCS_STTS_CD = 02 (상품용)
- * - TASK_PRCS_YMD = 현재 날짜
- * - CAR_BSC_MTTR_INQ_FLNM = 대표소유자성명
- *
- */
-@Slf4j
-@Component
-@RequiredArgsConstructor
-public class ProductUseComparisonRule implements ComparisonRule {
-
- private static final String STATUS_CODE = "02"; // 상품용
- private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd");
-
- private final CarFfnlgTrgtMapper mapper;
-
- @Override
- public ComparisonResult execute(ComparisonContext context) {
- String vhclno = context.getVhclno();
-
- // API 응답 데이터 유효성 검사
- if (context.getApiResponse().getBasicInfo() == null ||
- context.getApiResponse().getBasicInfo().getRecord() == null ||
- context.getApiResponse().getBasicInfo().getRecord().isEmpty()) {
- log.debug("[{}] API 응답 데이터가 없어 규칙을 적용할 수 없습니다. 차량번호: {}", getRuleName(), vhclno);
- return ComparisonResult.notApplied();
- }
-
- // 대표소유자성명 추출
- String mberNm = context.getApiResponse()
- .getBasicInfo()
- .getRecord()
- .get(0)
- .getMberNm();
-
- // 상품용 체크
- if (mberNm == null || !mberNm.contains("상품용")) {
- log.debug("[{}] 상품용에 해당하지 않습니다. 차량번호: {}, 소유자명: {}", getRuleName(), vhclno, mberNm);
- return ComparisonResult.notApplied();
- }
-
- log.info("[{}] 상품용 감지! 차량번호: {}, 소유자명: {}", getRuleName(), vhclno, mberNm);
-
- // 업무 처리 상태 업데이트
- CarFfnlgTrgtVO updateData = context.getExistingData();
- updateData.setTaskPrcsSttsCd(STATUS_CODE);
- updateData.setTaskPrcsYmd(LocalDate.now().format(DATE_FORMATTER));
- updateData.setCarBscMttrInqFlnm(mberNm); // 소유자명 저장
- updateData.setCarBscMttrInqSggCd(null); // 이첩 필드는 null
- updateData.setCarBscMttrInqSggNm(null);
-
- int updateResult = mapper.update(updateData);
-
- if (updateResult > 0) {
- log.info("[{}] 처리 완료! 차량번호: {}", getRuleName(), vhclno);
- return ComparisonResult.applied(STATUS_CODE, "상품용으로 처리되었습니다.");
- } else {
- log.error("[{}] 업데이트 실패! 차량번호: {}", getRuleName(), vhclno);
- throw new RuntimeException(String.format("상품용 업데이트 실패: %s", vhclno));
- }
- }
-
- @Override
- public String getRuleName() {
- return "상품용";
- }
-
- @Override
- public int getOrder() {
- return 10; // 상품용은 가장 먼저 체크 (낮은 순서)
- }
-}
diff --git a/src/main/java/go/kr/project/carInspectionPenalty/registration/comparison/rules/TransferComparisonRule.java b/src/main/java/go/kr/project/carInspectionPenalty/registration/comparison/rules/TransferComparisonRule.java
deleted file mode 100644
index 4a93901..0000000
--- a/src/main/java/go/kr/project/carInspectionPenalty/registration/comparison/rules/TransferComparisonRule.java
+++ /dev/null
@@ -1,169 +0,0 @@
-package go.kr.project.carInspectionPenalty.registration.comparison.rules;
-
-import go.kr.project.carInspectionPenalty.registration.comparison.ComparisonContext;
-import go.kr.project.carInspectionPenalty.registration.comparison.ComparisonResult;
-import go.kr.project.carInspectionPenalty.registration.comparison.ComparisonRule;
-import go.kr.project.carInspectionPenalty.registration.mapper.CarFfnlgTrgtMapper;
-import go.kr.project.carInspectionPenalty.registration.model.CarFfnlgTrgtVO;
-import go.kr.project.system.user.mapper.UserMapper;
-import go.kr.project.system.user.model.SystemUserVO;
-import lombok.RequiredArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Component;
-
-import java.time.LocalDate;
-import java.time.format.DateTimeFormatter;
-
-/**
- * 이첩 비교 규칙
- *
- * 사용본거지법정동코드 앞 4자리와 사용자 조직코드 앞 4자리를 비교하여 처리합니다.
- *
- * 적용 조건:
- *
- * - 자동차 기본 사항 조회 사용본거지법정동코드(USE_STRNGHLD_LEGALDONG_CODE) 앞 4자리
- * - 사용자(tb_user) ORG_CD 앞 4자리
- * - 위 두 값이 다를 경우
- *
- *
- * 처리 내용:
- *
- * - TASK_PRCS_STTS_CD = 03 (이첩)
- * - TASK_PRCS_YMD = 현재 날짜
- * - CAR_BSC_MTTR_INQ_SGG_CD = 사용본거지법정동코드 앞 5자리
- * - CAR_BSC_MTTR_INQ_SGG_NM = tb_sgg_cd 테이블에서 조회한 시군구명
- *
- */
-@Slf4j
-@Component
-@RequiredArgsConstructor
-public class TransferComparisonRule implements ComparisonRule {
-
- private static final String STATUS_CODE = "03"; // 이첩
- private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd");
-
- private final CarFfnlgTrgtMapper mapper;
- private final UserMapper userMapper;
-
- @Override
- public ComparisonResult execute(ComparisonContext context) {
- String vhclno = context.getVhclno();
-
- // API 응답 데이터 유효성 검사
- if (context.getApiResponse().getBasicInfo() == null ||
- context.getApiResponse().getBasicInfo().getRecord() == null ||
- context.getApiResponse().getBasicInfo().getRecord().isEmpty()) {
- log.debug("[{}] API 응답 데이터가 없어 규칙을 적용할 수 없습니다. 차량번호: {}", getRuleName(), vhclno);
- return ComparisonResult.notApplied();
- }
-
- go.kr.project.api.model.response.BasicResponse.Record basicInfo = context.getApiResponse().getBasicInfo().getRecord().get(0);
-
- // ========== 이첩 조건들 (OR 로직: 하나라도 만족하면 이첩) ==========
-
- // 조건1: 법정동코드 불일치
- if (checkLegalDongCodeMismatch(context, basicInfo, vhclno)) {
- return processTransfer(context, basicInfo, vhclno, "법정동코드 불일치");
- }
-
- // 조건2: 향후 추가될 이첩 조건들 (예시)
- // if (checkOtherTransferCondition(context, basicInfo, vhclno)) {
- // return processTransfer(context, basicInfo, vhclno, "다른 조건");
- // }
-
- // 모든 이첩 조건에 해당하지 않음
- log.debug("[{}] 모든 이첩 조건에 해당하지 않습니다. 차량번호: {}", getRuleName(), vhclno);
- return ComparisonResult.notApplied();
- }
-
- /**
- * 조건1: 법정동코드 불일치 체크
- * 사용본거지법정동코드 앞 4자리 != 사용자 조직코드 앞 4자리
- */
- private boolean checkLegalDongCodeMismatch(ComparisonContext context,
- go.kr.project.api.model.response.BasicResponse.Record basicInfo,
- String vhclno) {
- // 사용본거지법정동코드 추출
- String useStrnghldLegaldongCode = basicInfo.getUseStrnghldLegaldongCode();
-
- if (useStrnghldLegaldongCode == null || useStrnghldLegaldongCode.length() < 4) {
- log.debug("[{}][조건1] 법정동코드가 없거나 길이 부족. 차량번호: {}", getRuleName(), vhclno);
- return false;
- }
-
- // 사용자 정보 조회
- SystemUserVO userInfo = userMapper.selectUser(context.getUserId());
- if (userInfo == null || userInfo.getOrgCd() == null) {
- log.debug("[{}][조건1] 사용자 정보 없음. 차량번호: {}", getRuleName(), vhclno);
- return false;
- }
-
- // 법정동코드 앞 4자리와 사용자 조직코드 앞 4자리 비교
- String legalDong4 = useStrnghldLegaldongCode.substring(0, 4);
- String userOrgCd = userInfo.getOrgCd();
- String userOrg4 = userOrgCd.length() >= 4 ? userOrgCd.substring(0, 4) : userOrgCd;
-
- if (legalDong4.equals(userOrg4)) {
- log.debug("[{}][조건1] 법정동코드 일치. 차량번호: {}, 법정동: {}, 조직: {}",
- getRuleName(), vhclno, legalDong4, userOrg4);
- return false;
- }
-
- log.info("[{}][조건1] 법정동코드 불일치! 차량번호: {}, 법정동: {}, 조직: {}",
- getRuleName(), vhclno, legalDong4, userOrg4);
- return true;
- }
-
- /**
- * 이첩 처리 (공통 로직)
- */
- private ComparisonResult processTransfer(ComparisonContext context,
- go.kr.project.api.model.response.BasicResponse.Record basicInfo,
- String vhclno,
- String reason) {
- log.info("[{}] 이첩 감지! 차량번호: {}, 사유: {}", getRuleName(), vhclno, reason);
-
- // 사용본거지법정동코드 추출
- String useStrnghldLegaldongCode = basicInfo.getUseStrnghldLegaldongCode();
-
- // 시군구 코드 (법정동코드 앞 5자리)
- String sggCd = (useStrnghldLegaldongCode != null && useStrnghldLegaldongCode.length() >= 5)
- ? useStrnghldLegaldongCode.substring(0, 5)
- : (useStrnghldLegaldongCode != null ? useStrnghldLegaldongCode : "");
-
- // 시군구명 조회
- String sggNm = mapper.selectSggNmBySggCd(sggCd);
- if (sggNm == null || sggNm.isEmpty()) {
- log.warn("[{}] 시군구명 조회 실패. 시군구코드: {} (빈 문자열로 처리)", getRuleName(), sggCd);
- sggNm = ""; // 시군구명이 없어도 이첩 처리는 진행
- }
-
- // 업무 처리 상태 업데이트
- CarFfnlgTrgtVO updateData = context.getExistingData();
- updateData.setTaskPrcsSttsCd(STATUS_CODE);
- updateData.setTaskPrcsYmd(LocalDate.now().format(DATE_FORMATTER));
- updateData.setCarBscMttrInqFlnm(null); // 상품용 필드는 null
- updateData.setCarBscMttrInqSggCd(sggCd); // 시군구 코드 저장
- updateData.setCarBscMttrInqSggNm(sggNm); // 시군구명 저장
-
- int updateResult = mapper.update(updateData);
-
- if (updateResult > 0) {
- log.info("[{}] 처리 완료! 차량번호: {}, 시군구: {}({})", getRuleName(), vhclno, sggNm, sggCd);
- return ComparisonResult.applied(STATUS_CODE, String.format("이첩으로 처리되었습니다. (시군구: %s)", sggNm));
- } else {
- log.error("[{}] 업데이트 실패! 차량번호: {}", getRuleName(), vhclno);
- throw new RuntimeException(String.format("이첩 업데이트 실패: %s", vhclno));
- }
- }
-
- @Override
- public String getRuleName() {
- return "이첩";
- }
-
- @Override
- public int getOrder() {
- return 20; // 상품용 다음으로 체크
- }
-}
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 7cb080c..3ccf936 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
@@ -4,9 +4,6 @@ import egovframework.exception.MessageException;
import go.kr.project.api.model.VehicleApiResponseVO;
import go.kr.project.api.model.request.BasicRequest;
import go.kr.project.api.service.VehicleInfoService;
-import go.kr.project.carInspectionPenalty.registration.comparison.ComparisonContext;
-import go.kr.project.carInspectionPenalty.registration.comparison.ComparisonResult;
-import go.kr.project.carInspectionPenalty.registration.comparison.ComparisonRuleProcessor;
import go.kr.project.carInspectionPenalty.registration.config.CarFfnlgTxtParseConfig;
import go.kr.project.carInspectionPenalty.registration.mapper.CarFfnlgTrgtMapper;
import go.kr.project.carInspectionPenalty.registration.model.CarFfnlgTrgtVO;
@@ -21,7 +18,6 @@ import org.springframework.web.multipart.MultipartFile;
import java.io.BufferedReader;
import java.io.InputStreamReader;
-import java.nio.charset.StandardCharsets;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
@@ -29,7 +25,6 @@ import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.Objects;
/**
* 자동차 과태료 대상 Service 구현체
@@ -43,11 +38,6 @@ public class CarFfnlgTrgtServiceImpl extends EgovAbstractServiceImpl implements
private final CarFfnlgTxtParseConfig parseConfig;
private final VehicleInfoService vehicleInfoService;
- // ========== 비교 로직 선택 (둘 중 하나 선택) ==========
- // 방법1: Chain of Responsibility 패턴 (복잡하지만 확장성 좋음)
- private final ComparisonRuleProcessor comparisonRuleProcessor;
-
- // 방법2: 일반 Service/Impl 패턴 (간단하고 명확함)
private final ComparisonService comparisonService;
// 날짜 형식 (YYYYMMDD)
@@ -960,7 +950,6 @@ public class CarFfnlgTrgtServiceImpl extends EgovAbstractServiceImpl implements
BasicRequest apiRequest = new BasicRequest();
apiRequest.setVhrno(vhclno);
apiRequest.setLevyStdde(inspYmd != null ? inspYmd.replace("-", "") : "");
- // INQIRE_SE_CODE는 VmisRequestEnricher에서 자동 설정됨 (VHRNO 있으면 "3")
VehicleApiResponseVO apiResponse = vehicleInfoService.getVehicleInfo(apiRequest);
@@ -972,8 +961,10 @@ public class CarFfnlgTrgtServiceImpl extends EgovAbstractServiceImpl implements
continue;
}
+
+
// 3. 비교 로직 실행
- String statusCode = executeComparisonLogic(existingData, apiResponse, rgtr);
+ String statusCode = comparisonService.executeComparison(existingData, apiResponse, rgtr);
// 결과 처리
if (statusCode != null) {
@@ -1032,44 +1023,4 @@ public class CarFfnlgTrgtServiceImpl extends EgovAbstractServiceImpl implements
return resultData;
}
- /**
- * 비교 로직 실행 (두 가지 방법 중 선택)
- *
- * @param existingData 기존 데이터
- * @param apiResponse API 응답
- * @param userId 사용자 ID
- * @return 처리 상태 코드
- */
- private String executeComparisonLogic(CarFfnlgTrgtVO existingData, VehicleApiResponseVO apiResponse, String userId) {
- // ========== 방법 선택 (둘 중 하나만 사용) ==========
-
- // 방법1: Chain of Responsibility 패턴 사용 (복잡하지만 확장성 좋음)
- // return executeWithChainPattern(existingData, apiResponse, userId);
-
- // 방법2: 일반 Service/Impl 패턴 사용 (간단하고 명확함) ⭐ 현재 사용 중
- return executeWithServicePattern(existingData, apiResponse, userId);
- }
-
- /**
- * 방법1: Chain of Responsibility 패턴으로 비교 로직 실행
- */
- @SuppressWarnings("unused")
- private String executeWithChainPattern(CarFfnlgTrgtVO existingData, VehicleApiResponseVO apiResponse, String userId) {
- ComparisonContext context = ComparisonContext.builder()
- .existingData(existingData)
- .apiResponse(apiResponse)
- .userId(userId)
- .build();
-
- ComparisonResult result = comparisonRuleProcessor.process(context);
- return result != null && result.isApplied() ? result.getStatusCode() : null;
- }
-
- /**
- * 방법2: 일반 Service/Impl 패턴으로 비교 로직 실행
- */
- private String executeWithServicePattern(CarFfnlgTrgtVO existingData, VehicleApiResponseVO apiResponse, String userId) {
- return comparisonService.executeComparison(existingData, apiResponse, userId);
- }
-
}
diff --git a/src/main/java/go/kr/project/carInspectionPenalty/registration/service/impl/ComparisonServiceImpl.java b/src/main/java/go/kr/project/carInspectionPenalty/registration/service/impl/ComparisonServiceImpl.java
index f44ff18..1863440 100644
--- a/src/main/java/go/kr/project/carInspectionPenalty/registration/service/impl/ComparisonServiceImpl.java
+++ b/src/main/java/go/kr/project/carInspectionPenalty/registration/service/impl/ComparisonServiceImpl.java
@@ -1,5 +1,6 @@
package go.kr.project.carInspectionPenalty.registration.service.impl;
+import egovframework.exception.MessageException;
import go.kr.project.api.model.VehicleApiResponseVO;
import go.kr.project.api.model.response.BasicResponse;
import go.kr.project.carInspectionPenalty.registration.mapper.CarFfnlgTrgtMapper;
@@ -41,12 +42,6 @@ public class ComparisonServiceImpl extends EgovAbstractServiceImpl implements Co
String vhclno = existingData.getVhclno();
log.info("========== 비교 로직 시작: {} ==========", vhclno);
- // API 응답 데이터 유효성 검사
- if (!isValidApiResponse(apiResponse)) {
- log.warn("API 응답 데이터가 유효하지 않습니다. 차량번호: {}", vhclno);
- return null;
- }
-
BasicResponse.Record basicInfo = apiResponse.getBasicInfo().getRecord().get(0);
// ========== 1. 상품용 체크 ==========
@@ -107,7 +102,7 @@ public class ComparisonServiceImpl extends EgovAbstractServiceImpl implements Co
int updateCount = carFfnlgTrgtMapper.update(existingData);
if (updateCount == 0) {
- throw new RuntimeException(String.format("[상품용] 업데이트 실패: %s", vhclno));
+ throw new MessageException(String.format("[상품용] 업데이트 실패: %s", vhclno));
}
log.info("[상품용] 처리 완료! 차량번호: {}", vhclno);
@@ -205,7 +200,7 @@ public class ComparisonServiceImpl extends EgovAbstractServiceImpl implements Co
int updateCount = carFfnlgTrgtMapper.update(existingData);
if (updateCount == 0) {
- throw new RuntimeException(String.format("[이첩] 업데이트 실패: %s", vhclno));
+ throw new MessageException(String.format("[이첩] 업데이트 실패: %s", vhclno));
}
log.info("[이첩] 처리 완료! 차량번호: {}, 시군구: {}({}), 사유: {}", vhclno, sggNm, sggCd, reason);
@@ -240,24 +235,11 @@ public class ComparisonServiceImpl extends EgovAbstractServiceImpl implements Co
int updateCount = carFfnlgTrgtMapper.update(existingData);
if (updateCount == 0) {
- throw new RuntimeException(String.format("[내사종결] 업데이트 실패: %s", vhclno));
+ throw new MessageException(String.format("[내사종결] 업데이트 실패: %s", vhclno));
}
log.info("[내사종결] 처리 완료! 차량번호: {}", vhclno);
return "04";
}
- // ========================================
- // 유틸리티 메서드
- // ========================================
-
- /**
- * API 응답 데이터 유효성 검사
- */
- private boolean isValidApiResponse(VehicleApiResponseVO apiResponse) {
- return apiResponse != null
- && apiResponse.getBasicInfo() != null
- && apiResponse.getBasicInfo().getRecord() != null
- && !apiResponse.getBasicInfo().getRecord().isEmpty();
- }
}
diff --git a/src/main/webapp/WEB-INF/views/carInspectionPenalty/registration/list.jsp b/src/main/webapp/WEB-INF/views/carInspectionPenalty/registration/list.jsp
index a9eb0f2..9fc3423 100644
--- a/src/main/webapp/WEB-INF/views/carInspectionPenalty/registration/list.jsp
+++ b/src/main/webapp/WEB-INF/views/carInspectionPenalty/registration/list.jsp
@@ -57,7 +57,7 @@
- 과태료 대상 목록
-
-
+
총 0건