diff --git a/src/main/java/go/kr/project/api/config/ApiConstant.java b/src/main/java/go/kr/project/api/config/ApiConstant.java
index e62d40e..ce0cb57 100644
--- a/src/main/java/go/kr/project/api/config/ApiConstant.java
+++ b/src/main/java/go/kr/project/api/config/ApiConstant.java
@@ -11,19 +11,61 @@ package go.kr.project.api.config;
*/
public class ApiConstant {
+ /*
+ *
+ 코드 코드 상세 비고
+ MSG50000 EAI 연계 호출을 성공적으로 처리하였습니다.
+ MSG50001 요청하신 자료가 존재하지 않습니다.
+ MSG50002 EAI 연계 호출결과 기준치보다 많은 결과조회로 인해 열람이 불가합니다.
+ MSG50110 EAI 호출을 위한 Message(Header) 구성에 실패하였습니다. 기타 Exception에 의해 EAI 호출을 위한 Message(Header) 구성에 실패하였습니다.
+ MSG50111 요청하신 연계정보 ID가 연계정보 테이블에 존재하지 않아, Message(Header)를 구성하는데 실패하였습니다. EAI Client에서 Request Message Header 정보를 구성시 Header 정보가 연계정보 테이블에 없습
+ MSG50112 요청하신 연계정보 ID가 interface.properties에 존재하지 않아 Message(Header)를 구성하는데 실패하였습니다.
+ MSG50120 EAI 호출을 위한 Message(Common) 구성에 실패하였습니다.
+ MSG50121 요청하신 연계정보 ID가 연계정보 테이블에 존재하지 않아, Message(Common)를 구성하는데 실패하였습니다.
+ MSG50122 사용자 Session정보 획득에 실패하여, Message(Common) 구성에 실패하였습니다.
+ MSG50130 EAI 호출을 위한 Message(Body) 구성에 실패하였습니다.
+ MSG50131 자동차관리정보시스템 호출을위한 Message(DataSet)구성에 실패하였습니다.
+ MSG50140 EAI Client Application Factory에서 Application Instance 획득에 실패하였습니다.
+ MSG50150 EAI Client Application에서 Http Connection Exception이 발생하였습니다.
+ MSG50160 기타 오류로 EAI Request가 실패하였습니다.
+ MSG50170 EAI Response Message Parsing에 실패하였습니다.
+ MSG50171 EAI Response Message의 Body가 Null입니다.
+ MSG50172 EAI Response Message의 Body Parsing에 실패하였습니다.
+ MSG50180 연계신청번호 생성에 실패하였습니다.
+ MSG50190 모니터링 통계로그 생성에 실패하였습니다.
+ MSG50191 모니터링 통계로그 Update에 실패하였습니다.
+ MSG50210 EAI-HUB 구간 요청(신청)데이터 오류 : Format 오류, 필수값 미입력, Validation 오류 EAI-HUB 구간 요청(신청)데이터 오류
+ MSG50220 EAI-HUB 구간 응답(결과)데이터 오류 : Format 오류, 필수값 미입력, Validation 오류 EAI-HUB 구간 응답(결과)데이터 오류
+ MSG50230 EAI-HUB 구간 내부자료변환 오류 : FlowRule처리 오류, MappingRule처리 오류, 내부 비즈니스로직 오류 EAI-HUB 구간 내부자료변환 오류
+ MSG50240 EAI-HUB 구간 암호화오류 : Encrypt 오류, Decrypt 오류, Sign 오류, LDAP오류, 검증(OCSP, CRL)오류 EAI-HUB 구간 암호화오류
+ MSG50250 EAI-HUB 구간 통신장애 오류 : 연결 오류 , Timeout 오류, 송신 오류, 수신 오류 EAI-HUB 구간 통신장애 오류
+ MSG50260 EAI-HUB 구간 시스템 오류: 기타 시스템 오류 EAI-HUB 구간 시스템 오류
+ MSG50310 내부-EAI-RA 구간 요청(신청)데이터 오류 : Format 오류, 필수값 미입력, Validation 오류 내부-EAI-RA 구간 요청(신청)데이터 오류
+ MSG50320 내부-EAI-RA 구간 응답(결과)데이터 오류 : Format 오류, 필수값 미입력, Validation 오류 내부-EAI-RA 구간 응답(결과)데이터 오류
+ MSG50330 내부-EAI-RA 구간 내부자료변환 오류 : FlowRule처리 오류, MappingRule처리 오류, 내부 비즈니스로직 오류 내부-EAI-RA 구간 내부자료변환 오류
+ MSG50340 내부-EAI-RA 구간 암호화오류 : Encrypt 오류, Decrypt 오류, Sign 오류, LDAP오류, 검증(OCSP, CRL)오류 내부-EAI-RA 구간 암호화오류
+ MSG50350 내부-EAI-RA 구간 통신장애 오류 : 연결 오류 , Timeout 오류, 송신 오류, 수신 오류 내부-EAI-RA 구간 통신장애 오류
+ MSG50360 내부-EAI-RA 구간 시스템 오류 : 기타 시스템 오류 내부-EAI-RA 구간 시스템 오류
+ MSG50410 외부-EAI-RA 구간 요청(신청)데이터 오류 : Format 오류, 필수값 미입력, Validation 오류 외부-EAI-RA 구간 요청(신청)데이터 오류
+ MSG50420 외부-EAI-RA 구간 응답(결과)데이터 오류 : Format 오류, 필수값 미입력, Validation 오류 외부-EAI-RA 구간 응답(결과)데이터 오류
+ MSG50430 외부-EAI-RA 구간 내부자료변환 오류 : FlowRule처리 오류, MappingRule처리 오류, 내부 비즈니스로직 오류 외부-EAI-RA 구간 내부자료변환 오류
+ MSG50440 외부-EAI-RA 구간 암호화오류 : Encrypt 오류, Decrypt 오류, Sign 오류, LDAP오류, 검증(OCSP, CRL)오류 외부-EAI-RA 구간 암호화오류
+ MSG50450 외부-EAI-RA 구간 통신장애 오류 : 연결 오류 , Timeout 오류, 송신 오류, 수신 오류 외부-EAI-RA 구간 통신장애 오류
+ MSG50460 외부-EAI-RA 구간 시스템 오류 : 기타 시스템 오류 외부-EAI-RA 구간 시스템 오류
+ MSG50510 제공기관 구간 요청(신청)데이터 오류 : Format 오류, 필수값 미입력, Validation 오류 제공기관 구간 요청(신청)데이터 오류
+ MSG50520 제공기관 구간 응답(결과)데이터 오류 : Format 오류, 필수값 미입력, Validation 오류 제공기관 구간 응답(결과)데이터 오류
+ MSG50530 제공기관 구간 내부자료변환 오류 : FlowRule처리 오류, MappingRule처리 오류, 내부 비즈니스로직 오류 제공기관 구간 내부자료변환 오류
+ MSG50540 제공기관 구간 암호화오류 : Encrypt 오류, Decrypt 오류, Sign 오류, LDAP오류, 검증(OCSP, CRL)오류 제공기관 구간 암호화오류
+ MSG50550 제공기관 구간 통신장애 오류 : 연결 오류 , Timeout 오류, 송신 오류, 수신 오류 제공기관 구간 통신장애 오류
+ MSG50560 제공기관 구간 시스템 오류 : 기타 시스템 오류 제공기관 구간 시스템 오류
+ * */
// ===== 연계 결과 코드 (CNTC_RESULT_CODE) =====
/**
- * 연계 결과 코드: 정상
- *
외부 API 호출이 정상적으로 처리되었음을 나타냅니다.
+ * 연계 결과 코드: 성공
+ * EAI 연계 호출을 성공적으로 처리하였습니다.
*/
- public static final String CNTC_RESULT_CODE_SUCCESS = "00";
-
- /**
- * 연계 결과 코드: 정보 없음
- * 외부 API 호출이 정상적으로 처리되었으나 정보없음을 나타냅니다.
- */
- public static final String CNTC_RESULT_CODE_NO_DATA = "99";
+ public static final String CNTC_RESULT_CODE_SUCCESS = "MSG50000";
/**
* 연계 결과 코드: 에러
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 f1703f3..7e8bae0 100644
--- a/src/main/java/go/kr/project/api/controller/VehicleInterfaceController.java
+++ b/src/main/java/go/kr/project/api/controller/VehicleInterfaceController.java
@@ -53,7 +53,7 @@ public class VehicleInterfaceController {
/**
* 자동차 기본정보 + 등록원부(갑) 통합 조회
* - Internal/External 공통 진입점 (VehicleInfoService 사용)
- * - 요청은 Envelope 형식으로 VHRNO(차량번호)만 주면 됨
+ * - 요청은 Envelope 형식으로 VHRNO(차량번호) 및 추가 파라미터 포함
*/
@PostMapping(value = "/info.ajax", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@Operation(
@@ -64,7 +64,7 @@ public class VehicleInterfaceController {
mediaType = MediaType.APPLICATION_JSON_VALUE,
examples = @ExampleObject(
name = "통합 조회 예제",
- value = "{\"data\": [{\"VHRNO\": \"12가3456\"}]}"
+ value = "{\"data\": [{\"VHRNO\": \"12가3456\",\"LEVY_STDDE\": \"20250101\",\"INQIRE_SE_CODE\": \"1\",\"VIN\": \"KMHAB812345678901\"}]}"
)
)
)
@@ -72,15 +72,15 @@ public class VehicleInterfaceController {
public ResponseEntity> info(
@org.springframework.web.bind.annotation.RequestBody Envelope envelope
) {
- // 중요 로직: Swagger 요청 Envelope에서 첫 번째 데이터만 사용 (테스트 편의)
- String vhrno = (envelope != null && !envelope.getData().isEmpty()) ? envelope.getData().get(0).getVhrno() : null;
- if (vhrno == null || vhrno.trim().isEmpty()) {
+ // 중요 로직: Swagger 요청 Envelope에서 BasicRequest 추출 (차량번호 및 필수 파라미터 포함)
+ BasicRequest request = (envelope != null && !envelope.getData().isEmpty()) ? envelope.getData().get(0) : null;
+ if (request == null || request.getVhrno() == null || request.getVhrno().trim().isEmpty()) {
// 간단한 검증 실패 시 빈 데이터로 반환
return ResponseEntity.ok(new Envelope<>(Collections.emptyList()));
}
// VehicleInfoService는 모드에 따라 구현체가 자동 주입됨
- VehicleApiResponseVO resp = vehicleInfoService.getVehicleInfo(vhrno);
+ VehicleApiResponseVO resp = vehicleInfoService.getVehicleInfo(request);
Envelope out = new Envelope<>(resp);
return ResponseEntity.ok(out);
}
@@ -98,7 +98,7 @@ public class VehicleInterfaceController {
mediaType = MediaType.APPLICATION_JSON_VALUE,
examples = @ExampleObject(
name = "기본사항조회 예제",
- value = "{\"data\": [{\"VHRNO\": \"12가3456\"}]}"
+ value = "{\"data\": [{\"VHRNO\": \"12가3456\",\"LEVY_STDDE\": \"20250101\",\"INQIRE_SE_CODE\": \"1\",\"VIN\": \"KMHAB812345678901\"}]}"
)
)
)
@@ -106,14 +106,14 @@ public class VehicleInterfaceController {
public ResponseEntity> basic(
@org.springframework.web.bind.annotation.RequestBody Envelope envelope
) {
- // 중요 로직: Swagger 요청 Envelope에서 차량번호 추출
- String vhrno = (envelope != null && !envelope.getData().isEmpty()) ? envelope.getData().get(0).getVhrno() : null;
- if (vhrno == null || vhrno.trim().isEmpty()) {
+ // 중요 로직: Swagger 요청 Envelope에서 BasicRequest 추출 (차량번호 및 필수 파라미터 포함)
+ BasicRequest request = (envelope != null && !envelope.getData().isEmpty()) ? envelope.getData().get(0) : null;
+ if (request == null || request.getVhrno() == null || request.getVhrno().trim().isEmpty()) {
return ResponseEntity.ok(new Envelope<>(Collections.emptyList()));
}
// VehicleInfoService는 모드에 따라 구현체가 자동 주입되어 분기 처리
- BasicResponse basic = vehicleInfoService.getBasicInfo(vhrno);
+ BasicResponse basic = vehicleInfoService.getBasicInfo(request);
Envelope out = (basic != null) ? new Envelope<>(basic) : new Envelope<>(Collections.emptyList());
return ResponseEntity.ok(out);
}
@@ -131,7 +131,7 @@ public class VehicleInterfaceController {
mediaType = MediaType.APPLICATION_JSON_VALUE,
examples = @ExampleObject(
name = "등록원부 조회 예제",
- value = "{\"data\": [{\"VHRNO\": \"12가3456\"}]}"
+ 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\"}]}"
)
)
)
@@ -139,14 +139,14 @@ public class VehicleInterfaceController {
public ResponseEntity> ledger(
@org.springframework.web.bind.annotation.RequestBody Envelope envelope
) {
- // 중요 로직: Swagger 요청 Envelope에서 차량번호 추출
- String vhrno = (envelope != null && !envelope.getData().isEmpty()) ? envelope.getData().get(0).getVhrno() : null;
- if (vhrno == null || vhrno.trim().isEmpty()) {
+ // 중요 로직: Swagger 요청 Envelope에서 LedgerRequest 추출 (차량번호 및 필수 파라미터 포함)
+ LedgerRequest request = (envelope != null && !envelope.getData().isEmpty()) ? envelope.getData().get(0) : null;
+ if (request == null || request.getVhrno() == null || request.getVhrno().trim().isEmpty()) {
return ResponseEntity.ok(new Envelope<>(Collections.emptyList()));
}
// VehicleInfoService는 모드에 따라 구현체가 자동 주입되어 분기 처리
- LedgerResponse ledger = vehicleInfoService.getLedgerInfo(vhrno);
+ LedgerResponse ledger = vehicleInfoService.getLedgerInfo(request);
Envelope out = (ledger != null) ? new Envelope<>(ledger) : new Envelope<>(Collections.emptyList());
return ResponseEntity.ok(out);
}
diff --git a/src/main/java/go/kr/project/api/external/service/ExternalVehicleApiService.java b/src/main/java/go/kr/project/api/external/service/ExternalVehicleApiService.java
index 711c435..590b58b 100644
--- a/src/main/java/go/kr/project/api/external/service/ExternalVehicleApiService.java
+++ b/src/main/java/go/kr/project/api/external/service/ExternalVehicleApiService.java
@@ -1,6 +1,8 @@
package go.kr.project.api.external.service;
import go.kr.project.api.model.VehicleApiResponseVO;
+import go.kr.project.api.model.request.BasicRequest;
+import go.kr.project.api.model.request.LedgerRequest;
import go.kr.project.api.model.response.BasicResponse;
import go.kr.project.api.model.response.LedgerResponse;
@@ -28,13 +30,23 @@ public interface ExternalVehicleApiService {
*/
VehicleApiResponseVO getVehicleInfo(String vehicleNumber);
+ /**
+ * 단일 차량에 대한 정보 조회 (상세 파라미터 포함)
+ *
+ * @param basicRequest 기본정보 조회 요청 (차량번호, 부과기준일, 조회구분 등 포함)
+ * @return 차량 정보 응답
+ */
+ VehicleApiResponseVO getVehicleInfo(BasicRequest basicRequest);
+
/**
* 차량 기본정보만 조회 (외부 REST 호출)
+ * 중요: 기본정보 조회는 차량번호 외에 부과기준일, 조회구분 등 필수 파라미터 필요
*/
- BasicResponse getBasicInfo(String vehicleNumber);
+ BasicResponse getBasicInfo(BasicRequest request);
/**
* 자동차 등록원부(갑)만 조회 (외부 REST 호출)
+ * 중요: 등록원부 조회는 차량번호 외에 소유자정보 등 필수 파라미터 필요
*/
- LedgerResponse getLedgerInfo(String vehicleNumber);
+ LedgerResponse getLedgerInfo(LedgerRequest request);
}
diff --git a/src/main/java/go/kr/project/api/external/service/impl/ExternalVehicleApiServiceImpl.java b/src/main/java/go/kr/project/api/external/service/impl/ExternalVehicleApiServiceImpl.java
index dbd6250..9a04a53 100644
--- a/src/main/java/go/kr/project/api/external/service/impl/ExternalVehicleApiServiceImpl.java
+++ b/src/main/java/go/kr/project/api/external/service/impl/ExternalVehicleApiServiceImpl.java
@@ -1,5 +1,6 @@
package go.kr.project.api.external.service.impl;
+import go.kr.project.api.config.ApiConstant;
import go.kr.project.api.external.service.ExternalVehicleApiService;
import go.kr.project.api.model.request.BasicRequest;
import go.kr.project.api.model.request.LedgerRequest;
@@ -62,20 +63,53 @@ public class ExternalVehicleApiServiceImpl implements ExternalVehicleApiService
public VehicleApiResponseVO getVehicleInfo(String vehicleNumber) {
log.info("차량 정보 조회 시작 - 차량번호: {}", vehicleNumber);
+ // 차량번호만으로 BasicRequest 생성
+ BasicRequest basicRequest = new BasicRequest();
+ basicRequest.setVhrno(vehicleNumber);
+
+ // BasicRequest를 받는 오버로딩 메서드 호출
+ return getVehicleInfo(basicRequest);
+ }
+
+ @Override
+ public VehicleApiResponseVO getVehicleInfo(BasicRequest basicRequest) {
+ String vehicleNumber = basicRequest.getVhrno();
+ log.info("차량 정보 조회 시작 - 차량번호: {}, 부과기준일: {}, 조회구분: {}",
+ vehicleNumber, basicRequest.getLevyStdde(), basicRequest.getInqireSeCode());
+
VehicleApiResponseVO response = new VehicleApiResponseVO();
response.setVhrno(vehicleNumber);
try {
// 1. 차량 기본정보 조회
- BasicResponse basicInfo = getBasicInfo(vehicleNumber);
+ // 중요 로직: BasicRequest 전체를 사용하여 조회 (RequestEnricher가 나머지 채움)
+ BasicResponse basicInfo = getBasicInfo(basicRequest);
response.setBasicInfo(basicInfo);
// 2. 자동차 등록원부 조회
- LedgerResponse ledgerInfo = getLedgerInfo(vehicleNumber);
+ // 중요 로직: 통합 조회 시에는 차량번호와 기본정보를 바탕으로 LedgerRequest 생성 (RequestEnricher가 나머지 채움)
+ LedgerRequest ledgerRequest = new LedgerRequest();
+ ledgerRequest.setVhrno(vehicleNumber);
+ ledgerRequest.setOnesInformationOpen("1"); //개인정보공개 {1:소유자공개, 2:비공개, 3:비공개(주민등록번호), 4:비공개(사용본거지)}
+
+ // basicInfo에서 민원인 정보 가져오기
+ if (basicInfo != null && basicInfo.getRecord() != null && !basicInfo.getRecord().isEmpty()) {
+ BasicResponse.Record record = basicInfo.getRecord().get(0);
+ ledgerRequest.setCpttrNm(record.getMberNm()); // 민원인성명
+ ledgerRequest.setCpttrIhidnum(record.getMberSeNo()); // 민원인주민번호
+ }
+
+ // 고정값 설정
+ ledgerRequest.setCpttrLegaldongCode(null); // 민원인법정동코드
+ ledgerRequest.setRouteSeCode("3"); // 경로구분코드
+ ledgerRequest.setDetailExpression("2"); // 내역표시 (최종내역)
+ ledgerRequest.setInqireSeCode("1"); // 조회구분코드 (열람)
+
+ LedgerResponse ledgerInfo = getLedgerInfo(ledgerRequest);
response.setLedgerInfo(ledgerInfo);
// 3. 결과 검증
- if (basicInfo != null && "00".equals(basicInfo.getCntcResultCode())) {
+ if (basicInfo != null && ApiConstant.CNTC_RESULT_CODE_SUCCESS.equals(basicInfo.getCntcResultCode())) {
response.setSuccess(true);
response.setMessage("조회 성공");
log.info("차량번호 {} 조회 성공", vehicleNumber);
@@ -96,20 +130,17 @@ public class ExternalVehicleApiServiceImpl implements ExternalVehicleApiService
/**
* 차량 기본정보 조회 API 호출
- * VMIS-interface의 RequestEnricher가 기본 설정값을 자동으로 채워주므로 차량번호만 전송
+ * 중요 로직: 기본정보 조회는 BasicRequest 전체를 받아서 외부 API에 전달
+ * (차량번호, 부과기준일, 조회구분, 차대번호 등 필수 파라미터 포함)
*
- * @param vehicleNumber 차량번호
+ * @param request 기본정보 조회 요청 (차량번호, 부과기준일, 조회구분 등 포함)
* @return 차량 기본정보
*/
@Override
- public BasicResponse getBasicInfo(String vehicleNumber) {
- log.debug("차량 기본정보 조회 API 호출 - 차량번호: {}", vehicleNumber);
-
- // 요청 객체 생성 - 차량번호만 설정 (나머지는 RequestEnricher가 자동 설정)
- BasicRequest request = new BasicRequest();
- request.setVhrno(vehicleNumber);
+ public BasicResponse getBasicInfo(BasicRequest request) {
+ log.debug("차량 기본정보 조회 API 호출 - 차량번호: {}", request.getVhrno());
- // Envelope로 감싸기
+ // Envelope로 감싸기 (요청 객체는 이미 모든 필수 파라미터를 포함)
Envelope requestEnvelope = new Envelope<>(request);
// HTTP 헤더 설정
@@ -134,31 +165,27 @@ public class ExternalVehicleApiServiceImpl implements ExternalVehicleApiService
}
}
- log.warn("차량 기본정보 조회 응답이 비어있음 - 차량번호: {}", vehicleNumber);
+ log.warn("차량 기본정보 조회 응답이 비어있음 - 차량번호: {}", request.getVhrno());
return null;
} catch (Exception e) {
- log.error("차량 기본정보 조회 API 호출 실패 - 차량번호: {}", vehicleNumber, e);
+ log.error("차량 기본정보 조회 API 호출 실패 - 차량번호: {}", request.getVhrno(), e);
throw new RuntimeException("차량 기본정보 조회 실패: " + e.getMessage(), e);
}
}
/**
* 자동차 등록원부(갑) 조회 API 호출
- * VMIS-interface의 RequestEnricher가 기본 설정값을 자동으로 채워주므로 차량번호만 전송
- *
- * @param vehicleNumber 차량번호
+ * 중요 로직: 등록원부 조회는 차량번호 외에 소유자정보, 조회구분 등 필수 파라미터를 받아서 호출
+ *
+ * @param request 등록원부 조회 요청 (차량번호, 소유자정보, 조회구분 등 포함)
* @return 등록원부 정보
*/
@Override
- public LedgerResponse getLedgerInfo(String vehicleNumber) {
- log.debug("자동차 등록원부 조회 API 호출 - 차량번호: {}", vehicleNumber);
-
- // 요청 객체 생성 - 차량번호만 설정 (나머지는 RequestEnricher가 자동 설정)
- LedgerRequest request = new LedgerRequest();
- request.setVhrno(vehicleNumber);
+ public LedgerResponse getLedgerInfo(LedgerRequest request) {
+ log.debug("자동차 등록원부 조회 API 호출 - 차량번호: {}", request.getVhrno());
- // Envelope로 감싸기
+ // Envelope로 감싸기 (요청 객체는 이미 모든 필수 파라미터를 포함)
Envelope requestEnvelope = new Envelope<>(request);
// HTTP 헤더 설정
@@ -183,11 +210,11 @@ public class ExternalVehicleApiServiceImpl implements ExternalVehicleApiService
}
}
- log.warn("자동차 등록원부 조회 응답이 비어있음 - 차량번호: {}", vehicleNumber);
+ log.warn("자동차 등록원부 조회 응답이 비어있음 - 차량번호: {}", request.getVhrno());
return null;
} catch (Exception e) {
- log.error("자동차 등록원부 조회 API 호출 실패 - 차량번호: {}", vehicleNumber, e);
+ log.error("자동차 등록원부 조회 API 호출 실패 - 차량번호: {}", request.getVhrno(), e);
throw new RuntimeException("자동차 등록원부 조회 실패: " + e.getMessage(), e);
}
}
diff --git a/src/main/java/go/kr/project/api/external/service/impl/ExternalVehicleInfoServiceImpl.java b/src/main/java/go/kr/project/api/external/service/impl/ExternalVehicleInfoServiceImpl.java
index 1302b55..4056b0d 100644
--- a/src/main/java/go/kr/project/api/external/service/impl/ExternalVehicleInfoServiceImpl.java
+++ b/src/main/java/go/kr/project/api/external/service/impl/ExternalVehicleInfoServiceImpl.java
@@ -3,6 +3,8 @@ package go.kr.project.api.external.service.impl;
import go.kr.project.api.external.service.ExternalVehicleApiService;
import go.kr.project.api.service.VehicleInfoService;
import go.kr.project.api.model.VehicleApiResponseVO;
+import go.kr.project.api.model.request.BasicRequest;
+import go.kr.project.api.model.request.LedgerRequest;
import go.kr.project.api.model.response.BasicResponse;
import go.kr.project.api.model.response.LedgerResponse;
import lombok.RequiredArgsConstructor;
@@ -66,6 +68,23 @@ public class ExternalVehicleInfoServiceImpl implements VehicleInfoService {
return response;
}
+ @Override
+ public VehicleApiResponseVO getVehicleInfo(BasicRequest basicRequest) {
+ String vehicleNumber = basicRequest.getVhrno();
+ log.info("[External Mode] 차량 정보 조회 시작 - 차량번호: {}, 부과기준일: {}, 조회구분: {}",
+ vehicleNumber, basicRequest.getLevyStdde(), basicRequest.getInqireSeCode());
+
+ VehicleApiResponseVO response = externalVehicleApiService.getVehicleInfo(basicRequest);
+
+ if (response.isSuccess()) {
+ log.info("[External Mode] 차량번호 {} 조회 성공", vehicleNumber);
+ } else {
+ log.warn("[External Mode] 차량번호 {} 조회 실패 - {}", vehicleNumber, response.getMessage());
+ }
+
+ return response;
+ }
+
@Override
public List getVehiclesInfo(List vehicleNumbers) {
log.info("[External Mode] 차량 정보 일괄 조회 시작 - 대상 차량 수: {}", vehicleNumbers.size());
@@ -87,19 +106,21 @@ public class ExternalVehicleInfoServiceImpl implements VehicleInfoService {
/**
* 외부 REST - 기본정보 단독 조회
+ * 중요 로직: 외부 API 호출은 ExternalVehicleApiService에 위임 (BasicRequest 전체 전달)
*/
@Override
- public BasicResponse getBasicInfo(String vehicleNumber) {
+ public BasicResponse getBasicInfo(BasicRequest request) {
// 중요 로직: 외부 API 호출은 ExternalVehicleApiService에 위임
- return externalVehicleApiService.getBasicInfo(vehicleNumber);
+ return externalVehicleApiService.getBasicInfo(request);
}
/**
* 외부 REST - 등록원부 단독 조회
+ * 중요 로직: 등록원부 조회는 LedgerRequest 전체를 받아서 외부 API에 전달
*/
@Override
- public LedgerResponse getLedgerInfo(String vehicleNumber) {
+ public LedgerResponse getLedgerInfo(LedgerRequest request) {
// 중요 로직: 외부 API 호출은 ExternalVehicleApiService에 위임
- return externalVehicleApiService.getLedgerInfo(vehicleNumber);
+ return externalVehicleApiService.getLedgerInfo(request);
}
}
diff --git a/src/main/java/go/kr/project/api/internal/service/VmisRequestEnricher.java b/src/main/java/go/kr/project/api/internal/service/VmisRequestEnricher.java
index 757b790..bb02824 100644
--- a/src/main/java/go/kr/project/api/internal/service/VmisRequestEnricher.java
+++ b/src/main/java/go/kr/project/api/internal/service/VmisRequestEnricher.java
@@ -56,6 +56,20 @@ public class VmisRequestEnricher {
req.setChargerId(sys.getChargerId());
req.setChargerIp(sys.getChargerIp());
req.setChargerNm(sys.getChargerNm());
+
+ // 고정값 설정 (값이 없는 경우에만 설정)
+ if (req.getOnesInformationOpen() == null) {
+ req.setOnesInformationOpen("1"); // 개인정보공개 (소유자공개)
+ }
+ if (req.getRouteSeCode() == null) {
+ req.setRouteSeCode("3"); // 경로구분코드
+ }
+ if (req.getDetailExpression() == null) {
+ req.setDetailExpression("2"); // 내역표시 (최종내역)
+ }
+ if (req.getInqireSeCode() == null) {
+ req.setInqireSeCode("1"); // 조회구분코드 (열람)
+ }
}
log.debug("[ENRICH] ledger: applied INFO_SYS_ID={}, INFO_SYS_IP={}, SIGUNGU_CODE={}, CNTC_INFO_CODE={}",
sys.getInfoSysId(), sys.getInfoSysIp(), sys.getSigunguCode(), cntc);
diff --git a/src/main/java/go/kr/project/api/internal/service/impl/InternalVehicleInfoServiceImpl.java b/src/main/java/go/kr/project/api/internal/service/impl/InternalVehicleInfoServiceImpl.java
index 9bacbd5..df4feee 100644
--- a/src/main/java/go/kr/project/api/internal/service/impl/InternalVehicleInfoServiceImpl.java
+++ b/src/main/java/go/kr/project/api/internal/service/impl/InternalVehicleInfoServiceImpl.java
@@ -1,5 +1,6 @@
package go.kr.project.api.internal.service.impl;
+import go.kr.project.api.config.ApiConstant;
import go.kr.project.api.service.VehicleInfoService;
import go.kr.project.api.internal.service.VmisCarBassMatterInqireService;
import go.kr.project.api.internal.service.VmisCarLedgerFrmbkService;
@@ -59,20 +60,53 @@ public class InternalVehicleInfoServiceImpl implements VehicleInfoService {
public VehicleApiResponseVO getVehicleInfo(String vehicleNumber) {
log.info("[Internal Mode] 차량 정보 조회 시작 - 차량번호: {}", vehicleNumber);
+ // 차량번호만으로 BasicRequest 생성
+ BasicRequest basicRequest = new BasicRequest();
+ basicRequest.setVhrno(vehicleNumber);
+
+ // BasicRequest를 받는 오버로딩 메서드 호출
+ return getVehicleInfo(basicRequest);
+ }
+
+ @Override
+ public VehicleApiResponseVO getVehicleInfo(BasicRequest basicRequest) {
+ String vehicleNumber = basicRequest.getVhrno();
+ log.info("[Internal Mode] 차량 정보 조회 시작 - 차량번호: {}, 부과기준일: {}, 조회구분: {}",
+ vehicleNumber, basicRequest.getLevyStdde(), basicRequest.getInqireSeCode());
+
VehicleApiResponseVO response = new VehicleApiResponseVO();
response.setVhrno(vehicleNumber);
try {
// 1. 차량 기본정보 조회
- BasicResponse basicInfo = getBasicInfo(vehicleNumber);
+ // 중요 로직: BasicRequest 전체를 사용하여 조회 (RequestEnricher가 나머지 채움)
+ BasicResponse basicInfo = getBasicInfo(basicRequest);
response.setBasicInfo(basicInfo);
// 2. 자동차 등록원부 조회
- LedgerResponse ledgerInfo = getLedgerInfo(vehicleNumber);
+ // 중요 로직: 통합 조회 시에는 차량번호와 기본정보를 바탕으로 LedgerRequest 생성 (RequestEnricher가 나머지 채움)
+ LedgerRequest ledgerRequest = new LedgerRequest();
+ ledgerRequest.setVhrno(vehicleNumber);
+ ledgerRequest.setOnesInformationOpen("1"); //개인정보공개 {1:소유자공개, 2:비공개, 3:비공개(주민등록번호), 4:비공개(사용본거지)}
+
+ // basicInfo에서 민원인 정보 가져오기
+ if (basicInfo != null && basicInfo.getRecord() != null && !basicInfo.getRecord().isEmpty()) {
+ BasicResponse.Record record = basicInfo.getRecord().get(0);
+ ledgerRequest.setCpttrNm(record.getMberNm()); // 민원인성명
+ ledgerRequest.setCpttrIhidnum(record.getMberSeNo()); // 민원인주민번호
+ }
+
+ // 고정값 설정
+ ledgerRequest.setCpttrLegaldongCode(null); // 민원인법정동코드
+ ledgerRequest.setRouteSeCode("3"); // 경로구분코드
+ ledgerRequest.setDetailExpression("2"); // 내역표시 (최종내역)
+ ledgerRequest.setInqireSeCode("1"); // 조회구분코드 (열람)
+
+ LedgerResponse ledgerInfo = getLedgerInfo(ledgerRequest);
response.setLedgerInfo(ledgerInfo);
// 3. 결과 검증
- if (basicInfo != null && "00".equals(basicInfo.getCntcResultCode())) {
+ if (basicInfo != null && ApiConstant.CNTC_RESULT_CODE_SUCCESS.equals(basicInfo.getCntcResultCode())) {
response.setSuccess(true);
response.setMessage("조회 성공");
log.info("[Internal Mode] 차량번호 {} 조회 성공", vehicleNumber);
@@ -123,19 +157,16 @@ public class InternalVehicleInfoServiceImpl implements VehicleInfoService {
/**
* 차량 기본정보 조회 (내부 모듈 직접 호출)
+ * 중요 로직: 기본정보 조회는 BasicRequest 전체를 받아서 내부 서비스에 전달
*
- * @param vehicleNumber 차량번호
+ * @param request 기본정보 조회 요청 (차량번호, 부과기준일, 조회구분 등 포함)
* @return 차량 기본정보 응답
*/
@Override
- public BasicResponse getBasicInfo(String vehicleNumber) {
- log.debug("[Internal Mode] 차량 기본정보 조회 - 차량번호: {}", vehicleNumber);
+ public BasicResponse getBasicInfo(BasicRequest request) {
+ log.debug("[Internal Mode] 차량 기본정보 조회 - 차량번호: {}", request.getVhrno());
- // 요청 객체 생성 - 차량번호만 설정 (나머지는 RequestEnricher가 자동 설정)
- BasicRequest request = new BasicRequest();
- request.setVhrno(vehicleNumber);
-
- // Envelope로 감싸기
+ // Envelope로 감싸기 (요청 객체는 이미 모든 필수 파라미터를 포함)
Envelope requestEnvelope = new Envelope();
requestEnvelope.setData(Collections.singletonList(request));
@@ -151,30 +182,27 @@ public class InternalVehicleInfoServiceImpl implements VehicleInfoService {
return responseEntity.getBody().getData().get(0);
}
- log.warn("[Internal Mode] 차량 기본정보 조회 응답이 비어있음 - 차량번호: {}", vehicleNumber);
+ log.warn("[Internal Mode] 차량 기본정보 조회 응답이 비어있음 - 차량번호: {}", request.getVhrno());
return null;
} catch (Exception e) {
- log.error("[Internal Mode] 차량 기본정보 조회 실패 - 차량번호: {}", vehicleNumber, e);
+ log.error("[Internal Mode] 차량 기본정보 조회 실패 - 차량번호: {}", request.getVhrno(), e);
throw new RuntimeException("차량 기본정보 조회 실패: " + e.getMessage(), e);
}
}
/**
* 자동차 등록원부(갑) 조회 (내부 모듈 직접 호출)
+ * 중요 로직: 등록원부 조회는 LedgerRequest 전체를 받아서 내부 서비스에 전달
*
- * @param vehicleNumber 차량번호
+ * @param request 등록원부 조회 요청 (차량번호, 소유자정보, 조회구분 등 포함)
* @return 등록원부 정보 응답
*/
@Override
- public LedgerResponse getLedgerInfo(String vehicleNumber) {
- log.debug("[Internal Mode] 자동차 등록원부 조회 - 차량번호: {}", vehicleNumber);
-
- // 요청 객체 생성 - 차량번호만 설정 (나머지는 RequestEnricher가 자동 설정)
- LedgerRequest request = new LedgerRequest();
- request.setVhrno(vehicleNumber);
+ public LedgerResponse getLedgerInfo(LedgerRequest request) {
+ log.debug("[Internal Mode] 자동차 등록원부 조회 - 차량번호: {}", request.getVhrno());
- // Envelope로 감싸기
+ // Envelope로 감싸기 (요청 객체는 이미 모든 필수 파라미터를 포함)
Envelope requestEnvelope = new Envelope();
requestEnvelope.setData(Collections.singletonList(request));
@@ -190,11 +218,11 @@ public class InternalVehicleInfoServiceImpl implements VehicleInfoService {
return responseEntity.getBody().getData().get(0);
}
- log.warn("[Internal Mode] 자동차 등록원부 조회 응답이 비어있음 - 차량번호: {}", vehicleNumber);
+ log.warn("[Internal Mode] 자동차 등록원부 조회 응답이 비어있음 - 차량번호: {}", request.getVhrno());
return null;
} catch (Exception e) {
- log.error("[Internal Mode] 자동차 등록원부 조회 실패 - 차량번호: {}", vehicleNumber, e);
+ log.error("[Internal Mode] 자동차 등록원부 조회 실패 - 차량번호: {}", request.getVhrno(), e);
throw new RuntimeException("자동차 등록원부 조회 실패: " + e.getMessage(), e);
}
}
diff --git a/src/main/java/go/kr/project/api/model/request/BasicRequest.java b/src/main/java/go/kr/project/api/model/request/BasicRequest.java
index c4abdb3..48f80fb 100644
--- a/src/main/java/go/kr/project/api/model/request/BasicRequest.java
+++ b/src/main/java/go/kr/project/api/model/request/BasicRequest.java
@@ -47,7 +47,7 @@ public class BasicRequest {
@JsonProperty("LEVY_STDDE")
private String levyStdde;
- @Schema(description = "조회구분코드")
+ @Schema(description = "조회구분코드 {1:열람, 2:발급}")
@JsonProperty("INQIRE_SE_CODE")
private String inqireSeCode;
diff --git a/src/main/java/go/kr/project/api/model/request/LedgerRequest.java b/src/main/java/go/kr/project/api/model/request/LedgerRequest.java
index 09a7a23..639e185 100644
--- a/src/main/java/go/kr/project/api/model/request/LedgerRequest.java
+++ b/src/main/java/go/kr/project/api/model/request/LedgerRequest.java
@@ -47,9 +47,7 @@ public class LedgerRequest {
@JsonProperty("VHRNO")
private String vhrno;
- /*
- // 추가 항목 (명세 샘플 기준)
- @Schema(description = "개인정보공개")
+ @Schema(description = "개인정보공개 {1:소유자공개, 2:비공개, 3:비공개(주민등록번호), 4:비공개(사용본거지)}")
@JsonProperty("ONES_INFORMATION_OPEN")
private String onesInformationOpen;
@@ -66,17 +64,16 @@ public class LedgerRequest {
@JsonProperty("CPTTR_LEGALDONG_CODE")
private String cpttrLegaldongCode;
- @Schema(description = "경로구분코드")
+ @Schema(description = "경로구분코드 고정코드:3")
@JsonProperty("ROUTE_SE_CODE")
private String routeSeCode;
- @Schema(description = "내역표시")
+ @Schema(description = "내역표시 {1:전체내역, 2:최종내역}")
@JsonProperty("DETAIL_EXPRESSION")
private String detailExpression;
- @Schema(description = "조회구분코드")
+ @Schema(description = "조회구분코드 {1:열람, 2:발급}")
@JsonProperty("INQIRE_SE_CODE")
private String inqireSeCode;
- */
}
diff --git a/src/main/java/go/kr/project/api/service/VehicleInfoService.java b/src/main/java/go/kr/project/api/service/VehicleInfoService.java
index 30eeb27..0e6ea35 100644
--- a/src/main/java/go/kr/project/api/service/VehicleInfoService.java
+++ b/src/main/java/go/kr/project/api/service/VehicleInfoService.java
@@ -1,6 +1,8 @@
package go.kr.project.api.service;
import go.kr.project.api.model.VehicleApiResponseVO;
+import go.kr.project.api.model.request.BasicRequest;
+import go.kr.project.api.model.request.LedgerRequest;
import go.kr.project.api.model.response.BasicResponse;
import go.kr.project.api.model.response.LedgerResponse;
@@ -55,6 +57,17 @@ public interface VehicleInfoService {
*/
VehicleApiResponseVO getVehicleInfo(String vehicleNumber);
+ /**
+ * 단일 차량에 대한 정보 조회 (상세 파라미터 포함)
+ *
+ * 차량 기본정보와 등록원부 정보를 함께 조회합니다.
+ * 차량번호 외에 부과기준일, 조회구분, 차대번호 등 추가 파라미터를 포함하여 조회할 수 있습니다.
+ *
+ * @param basicRequest 기본정보 조회 요청 (차량번호, 부과기준일, 조회구분 등 포함)
+ * @return 차량 정보 응답 (기본정보 + 등록원부 정보)
+ */
+ VehicleApiResponseVO getVehicleInfo(BasicRequest basicRequest);
+
/**
* 여러 차량번호에 대한 정보를 일괄 조회
*
@@ -67,17 +80,19 @@ public interface VehicleInfoService {
/**
* 차량 기본정보만 조회 (단독)
+ * 중요: 차량번호 외에 부과기준일, 조회구분, 차대번호 등 필수 파라미터를 모두 포함한 BasicRequest 필요
*
- * @param vehicleNumber 차량번호
+ * @param request 기본정보 조회 요청 (차량번호, 부과기준일, 조회구분 등 포함)
* @return 기본정보 응답
*/
- BasicResponse getBasicInfo(String vehicleNumber);
+ BasicResponse getBasicInfo(BasicRequest request);
/**
* 자동차 등록원부(갑)만 조회 (단독)
+ * 중요: 차량번호 외에 소유자정보, 조회구분 등 필수 파라미터를 모두 포함한 LedgerRequest 필요
*
- * @param vehicleNumber 차량번호
+ * @param request 등록원부 조회 요청 (차량번호, 소유자정보, 조회구분 등 포함)
* @return 등록원부 응답
*/
- LedgerResponse getLedgerInfo(String vehicleNumber);
+ LedgerResponse getLedgerInfo(LedgerRequest request);
}
diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml
index 33a03e8..5599bf9 100644
--- a/src/main/resources/application-local.yml
+++ b/src/main/resources/application-local.yml
@@ -163,7 +163,7 @@ juso:
# ===== VMIS 통합 설정 (Local 환경) =====
vmis:
integration:
- mode: external # internal: 내부 VMIS 모듈 직접 호출, external: 외부 REST API 호출
+ mode: internal # internal: 내부 VMIS 모듈 직접 호출, external: 외부 REST API 호출
# RestTemplate 설정 (모드별 분기)
rest-template: