상품용, 이첩 TEST CASE 작성, 테스트 진행

internalApi
박성영 4 weeks ago
parent 1f442a9472
commit 732a977b67

@ -0,0 +1,17 @@
{
"data" : [ {
"record" : [ {
"LEVY_STDDE" : "20250925",
"INQIRE_SE_CODE" : "3",
"VHRNO" : "999구9999",
"VIN" : null
} ],
"INFO_SYS_ID" : "41-345",
"INFO_SYS_IP" : "105.19.10.135",
"SIGUNGU_CODE" : "41460",
"CHARGER_ID" : "",
"CHARGER_IP" : "",
"CNTC_INFO_CODE" : "AC1_FD11_01",
"CHARGER_NM" : ""
} ]
}

@ -0,0 +1,95 @@
"data": [
{
"CNTC_RESULT_DTLS": "정상",
"record": [
{
"OWNER_ADRES_FULL": "충청북도 제천시 내토로17길 9999999(영천동)",
"DSPLVL": "2487",
"MTRS_FOM_NM": "A25A",
"REGIST_INSTT_NM": "경기도 용인시",
"TRANSR_REGIST_DE": "20240805",
"USE_STRNGHLD_BULD_MAIN_NO": "13",
"STMD_CO": null,
"ERSR_REGIST_SE_CODE": null,
"VLNT_ERSR_PRVNTC_NTICE_DE": null,
"COLOR_NM": "회색",
"MBER_SE_CODE": "11",
"OWNER_BULD_SUB_NO": null,
"FRNT_VHRNO": null,
"PRPOS_SE_CODE": "2",
"VHCTY_SE_CODE": "3",
"PROCESS_IMPRTY_RESN_CODE": "00",
"USGSRHLD_ADRES_FULL": "충청북도 제천시 내토로17길 9999999(영천동)",
"CBD_BT": "1865",
"FRST_REGIST_DE": "20191211",
"ACQS_AMOUNT": "0/57090909",
"OWNER_LNBR": null,
"OWNER_LEGALDONG_CODE": "4315011000",
"CHANGE_DE": "20191211",
"OWNER_ADSTRD_CODE": "4315054700",
"REGIST_DE": "20240805",
"PRYE": "2019",
"MBER_SE_NO": "9001011111111",
"ERSR_REGIST_DE": null,
"USGSRHLD_UNDGRND_BULD_SE_CODE": "0",
"CAAG_ENDDE": null,
"SPCF_REGIST_STTUS_CODE": "110205",
"INSPT_VALID_PD_BGNDE": "20231211",
"CBD_HG": "1445",
"OWNER_ADRES_NM": "(영천동)",
"VHCTY_ASORT_CODE": "1",
"VHCTY_TY_CODE": "1",
"VHCTY_ASORT_NM": "승용",
"MXMM_LDG": "0",
"ORIGIN_SE_CODE": "2",
"USE_STRNGHLD_MNTN": null,
"USE_STRNGHLD_LNBR": null,
"ACQS_DE": "20240805",
"OWNER_ROAD_NM_CODE": "431504517146",
"TELNO": "01026350158",
"AFTR_VHRNO": null,
"FUEL_CNSMP_RT": "17.0",
"SEIZR_CO": null,
"VHCTY_SE_NM": "대형",
"NMPL_STNDRD_CODE": "2",
"CNM": "렉서스 ES300h",
"PROCESS_IMPRTY_RESN_DTLS": "운행차량",
"FOM_NM": "AXZH10L",
"TRVL_DSTNC": "48568",
"TKCAR_PSCAP_CO": "5",
"USE_STRNGHLD_ROAD_NM_CODE": "431504517146",
"ERSR_REGIST_SE_NM": null,
"MBER_NM": "홍길동",
"SPMNNO": "01020006800001318",
"USE_STRNGHLD_HO": null,
"CBD_LT": "4975",
"YBL_MD": "20190910",
"USE_STRNGHLD_BULD_SUB_NO": null,
"MRTG_CO": null,
"USE_STRNGHLD_LEGALDONG_CODE": "4315011000",
"NMPL_CSDY_AT": null,
"FRST_REGIST_RQRCNO": "41142019121000019826",
"FRST_MXMM_LDG": "0",
"OWNER_MNTN": null,
"OWNER_BULD_MAIN_NO": "13",
"VHCTY_TY_NM": "일반",
"OWNER_UNDGRND_BULD_SE_CODE": "0",
"REGIST_DETAIL_CODE": "100",
"ACQS_END_DE": null,
"USE_STRNGHLD_ADSTRD_CODE": "4315054700",
"INSPT_VALID_PD_ENDDE": "20251210",
"USE_FUEL_CODE": "l",
"USE_STRNGHLD_GRC_CODE": "4314",
"ELCTY_CMPND_FUEL_CNSMP_RT": "0.0",
"USE_STRNGHLD_ADRES_NM": "(영천동)",
"VHCLE_TOT_WT": "2040",
"VIN": "JTHB21B19K2066924",
"OWNER_HO": null,
"VHRNO": "999구9999",
"NMPL_CSDY_REMNR_DE": null
}
],
"CNTC_RESULT_CODE": "MSG50000"
}
]
}

@ -0,0 +1,19 @@
{
"data" : [ {
"VHRNO" : "300소4026",
"ONES_INFORMATION_OPEN" : "1",
"CPTTR_NM" : "(주)엑스아이티",
"CPTTR_IHIDNUM" : "1101112429672",
"CPTTR_LEGALDONG_CODE" : null,
"ROUTE_SE_CODE" : "3",
"DETAIL_EXPRESSION" : "2",
"INQIRE_SE_CODE" : "1",
"INFO_SYS_ID" : "41-345",
"INFO_SYS_IP" : "105.19.10.135",
"SIGUNGU_CODE" : "41460",
"CHARGER_ID" : "",
"CHARGER_IP" : "",
"CNTC_INFO_CODE" : "AC1_FE08_01",
"CHARGER_NM" : ""
} ]
}

@ -0,0 +1,123 @@
{
"data": [
{
"VHMNO": "KNAEU81AESK782982-01",
"MTRS_FOM_NM": "G4NH",
"PRCS_IMPRTY_RSN_CD": "00",
"FRST_TRNSFR_YMD": "2025-02-05",
"MRTG_CNT": "0",
"COLOR_NM": "검정",
"ERSR_REG_SE_CD": null,
"CHCK_VLD_PD_END_YMD": null,
"NOPLT_CSDY_YN": "N",
"USG_SE_NM": "자가용",
"VEAG_END_YMD": null,
"record": [
{
"CHG_YMD": "2025-02-11",
"VHMNO": "KNAEU81AESK782982-01",
"SPCABL_MTTR": "성명(상호) : 주식회사 엑스아이티 110111-2429672\n주소 : 서울특별시 강서구 *** ***-******, ****, *****, ********",
"CHG_TASK_SE_NM": "신규등록(신조차)",
"FLAG": null,
"SZR_RMV_DTL_SN": "1",
"MAIN_NO": "1-1",
"DTL_SN": "1",
"CHG_TASK_SE_CD": "01",
"SNO": null,
"APLY_RCPT_NO": "4102-202502-006998",
"LEDGER_INDIV_NO": "1",
"LEDGER_GROUP_NO": "1",
"HSHLDR_NM": "주식회사 엑스아이티",
"HSHLDR_IDECNO": "110111-2429672"
},
{
"CHG_YMD": "2025-06-19",
"VHMNO": "KNAEU81AESK782982-01",
"SPCABL_MTTR": "촉탁기관 : 평택시청 구분:압류\r압류관리번호:1118-20250619-000053\n\r압류내역 : 평택시청 주정차위반과태료[2024-01-300001] 테스트과-12345 \n\r촉탁일자 : 2025-06-19",
"CHG_TASK_SE_NM": "압류등록(압류)",
"FLAG": null,
"SZR_RMV_DTL_SN": "3",
"MAIN_NO": "(1-2)",
"DTL_SN": "2",
"CHG_TASK_SE_CD": "41",
"SNO": null,
"APLY_RCPT_NO": "1118-250619-000053",
"LEDGER_INDIV_NO": "1",
"LEDGER_GROUP_NO": "1",
"HSHLDR_NM": "",
"HSHLDR_IDECNO": ""
},
{
"CHG_YMD": "2025-06-19",
"VHMNO": "KNAEU81AESK782982-01",
"SPCABL_MTTR": "촉탁기관 : 평택시청 구분:압류\r압류관리번호:1118-20250619-000053\n\r압류명세 : 평택시청 주정차위반과태료[2024-01-300001] 테스트과-12345\n\r촉탁일자 : 2025-06-19",
"CHG_TASK_SE_NM": "압류해제(압류)",
"FLAG": null,
"SZR_RMV_DTL_SN": "4",
"MAIN_NO": null,
"DTL_SN": "3",
"CHG_TASK_SE_CD": "42",
"SNO": "(1-2)",
"APLY_RCPT_NO": "1118-202506-001237",
"LEDGER_INDIV_NO": "1",
"LEDGER_GROUP_NO": "1",
"HSHLDR_NM": "",
"HSHLDR_IDECNO": ""
}
],
"TAXXMPT_TRPR_SE_CD": "0",
"SPCABL_MTTR_CNT": "0",
"DRVNG_DSTNC": null,
"NOPLT_CSDY_AVTSMT_YMD": null,
"ERSR_REG_SE_NM": null,
"OWNR_ADDR": "서울특별시 강서구 *** ***-******",
"DRIV_SRGBTRY_IDNTF_NO": null,
"YRIDNW": "2025",
"SPMNNO_1": "A01",
"BSS_USE_PD_YMD": null,
"LINK_RSLT_CD": "MSG50000",
"SPMNNO_2": "1-00068-0291-1224",
"SZR_CNT": "0",
"CARMDL_ASORT_CD": "1",
"USGSRHLD_ADDR_1": "서울특별시 강서구 *** ***-******",
"USGSRHLD_ADDR_DTL_1": "****",
"RPRS_OWNR_TELNO": "025811807",
"NOPLT_SPCFCT_CD": "2",
"REG_DTL_CD": "100",
"ACQS_AMT": "20,883,709",
"FOM_NM": "SP56EH-P6-G3A",
"LINK_RSLT_DTL": "정상",
"REG_APLY_SE_NM": "신조차",
"OCTHT_ERSR_PRVNTC_AVTSMT_YMD": null,
"OWNR_ADDR_DTL": "****",
"LEDGER_INDIV_NO": "1",
"LEDGER_GROUP_NO": "1",
"ISSU_NO": null,
"INSP_VLD_PD_END_YMD": "2030-02-10",
"CARMDL_ASORT_NM": "승용 중형",
"CHCK_VLD_PD_BGNG_YMD": null,
"USGSRHLD_DONG_NM": "가양1동",
"REG_DTL_NM": "일반소유용",
"NOPLT_SPCFCT_NM": "긴번호판",
"FBCTN_YMD": "2025-02-04",
"RPRSV_OWNR_IDECNO": "110111-2429672",
"FRST_REG_YMD": "2025-02-11",
"RPRS_OWNR_NM": "주식회사 엑스아이티",
"PRCS_IMPRTY_RSN_DTLS": "운행차량",
"FRST_REG_APLY_RCPT_NO": null,
"PRVNTC_CNT": "0",
"RPRS_OWNR_MBR_SE_CD": "13",
"TAXXMPT_APLCN_SE_CD": "미적용",
"ERSR_REG_YMD": null,
"COLOR_CD": "01",
"STRCT_CHG_CNT": null,
"INDVDL_BZMN_YN": null,
"VIN": "KNAEU81AESK782982",
"USG_SE_CD": "2",
"XPORT_FLFL_YN_DCLR_YMD": null,
"VHRNO": "300소4026",
"INSP_VLD_PD_BGNG_YMD": "2025-02-11",
"ATMB_NM": "셀토스"
}
]
}

@ -39,7 +39,7 @@
<li>
<select id="searchCntcResultCode" name="cntcResultCode" class="input" style="width: 120px;">
<option value="">전체</option>
<option value="00">성공</option>
<option value="MSG50000">성공</option>
<option value="99">정보없음</option>
<option value="ERROR">에러</option>
</select>

@ -0,0 +1,191 @@
package go.kr.project.test;
import com.fasterxml.jackson.databind.ObjectMapper;
import go.kr.project.api.model.VehicleApiResponseVO;
import go.kr.project.carInspectionPenalty.registration.mapper.CarFfnlgTrgtMapper;
import go.kr.project.carInspectionPenalty.registration.model.CarFfnlgTrgtVO;
import go.kr.project.carInspectionPenalty.registration.service.ComparisonService;
import go.kr.project.carInspectionPenalty.registration.service.impl.ComparisonServiceImpl;
import go.kr.project.system.user.mapper.UserMapper;
import go.kr.project.system.user.model.SystemUserVO;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.springframework.core.io.ClassPathResource;
import java.io.IOException;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.lenient;
import static org.mockito.Mockito.when;
/**
* ComparisonService
*
* <p>JSON API .</p>
*/
@ExtendWith(MockitoExtension.class)
@DisplayName("과태료 대상 비교 서비스 테스트")
class ComparisonServiceTest {
@Mock
private CarFfnlgTrgtMapper carFfnlgTrgtMapper;
@Mock
private UserMapper userMapper;
private ComparisonService comparisonService;
private ObjectMapper objectMapper;
private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyyMMdd");
@BeforeEach
void setUp() {
comparisonService = new ComparisonServiceImpl(carFfnlgTrgtMapper, userMapper);
objectMapper = new ObjectMapper();
// 공통 Mock 설정: DB 업데이트는 항상 성공 (lenient 사용 - 모든 테스트에서 사용하지 않을 수 있음)
lenient().when(carFfnlgTrgtMapper.update(any(CarFfnlgTrgtVO.class))).thenReturn(1);
}
@Test
@DisplayName("상품용 테스트 - 소유자명에 '상품용' 포함")
void testProductUse() throws IOException {
// Given: JSON 파일에서 테스트 데이터 로드
VehicleApiResponseVO apiResponse = loadJsonFile("test-data/product-use-case.json");
CarFfnlgTrgtVO existingData = createExistingData("12가3456");
// When: 비교 로직 실행
String result = comparisonService.executeComparison(existingData, apiResponse, "USER001");
// Then: 상품용(02)으로 처리되어야 함
assertEquals("02", result, "상품용으로 처리되어야 합니다");
assertEquals("02", existingData.getTaskPrcsSttsCd(), "업무 처리 상태 코드가 02여야 합니다");
assertEquals(LocalDate.now().format(DATE_FORMATTER), existingData.getTaskPrcsYmd(),
"처리 일자가 오늘 날짜여야 합니다");
assertEquals("상품용", existingData.getCarBscMttrInqFlnm(),
"자동차 기본 사항 조회 성명이 저장되어야 합니다");
assertNull(existingData.getCarBscMttrInqSggCd(), "이첩 관련 필드는 null이어야 합니다");
assertNull(existingData.getCarBscMttrInqSggNm(), "이첩 관련 필드는 null이어야 합니다");
System.out.println("✅ 상품용 테스트 통과!");
System.out.println(" - 차량번호: " + existingData.getVhclno());
System.out.println(" - 처리 상태: " + existingData.getTaskPrcsSttsCd() + " (02=상품용)");
System.out.println(" - 소유자명: " + existingData.getCarBscMttrInqFlnm());
}
@Test
@DisplayName("이첩 테스트 - 법정동코드 불일치")
void testTransfer() throws IOException {
// Given: JSON 파일에서 테스트 데이터 로드
VehicleApiResponseVO apiResponse = loadJsonFile("test-data/transfer-case.json");
CarFfnlgTrgtVO existingData = createExistingData("34나5678");
// Mock 설정: 사용자 조직코드 (법정동코드와 다름)
SystemUserVO userInfo = new SystemUserVO();
userInfo.setUserId("USER001");
userInfo.setOrgCd("1100"); // 서울(1100) - API의 경기(4100)와 다름
when(userMapper.selectUser("USER001")).thenReturn(userInfo);
// Mock 설정: 시군구명 조회
when(carFfnlgTrgtMapper.selectSggNmBySggCd("41000")).thenReturn("경기도");
// When: 비교 로직 실행
String result = comparisonService.executeComparison(existingData, apiResponse, "USER001");
// Then: 이첩(03)으로 처리되어야 함
assertEquals("03", result, "이첩으로 처리되어야 합니다");
assertEquals("03", existingData.getTaskPrcsSttsCd(), "업무 처리 상태 코드가 03이어야 합니다");
assertEquals(LocalDate.now().format(DATE_FORMATTER), existingData.getTaskPrcsYmd(),
"처리 일자가 오늘 날짜여야 합니다");
assertNull(existingData.getCarBscMttrInqFlnm(), "상품용 관련 필드는 null이어야 합니다");
assertEquals("41000", existingData.getCarBscMttrInqSggCd(), "시군구 코드가 저장되어야 합니다");
assertEquals("경기도", existingData.getCarBscMttrInqSggNm(), "시군구명이 저장되어야 합니다");
System.out.println("✅ 이첩 테스트 통과!");
System.out.println(" - 차량번호: " + existingData.getVhclno());
System.out.println(" - 처리 상태: " + existingData.getTaskPrcsSttsCd() + " (03=이첩)");
System.out.println(" - 시군구: " + existingData.getCarBscMttrInqSggNm() + "(" + existingData.getCarBscMttrInqSggCd() + ")");
System.out.println(" - 사유: 법정동코드 불일치 (API:4100, 조직:1100)");
}
@Test
@DisplayName("정상 처리 테스트 - 모든 비교 조건에 해당하지 않음")
void testNormal() throws IOException {
// Given: JSON 파일에서 테스트 데이터 로드
VehicleApiResponseVO apiResponse = loadJsonFile("test-data/normal-case.json");
CarFfnlgTrgtVO existingData = createExistingData("56다7890");
// Mock 설정: 사용자 조직코드 (법정동코드와 같음)
SystemUserVO userInfo = new SystemUserVO();
userInfo.setUserId("USER001");
userInfo.setOrgCd("1100"); // 서울(1100) - API도 서울(1100)로 일치
when(userMapper.selectUser("USER001")).thenReturn(userInfo);
// When: 비교 로직 실행
String result = comparisonService.executeComparison(existingData, apiResponse, "USER001");
// Then: null 반환 (비교 조건에 해당하지 않음)
assertNull(result, "비교 조건에 해당하지 않으면 null을 반환해야 합니다");
System.out.println("✅ 정상 처리 테스트 통과!");
System.out.println(" - 차량번호: " + existingData.getVhclno());
System.out.println(" - 처리 결과: 정상 (비교 조건 미해당)");
System.out.println(" - 소유자명에 '상품용' 없음");
System.out.println(" - 법정동코드 일치 (API:1100, 조직:1100)");
}
@Test
@DisplayName("순서 테스트 - 상품용이 먼저 체크되어야 함")
void testPriority() throws IOException {
// Given: 상품용이면서 법정동코드도 불일치한 케이스
VehicleApiResponseVO apiResponse = loadJsonFile("test-data/product-use-case.json");
CarFfnlgTrgtVO existingData = createExistingData("12가3456");
// Mock 설정: 사용자 조직코드를 다르게 설정 (이첩 조건도 만족)
// 주의: 상품용이 먼저 체크되므로 이 stub은 실제로 사용되지 않을 수 있음 (lenient 사용)
SystemUserVO userInfo = new SystemUserVO();
userInfo.setUserId("USER001");
userInfo.setOrgCd("4100"); // API는 1100이므로 법정동코드 불일치
lenient().when(userMapper.selectUser("USER001")).thenReturn(userInfo);
// When: 비교 로직 실행
String result = comparisonService.executeComparison(existingData, apiResponse, "USER001");
// Then: 상품용(02)으로 처리되어야 함 (상품용이 우선순위 높음)
assertEquals("02", result, "상품용과 이첩 조건을 모두 만족해도 상품용이 우선입니다");
assertEquals("02", existingData.getTaskPrcsSttsCd());
System.out.println("✅ 순서 테스트 통과!");
System.out.println(" - 상품용과 이첩 조건 모두 만족");
System.out.println(" - 결과: " + existingData.getTaskPrcsSttsCd() + " (상품용 우선)");
}
/**
* JSON VehicleApiResponseVO
*/
private VehicleApiResponseVO loadJsonFile(String filePath) throws IOException {
ClassPathResource resource = new ClassPathResource(filePath);
return objectMapper.readValue(resource.getInputStream(), VehicleApiResponseVO.class);
}
/**
*
*/
private CarFfnlgTrgtVO createExistingData(String vhclno) {
CarFfnlgTrgtVO vo = new CarFfnlgTrgtVO();
vo.setCarFfnlgTrgtId("CFT00000000000000001");
vo.setVhclno(vhclno);
vo.setOwnrNm("테스트");
vo.setTaskPrcsSttsCd("01"); // 접수 상태
vo.setRcptYmd(LocalDate.now().format(DATE_FORMATTER));
return vo;
}
}

@ -0,0 +1,35 @@
{
"vhrno": "56다7890",
"success": true,
"message": "조회 성공",
"basicInfo": {
"CNTC_RESULT_CODE": "MSG50000",
"CNTC_RESULT_DTLS": "정상",
"record": [
{
"VHRNO": "56다7890",
"MBER_NM": "김철수",
"MBER_SE_CODE": "1",
"MBER_SE_NO": "1112223334445",
"USE_STRNGHLD_LEGALDONG_CODE": "1100000000",
"USE_STRNGHLD_ADRES_NM": "서울특별시 강남구 테헤란로 123",
"OWNER_ADRES_NM": "서울특별시 강남구 테헤란로 123",
"CNM": "아반떼",
"VHCTY_ASORT_NM": "승용차",
"VHCTY_TY_NM": "소형",
"VHCTY_SE_NM": "일반형",
"PRYE": "2021",
"REGIST_DE": "20210701",
"FRST_REGIST_DE": "20210701",
"INSPT_VALID_PD_BGNDE": "20230701",
"INSPT_VALID_PD_ENDDE": "20250701",
"ERSR_REGIST_SE_CODE": "",
"ERSR_REGIST_DE": ""
}
]
},
"ledgerInfo": {
"VHRNO": "56다7890",
"VIN": "KMHZZ00ZZZZ222222"
}
}

@ -0,0 +1,35 @@
{
"vhrno": "12가3456",
"success": true,
"message": "조회 성공",
"basicInfo": {
"CNTC_RESULT_CODE": "MSG50000",
"CNTC_RESULT_DTLS": "정상",
"record": [
{
"VHRNO": "12가3456",
"MBER_NM": "상품용",
"MBER_SE_CODE": "1",
"MBER_SE_NO": "1234567890123",
"USE_STRNGHLD_LEGALDONG_CODE": "1100000000",
"USE_STRNGHLD_ADRES_NM": "서울특별시 중구 세종대로 110",
"OWNER_ADRES_NM": "서울특별시 중구 세종대로 110",
"CNM": "그랜저",
"VHCTY_ASORT_NM": "승용차",
"VHCTY_TY_NM": "소형",
"VHCTY_SE_NM": "일반형",
"PRYE": "2020",
"REGIST_DE": "20200101",
"FRST_REGIST_DE": "20200101",
"INSPT_VALID_PD_BGNDE": "20230101",
"INSPT_VALID_PD_ENDDE": "20250101",
"ERSR_REGIST_SE_CODE": "",
"ERSR_REGIST_DE": ""
}
]
},
"ledgerInfo": {
"VHRNO": "12가3456",
"VIN": "KMHXX00XXXX000000"
}
}

@ -0,0 +1,35 @@
{
"vhrno": "34나5678",
"success": true,
"message": "조회 성공",
"basicInfo": {
"CNTC_RESULT_CODE": "MSG50000",
"CNTC_RESULT_DTLS": "정상",
"record": [
{
"VHRNO": "34나5678",
"MBER_NM": "홍길동",
"MBER_SE_CODE": "1",
"MBER_SE_NO": "9876543210987",
"USE_STRNGHLD_LEGALDONG_CODE": "4100000000",
"USE_STRNGHLD_ADRES_NM": "경기도 수원시 팔달구 효원로 1",
"OWNER_ADRES_NM": "경기도 수원시 팔달구 효원로 1",
"CNM": "소나타",
"VHCTY_ASORT_NM": "승용차",
"VHCTY_TY_NM": "중형",
"VHCTY_SE_NM": "일반형",
"PRYE": "2019",
"REGIST_DE": "20190315",
"FRST_REGIST_DE": "20190315",
"INSPT_VALID_PD_BGNDE": "20220315",
"INSPT_VALID_PD_ENDDE": "20240315",
"ERSR_REGIST_SE_CODE": "",
"ERSR_REGIST_DE": ""
}
]
},
"ledgerInfo": {
"VHRNO": "34나5678",
"VIN": "KMHYY00YYYY111111"
}
}
Loading…
Cancel
Save