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: