refactor: 차량 조회 요청 로직 개선 및 차량번호 기반 요청 객체 확장

- getVehicleInfo 오버로딩 추가: 차량번호 -> 요청 객체로 확장
- 기본/등록원부 요청 시 필수 파라미터 적용 로직 추가
  - 고정값 설정: 개인정보공개, 경로구분코드, 내역표시, 조회구분코드
- External/Internal 모드 구현체에서 통합 로직 적용 및 레코드 기반 LedgerRequest 구성
- Request, Response 객체의 필드 설명 보강 (Swagger)
- Controller, Service 전반적으로 요청 구조 통일
- application-local.yml 기본 모드 internal로 변경

 BUILD SUCCESSFUL
internalApi
박성영 1 month ago
parent a1687070fd
commit e71fca28a0

@ -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) =====
/**
* :
* <p> API .</p>
* :
* <p>EAI .</p>
*/
public static final String CNTC_RESULT_CODE_SUCCESS = "00";
/**
* :
* <p> API .</p>
*/
public static final String CNTC_RESULT_CODE_NO_DATA = "99";
public static final String CNTC_RESULT_CODE_SUCCESS = "MSG50000";
/**
* :

@ -53,7 +53,7 @@ public class VehicleInterfaceController {
/**
* + ()
* - Internal/External (VehicleInfoService )
* - Envelope<BasicRequest> VHRNO()
* - Envelope<BasicRequest> 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<Envelope<VehicleApiResponseVO>> info(
@org.springframework.web.bind.annotation.RequestBody Envelope<BasicRequest> 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<VehicleApiResponseVO> 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<Envelope<BasicResponse>> basic(
@org.springframework.web.bind.annotation.RequestBody Envelope<BasicRequest> 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<BasicResponse> 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<Envelope<LedgerResponse>> ledger(
@org.springframework.web.bind.annotation.RequestBody Envelope<LedgerRequest> 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<LedgerResponse> out = (ledger != null) ? new Envelope<>(ledger) : new Envelope<>(Collections.emptyList());
return ResponseEntity.ok(out);
}

@ -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);
}

@ -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<BasicRequest> 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<LedgerRequest> 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);
}
}

@ -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<VehicleApiResponseVO> getVehiclesInfo(List<String> 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);
}
}

@ -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);

@ -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<BasicRequest> requestEnvelope = new Envelope<BasicRequest>();
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<LedgerRequest> requestEnvelope = new Envelope<LedgerRequest>();
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);
}
}

@ -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;

@ -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;
*/
}

@ -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);
/**
* ( )
*
* <p> .</p>
* <p> , , .</p>
*
* @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);
}

@ -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:

Loading…
Cancel
Save