feat: old, new 구분하여 전체 재개발

noneDB
박성영 4 weeks ago
parent 785528218a
commit f4064f716c

@ -1,474 +0,0 @@
# 자동차 정보 조회 API RestTemplate 구조
## 1. 자동차기본사항조회 API
### 1.1 Request (BasicRequest)
**엔드포인트**: `POST /api/v1/vehicles/basic`
```json
{
"data": [
{
"INFO_SYS_ID": "41-345", // 정보시스템ID (자동설정)
"INFO_SYS_IP": "105.19.10.135", // 정보시스템IP (자동설정)
"SIGUNGU_CODE": "41460", // 시군구코드 (자동설정)
"CNTC_INFO_CODE": "AC1_FD11_01", // 연계정보코드 (자동설정)
"CHARGER_ID": "", // 담당자ID (자동설정)
"CHARGER_IP": "", // 담당자IP (자동설정)
"CHARGER_NM": "", // 담당자명 (자동설정)
"LEVY_STDDE": "20250101", // 부과기준일
"INQIRE_SE_CODE": "3", // 조회구분코드 (자동설정: VHRNO→"3", VIN→"2")
"VHRNO": "12가3456", // 자동차등록번호
"VIN": null // 차대번호
}
]
}
```
#### 필드 설명
| 필드명 | 타입 | 설명 | 비고 |
|--------|------|------|------|
| INFO_SYS_ID | String | 정보시스템ID | 자동설정 |
| INFO_SYS_IP | String | 정보시스템IP | 자동설정 |
| SIGUNGU_CODE | String | 시군구코드 | 자동설정 |
| CNTC_INFO_CODE | String | 연계정보코드 | 자동설정 |
| CHARGER_ID | String | 담당자ID | 자동설정 |
| CHARGER_IP | String | 담당자IP | 자동설정 |
| CHARGER_NM | String | 담당자명(사용자) | 자동설정 |
| LEVY_STDDE | String | 부과기준일 (YYYYMMDD) | 사용자 입력 |
| INQIRE_SE_CODE | String | 조회구분코드 | 자동설정 (VHRNO→"3", VIN→"2") |
| VHRNO | String | 자동차등록번호 | 사용자 입력 |
| VIN | String | 차대번호 | 사용자 입력 |
---
### 1.2 Response (BasicResponse)
```json
{
"data": [
{
"CNTC_RESULT_CODE": "0",
"CNTC_RESULT_DTLS": "정상",
"record": [
{
// 차량 기본 정보
"VHRNO": "12가3456",
"VIN": "KMHAB812345678901",
"CNM": "제네시스",
"FOM_NM": "GV80",
"COLOR_NM": "검은색",
"FRST_REGIST_DE": "20200115",
"REGIST_DE": "20200115",
"CHANGE_DE": "20200115",
"PRYE": "2020",
"YBL_MD": "202001",
// 차종 정보
"VHCTY_ASORT_CODE": "01",
"VHCTY_ASORT_NM": "승용",
"VHCTY_TY_CODE": "01",
"VHCTY_TY_NM": "일반",
"VHCTY_SE_CODE": "01",
"VHCTY_SE_NM": "대형",
"PRPOS_SE_CODE": "01",
// 차량 제원
"DSPLVL": "2987",
"VHCLE_TOT_WT": "2500",
"MXMM_LDG": "0",
"CBD_LT": "4945",
"CBD_BT": "1975",
"CBD_HG": "1715",
"FRST_MXMM_LDG": "0",
"FUEL_CNSMP_RT": "9.5",
"ELCTY_CMPND_FUEL_CNSMP_RT": "",
"USE_FUEL_CODE": "D",
"MTRS_FOM_NM": "D3.0",
// 소유자 정보
"MBER_SE_CODE": "1",
"MBER_NM": "홍길동",
"MBER_SE_NO": "8801011234567",
"TELNO": "010-1234-5678",
"OWNER_LEGALDONG_CODE": "1111011700",
"OWNER_ADSTRD_CODE": "1111011700",
"OWNER_MNTN": "0",
"OWNER_LNBR": "123",
"OWNER_HO": "1",
"OWNER_ADRES_NM": "서울특별시 종로구",
"OWNER_ROAD_NM_CODE": "1111011700",
"OWNER_UNDGRND_BULD_SE_CODE": "0",
"OWNER_BULD_MAIN_NO": "123",
"OWNER_BULD_SUB_NO": "0",
"OWNER_ADRES_FULL": "서울특별시 종로구 세종대로 123",
// 사용자 정보 (사용본거지)
"USE_STRNGHLD_LEGALDONG_CODE": "1111011700",
"USE_STRNGHLD_ADSTRD_CODE": "1111011700",
"USE_STRNGHLD_MNTN": "0",
"USE_STRNGHLD_LNBR": "123",
"USE_STRNGHLD_HO": "1",
"USE_STRNGHLD_ADRES_NM": "서울특별시 종로구",
"USE_STRNGHLD_ROAD_NM_CODE": "1111011700",
"USGSRHLD_UNDGRND_BULD_SE_CODE": "0",
"USE_STRNGHLD_BULD_MAIN_NO": "123",
"USE_STRNGHLD_BULD_SUB_NO": "0",
"USGSRHLD_ADRES_FULL": "서울특별시 종로구 세종대로 123",
"USE_STRNGHLD_GRC_CODE": "",
// 등록 상태
"REGIST_DETAIL_CODE": "11",
"ERSR_REGIST_SE_CODE": "",
"ERSR_REGIST_SE_NM": "",
"ERSR_REGIST_DE": "",
"SPCF_REGIST_STTUS_CODE": "",
"FRNT_VHRNO": "",
"AFTR_VHRNO": "",
// 검사 정보
"INSPT_VALID_PD_BGNDE": "20240115",
"INSPT_VALID_PD_ENDDE": "20260114",
// 취득/압류 정보
"ACQS_DE": "20200115",
"ACQS_END_DE": "",
"ACQS_AMOUNT": "85000000",
"MRTG_CO": "0",
"SEIZR_CO": "0",
"STMD_CO": "0",
// 기타
"CAAG_ENDDE": "",
"TRANSR_REGIST_DE": "",
"ORIGIN_SE_CODE": "1",
"NMPL_STNDRD_CODE": "01",
"NMPL_CSDY_AT": "N",
"NMPL_CSDY_REMNR_DE": "",
"TKCAR_PSCAP_CO": "5",
"SPMNNO": "",
"TRVL_DSTNC": "45000",
"FRST_REGIST_RQRCNO": "",
"VLNT_ERSR_PRVNTC_NTICE_DE": "",
"REGIST_INSTT_NM": "서울특별시청",
"PROCESS_IMPRTY_RESN_CODE": "",
"PROCESS_IMPRTY_RESN_DTLS": ""
}
]
}
]
}
```
#### Response 필드 설명
| 구분 | 필드명 | 타입 | 설명 |
|------|--------|------|------|
| 기본 | CNTC_RESULT_CODE | String | 연계결과코드 |
| 기본 | CNTC_RESULT_DTLS | String | 연계결과상세 |
| 차량기본 | VHRNO | String | 자동차등록번호 |
| 차량기본 | VIN | String | 차대번호 |
| 차량기본 | CNM | String | 차명 |
| 차량기본 | FOM_NM | String | 형식명 |
| 차량기본 | COLOR_NM | String | 색상명 |
| 차량기본 | FRST_REGIST_DE | String | 최초등록일자 |
| 차량기본 | PRYE | String | 연식 |
| 차종 | VHCTY_ASORT_CODE | String | 차종구분코드 |
| 차종 | VHCTY_ASORT_NM | String | 차종구분명 |
| 차종 | VHCTY_TY_CODE | String | 차종유형코드 |
| 차종 | VHCTY_TY_NM | String | 차종유형명 |
| 차종 | VHCTY_SE_CODE | String | 차종세분류코드 |
| 차종 | VHCTY_SE_NM | String | 차종세분류명 |
| 제원 | DSPLVL | String | 배기량(cc) |
| 제원 | VHCLE_TOT_WT | String | 차량총중량(kg) |
| 제원 | MXMM_LDG | String | 최대적재량(kg) |
| 제원 | CBD_LT | String | 길이(mm) |
| 제원 | CBD_BT | String | 너비(mm) |
| 제원 | CBD_HG | String | 높이(mm) |
| 제원 | FUEL_CNSMP_RT | String | 연비(km/l) |
| 제원 | USE_FUEL_CODE | String | 사용연료코드 |
| 소유자 | MBER_SE_CODE | String | 회원구분코드 |
| 소유자 | MBER_NM | String | 회원명 |
| 소유자 | MBER_SE_NO | String | 회원구분번호 |
| 소유자 | TELNO | String | 전화번호 |
| 소유자 | OWNER_ADRES_FULL | String | 소유자주소전체 |
| 사용본거지 | USGSRHLD_ADRES_FULL | String | 사용자주소전체 |
| 검사 | INSPT_VALID_PD_BGNDE | String | 검사유효기간시작 |
| 검사 | INSPT_VALID_PD_ENDDE | String | 검사유효기간종료 |
| 권리 | MRTG_CO | String | 저당권수 |
| 권리 | SEIZR_CO | String | 압류수 |
| 권리 | STMD_CO | String | 체당금수 |
| 취득 | ACQS_AMOUNT | String | 취득가액 |
---
## 2. 자동차등록원부(갑)조회 API
### 2.1 Request (LedgerRequest)
**엔드포인트**: `POST /api/v1/vehicles/ledger`
```json
{
"data": [
{
"INFO_SYS_ID": "41-345", // 정보시스템ID (자동설정)
"INFO_SYS_IP": "105.19.10.135", // 정보시스템IP (자동설정)
"SIGUNGU_CODE": "41460", // 시군구코드 (자동설정)
"CNTC_INFO_CODE": "AC1_FD11_02", // 연계정보코드 (자동설정)
"CHARGER_ID": "", // 담당자ID (자동설정)
"CHARGER_IP": "", // 담당자IP (자동설정)
"CHARGER_NM": "", // 담당자명 (자동설정)
"VHRNO": "12가3456", // 자동차등록번호
"ONES_INFORMATION_OPEN": "1", // 개인정보공개 (자동설정: "1")
"CPTTR_NM": "홍길동", // 민원인성명
"CPTTR_IHIDNUM": "8801011234567", // 민원인주민번호
"CPTTR_LEGALDONG_CODE": "1111011700", // 민원인법정동코드
"ROUTE_SE_CODE": "3", // 경로구분코드 (자동설정: "3")
"DETAIL_EXPRESSION": "1", // 내역표시 (자동설정: "1")
"INQIRE_SE_CODE": "1" // 조회구분코드 (자동설정: "1")
}
]
}
```
#### 필드 설명
| 필드명 | 타입 | 설명 | 비고 |
|--------|------|------|------|
| INFO_SYS_ID | String | 정보시스템ID | 자동설정 |
| INFO_SYS_IP | String | 정보시스템IP | 자동설정 |
| SIGUNGU_CODE | String | 시군구코드 | 자동설정 |
| CNTC_INFO_CODE | String | 연계정보코드 | 자동설정 |
| CHARGER_ID | String | 담당자ID | 자동설정 |
| CHARGER_IP | String | 담당자IP | 자동설정 |
| CHARGER_NM | String | 담당자명(사용자) | 자동설정 |
| VHRNO | String | 자동차등록번호 | 사용자 입력 |
| ONES_INFORMATION_OPEN | String | 개인정보공개 | 자동설정 (1:공개, 2:비공개) |
| CPTTR_NM | String | 민원인성명 | 사용자 입력 |
| CPTTR_IHIDNUM | String | 민원인주민번호 (13자리) | 사용자 입력 |
| CPTTR_LEGALDONG_CODE | String | 민원인법정동코드 | 사용자 입력 |
| ROUTE_SE_CODE | String | 경로구분코드 | 자동설정 ("3" 고정) |
| DETAIL_EXPRESSION | String | 내역표시 | 자동설정 (1:전체, 2:최종) |
| INQIRE_SE_CODE | String | 조회구분코드 | 자동설정 ("1" 열람) |
---
### 2.2 Response (LedgerResponse)
```json
{
"data": [
{
// 연계 결과
"CNTC_RESULT_CODE": "0",
"CNTC_RESULT_DTLS": "정상",
// 원부 기본 정보
"LEDGER_GROUP_NO": "0000000001",
"LEDGER_INDVDLZ_NO": "0000000001",
"VHMNO": "A123456789",
"VHRNO": "12가3456",
"VIN": "KMHAB812345678901",
// 차종 정보
"VHCTY_ASORT_CODE": "01",
"VHCTY_ASORT_NM": "승용",
"CNM": "제네시스",
"COLOR_CODE": "01",
"COLOR_NM": "검은색",
// 등록 정보
"NMPL_STNDRD_CODE": "01",
"NMPL_STNDRD_NM": "일반",
"PRPOS_SE_CODE": "01",
"PRPOS_SE_NM": "자가용",
"MTRS_FOM_NM": "D3.0",
"FOM_NM": "GV80",
"ACQS_AMOUNT": "85000000",
"REGIST_DETAIL_CODE": "11",
"REGIST_DETAIL_NM": "신규등록",
"FRST_REGIST_DE": "20200115",
"CAAG_ENDDE": "",
"PRYE": "2020",
// 표본/운행 정보
"SPMNNO1": "",
"SPMNNO2": "",
"YBL_MD": "202001",
"TRVL_DSTNC": "45000",
// 검사/점검 정보
"INSPT_VALID_PD_BGNDE": "20240115",
"INSPT_VALID_PD_ENDDE": "20260114",
"CHCK_VALID_PD_BGNDE": "",
"CHCK_VALID_PD_ENDDE": "",
"REGIST_REQST_SE_NM": "",
"FRST_REGIST_RQRCNO": "",
// 번호판/말소 정보
"NMPL_CSDY_REMNR_DE": "",
"NMPL_CSDY_AT": "N",
"BSS_USE_PD": "",
"OCTHT_ERSR_PRVNTC_NTICE_DE": "",
"ERSR_REGIST_DE": "",
"ERSR_REGIST_SE_CODE": "",
"ERSR_REGIST_SE_NM": "",
// 권리 정보
"MRTGCNT": "0",
"VHCLECNT": "0",
"STMDCNT": "0",
// 주소 정보
"ADRES1": "서울특별시 종로구",
"ADRES_NM1": "세종대로 123",
"ADRES": "서울특별시 종로구",
"ADRES_NM": "세종대로 123",
// 소유자 정보
"INDVDL_BSNM_AT": "N",
"TELNO": "010-1234-5678",
"MBER_NM": "홍길동",
"MBER_SE_CODE": "1",
"MBER_SE_NO": "8801011234567",
// 세제/기타
"TAXXMPT_TRGTER_SE_CODE": "",
"TAXXMPT_TRGTER_SE_CODE_NM": "",
"CNT_MATTER": "",
"EMD_NM": "종로동",
"PRVNTCCNT": "0",
"XPORT_FLFL_AT_STTEMNT_DE": "",
"PARTN_RQRCNO": "",
// 변경 내역
"record": [
{
"MAINCHK": "Y",
"CHANGE_JOB_SE_CODE": "01",
"MAINNO": "1",
"SUBNO": "0",
"DTLS": "신규등록",
"RQRCNO": "20200115001",
"VHMNO": "A123456789",
"LEDGER_GROUP_NO": "0000000001",
"LEDGER_INDVDLZ_NO": "0000000001",
"GUBUN_NM": "등록",
"CHANGE_DE": "20200115",
"DETAIL_SN": "1",
"FLAG": ""
}
]
}
]
}
```
#### Response 필드 설명
| 구분 | 필드명 | 타입 | 설명 |
|------|--------|------|------|
| 기본 | CNTC_RESULT_CODE | String | 연계결과코드 |
| 기본 | CNTC_RESULT_DTLS | String | 연계결과상세 |
| 원부 | LEDGER_GROUP_NO | String | 원부그룹번호 |
| 원부 | LEDGER_INDVDLZ_NO | String | 원부개별화번호 |
| 원부 | VHMNO | String | 자동차검사번호 |
| 차량 | VHRNO | String | 자동차등록번호 |
| 차량 | VIN | String | 차대번호 |
| 차량 | CNM | String | 차명 |
| 차량 | FOM_NM | String | 형식명 |
| 차종 | VHCTY_ASORT_CODE | String | 차종구분코드 |
| 차종 | VHCTY_ASORT_NM | String | 차종구분명 |
| 등록 | FRST_REGIST_DE | String | 최초등록일자 |
| 등록 | REGIST_DETAIL_CODE | String | 등록상세코드 |
| 등록 | REGIST_DETAIL_NM | String | 등록상세명 |
| 등록 | PRPOS_SE_CODE | String | 용도구분코드 |
| 등록 | PRPOS_SE_NM | String | 용도구분명 |
| 검사 | INSPT_VALID_PD_BGNDE | String | 검사유효기간시작 |
| 검사 | INSPT_VALID_PD_ENDDE | String | 검사유효기간종료 |
| 권리 | MRTGCNT | String | 저당권수 |
| 권리 | VHCLECNT | String | 압류수 |
| 권리 | STMDCNT | String | 체당금수 |
| 말소 | ERSR_REGIST_DE | String | 말소등록일자 |
| 말소 | ERSR_REGIST_SE_CODE | String | 말소등록구분코드 |
| 말소 | ERSR_REGIST_SE_NM | String | 말소등록구분명 |
| 소유자 | MBER_NM | String | 회원명 |
| 소유자 | MBER_SE_CODE | String | 회원구분코드 |
| 소유자 | MBER_SE_NO | String | 회원구분번호 |
| 소유자 | TELNO | String | 전화번호 |
| 주소 | ADRES | String | 주소 |
| 주소 | ADRES_NM | String | 주소명 |
| 취득 | ACQS_AMOUNT | String | 취득가액 |
#### Record (변경내역) 필드
| 필드명 | 타입 | 설명 |
|--------|------|------|
| MAINCHK | String | 주체크 |
| CHANGE_JOB_SE_CODE | String | 변경업무구분코드 |
| MAINNO | String | 주번호 |
| SUBNO | String | 부번호 |
| DTLS | String | 상세 |
| RQRCNO | String | 요청번호 |
| GUBUN_NM | String | 구분명 |
| CHANGE_DE | String | 변경일자 |
| DETAIL_SN | String | 상세일련번호 |
---
## 3. 공통 구조
### 3.1 Envelope (요청/응답 래퍼)
```json
{
"data": [ ... ]
}
```
모든 요청과 응답은 `data` 배열로 감싸져 있습니다.
### 3.2 HTTP Headers
| 헤더명 | 설명 | 예시 |
|--------|------|------|
| Content-Type | 콘텐츠 타입 | application/json;charset=UTF-8 |
| Accept | 응답 타입 | application/json |
| gpki_yn | GPKI 암호화 여부 | Y/N |
| tx_id | 트랜잭션 ID | UUID |
| cert_server_id | 인증서 서버 ID | 설정값 |
| api_key | API 키 | 설정값 |
| cvmis_apikey | CVMIS API 키 | 설정값 |
### 3.3 자동설정 필드 요약
| API | 필드 | 설정 방식 |
|-----|------|----------|
| 공통 | INFO_SYS_ID, INFO_SYS_IP, SIGUNGU_CODE | application.yml system 설정 |
| 공통 | CHARGER_ID, CHARGER_IP, CHARGER_NM | application.yml system 설정 |
| 기본사항 | CNTC_INFO_CODE | vmis.gov.services.basic.cntcInfoCode |
| 기본사항 | INQIRE_SE_CODE | VHRNO→"3", VIN→"2" |
| 등록원부 | CNTC_INFO_CODE | vmis.gov.services.ledger.cntcInfoCode |
| 등록원부 | ONES_INFORMATION_OPEN | 기본값 "1" (소유자공개) |
| 등록원부 | ROUTE_SE_CODE | 고정값 "3" |
| 등록원부 | DETAIL_EXPRESSION | 기본값 "1" (전체내역) |
| 등록원부 | INQIRE_SE_CODE | 기본값 "1" (열람) |
---
## 4. 관련 파일 경로
| 구분 | 파일 경로 |
|------|----------|
| 기본정보 Request | `src/main/java/com/vmis/interfaceapp/model/basic/BasicRequest.java` |
| 기본정보 Response | `src/main/java/com/vmis/interfaceapp/model/basic/BasicResponse.java` |
| 등록원부 Request | `src/main/java/com/vmis/interfaceapp/model/ledger/LedgerRequest.java` |
| 등록원부 Response | `src/main/java/com/vmis/interfaceapp/model/ledger/LedgerResponse.java` |
| 기본정보 Service | `src/main/java/com/vmis/interfaceapp/service/CarBassMatterInqireService.java` |
| 등록원부 Service | `src/main/java/com/vmis/interfaceapp/service/CarLedgerFrmbkService.java` |
| RestTemplate Client | `src/main/java/com/vmis/interfaceapp/client/GovernmentApiClient.java` |
| Request Enricher | `src/main/java/com/vmis/interfaceapp/service/RequestEnricher.java` |
| Controller | `src/main/java/com/vmis/interfaceapp/controller/VehicleInterfaceController.java` |

@ -1,10 +1,10 @@
package com.vmis.interfaceapp.client;
import com.vmis.interfaceapp.model.basic.BasicRequest;
import com.vmis.interfaceapp.model.basic.BasicResponse;
import com.vmis.interfaceapp.model.basic.OldBasicRequest;
import com.vmis.interfaceapp.model.basic.OldBasicResponse;
import com.vmis.interfaceapp.model.common.Envelope;
import com.vmis.interfaceapp.model.ledger.LedgerRequest;
import com.vmis.interfaceapp.model.ledger.LedgerResponse;
import com.vmis.interfaceapp.model.ledger.NewLedgerRequest;
import com.vmis.interfaceapp.model.ledger.NewLedgerResponse;
import org.springframework.http.ResponseEntity;
/**
@ -15,7 +15,9 @@ import org.springframework.http.ResponseEntity;
*/
public interface GovernmentApi {
ResponseEntity<Envelope<BasicResponse>> callBasic(Envelope<BasicRequest> envelope);
// 구버전 자동차기본사항조회
ResponseEntity<Envelope<OldBasicResponse>> callOldBasic(Envelope<OldBasicRequest> envelope);
ResponseEntity<Envelope<LedgerResponse>> callLedger(Envelope<LedgerRequest> envelope);
// 신버전 자동차등록원부(갑)
ResponseEntity<Envelope<NewLedgerResponse>> callNewLedger(Envelope<NewLedgerRequest> envelope);
}

@ -3,13 +3,15 @@ package com.vmis.interfaceapp.client;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.vmis.interfaceapp.config.properties.VmisProperties;
import com.vmis.interfaceapp.config.properties.GpkiProperties;
import com.vmis.interfaceapp.config.properties.NewVmisProperties;
import com.vmis.interfaceapp.config.properties.OldVmisProperties;
import com.vmis.interfaceapp.gpki.GpkiService;
import com.vmis.interfaceapp.model.basic.BasicRequest;
import com.vmis.interfaceapp.model.basic.BasicResponse;
import com.vmis.interfaceapp.model.basic.OldBasicRequest;
import com.vmis.interfaceapp.model.basic.OldBasicResponse;
import com.vmis.interfaceapp.model.common.Envelope;
import com.vmis.interfaceapp.model.ledger.LedgerRequest;
import com.vmis.interfaceapp.model.ledger.LedgerResponse;
import com.vmis.interfaceapp.model.ledger.NewLedgerRequest;
import com.vmis.interfaceapp.model.ledger.NewLedgerResponse;
import com.vmis.interfaceapp.util.TxIdUtil;
import lombok.RequiredArgsConstructor;
import org.springframework.http.*;
@ -55,7 +57,7 @@ import java.nio.charset.StandardCharsets;
*
* @see RestTemplate
* @see GpkiService
* @see VmisProperties
* @see OldVmisProperties
*/
@Slf4j
@RequiredArgsConstructor
@ -78,7 +80,7 @@ public class GovernmentApiClient implements GovernmentApi {
private final RestTemplate restTemplate;
/**
* VMIS
* VMIS
*
* <p>application.yml application.properties .
* :</p>
@ -86,10 +88,23 @@ public class GovernmentApiClient implements GovernmentApi {
* <li> API URL (, , )</li>
* <li>API </li>
* <li> (INFO_SYS_ID, REGION_CODE )</li>
* <li>GPKI ( ID )</li>
* </ul>
*/
private final VmisProperties props;
private final OldVmisProperties oldProps;
/**
* VMIS
*
* <p> API .</p>
*/
private final NewVmisProperties newProps;
/**
* GPKI
*
* <p>GPKI ID .</p>
*/
private final GpkiProperties gpkiProps;
/**
* GPKI()
@ -152,13 +167,13 @@ public class GovernmentApiClient implements GovernmentApi {
*/
public enum ServiceType {
/**
* Basic service type.
* Old Basic service type ( ).
*/
BASIC,
OLD_BASIC,
/**
* Ledger service type.
* New Ledger service type ( ()).
*/
LEDGER }
NEW_LEDGER }
/**
* HTTP
@ -242,7 +257,7 @@ public class GovernmentApiClient implements GovernmentApi {
* @param txId ID
* @return HttpHeaders HTTP
*/
private HttpHeaders buildHeaders(VmisProperties.GovProps.Service svc, String txId) {
private HttpHeaders buildHeaders(String apiKey, String cvmisApikey, String txId) {
// 1. 빈 HttpHeaders 객체 생성
HttpHeaders headers = new HttpHeaders();
@ -264,15 +279,15 @@ public class GovernmentApiClient implements GovernmentApi {
// 6. 인증서 서버 ID
// GPKI 인증서를 발급받은 서버의 식별자
headers.add("cert_server_id", props.getGpki().getCertServerId());
headers.add("cert_server_id", gpkiProps.getCertServerId());
// 7. API 인증 키
// 서비스별로 다른 API 키 사용 가능 (BASIC과 LEDGER 각각)
headers.add("api_key", svc.getApiKey());
headers.add("api_key", apiKey);
// 8. CVMIS API 키
// CVMIS(Car Vehicle Management Information System) 전용 API 키
headers.add("cvmis_apikey", svc.getCvmisApikey());
headers.add("cvmis_apikey", cvmisApikey);
// 구성 완료된 헤더 반환
return headers;
@ -315,9 +330,9 @@ public class GovernmentApiClient implements GovernmentApi {
* @param envelope Envelope
* @return ResponseEntity&lt;Envelope&lt;BasicResponse&gt;&gt;
*/
public ResponseEntity<Envelope<BasicResponse>> callBasic(Envelope<BasicRequest> envelope) {
public ResponseEntity<Envelope<OldBasicResponse>> callOldBasic(Envelope<OldBasicRequest> envelope) {
// 순수한 전송 책임만 수행: DB 로깅은 서비스 레이어에서 처리
return callModel(ServiceType.BASIC, envelope, new TypeReference<Envelope<BasicResponse>>(){});
return callModel(ServiceType.OLD_BASIC, envelope, new TypeReference<Envelope<OldBasicResponse>>(){});
}
/**
@ -349,10 +364,10 @@ public class GovernmentApiClient implements GovernmentApi {
* @param envelope Envelope
* @return ResponseEntity&lt;Envelope&lt;LedgerResponse&gt;&gt;
*/
public ResponseEntity<Envelope<LedgerResponse>> callLedger(Envelope<LedgerRequest> envelope) {
public ResponseEntity<Envelope<NewLedgerResponse>> callNewLedger(Envelope<NewLedgerRequest> envelope) {
// TypeReference를 사용하여 제네릭 타입 정보 전달
// 익명 클래스를 생성하여 타입 소거(Type Erasure) 문제 해결
return callModel(ServiceType.LEDGER, envelope, new TypeReference<Envelope<LedgerResponse>>(){});
return callModel(ServiceType.NEW_LEDGER, envelope, new TypeReference<Envelope<NewLedgerResponse>>(){});
}
/**
@ -462,13 +477,27 @@ public class GovernmentApiClient implements GovernmentApi {
Envelope<TReq> envelope,
TypeReference<Envelope<TResp>> respType) {
// 1. 서비스 타입에 따른 설정 로드
VmisProperties.GovProps gov = props.getGov();
VmisProperties.GovProps.Service svc = (type == ServiceType.BASIC)
? gov.getServices().getBasic()
: gov.getServices().getLedger();
String url;
String apiKey;
String cvmisApikey;
if (type == ServiceType.OLD_BASIC) {
OldVmisProperties.GovProps gov = oldProps.getGov();
OldVmisProperties.GovProps.Service svc = gov.getServices().getBasic();
url = gov.buildServiceUrl(svc.getPath());
apiKey = svc.getApiKey();
cvmisApikey = svc.getCvmisApikey();
} else if (type == ServiceType.NEW_LEDGER) {
NewVmisProperties.GovProps gov = newProps.getGov();
NewVmisProperties.GovProps.Service svc = gov.getServices().getLedger();
url = gov.buildServiceUrl(svc.getPath());
apiKey = svc.getApiKey();
cvmisApikey = svc.getCvmisApikey();
} else {
throw new UnsupportedOperationException("지원하지 않는 서비스 타입: " + type);
}
// 2. URL 및 트랜잭션 ID 생성
String url = gov.buildServiceUrl(svc.getPath());
// 2. 트랜잭션 ID 생성
String txId = TxIdUtil.generate();
try {
@ -480,7 +509,7 @@ public class GovernmentApiClient implements GovernmentApi {
log.info("[GOV-REQ-BODY] tx_id={}, json={}", txId, jsonBody);
// 4. HTTP 헤더 구성
HttpHeaders headers = buildHeaders(svc, txId);
HttpHeaders headers = buildHeaders(apiKey, cvmisApikey, txId);
// 5. GPKI 암호화 처리
String bodyToSend = jsonBody;

@ -1,6 +1,6 @@
package com.vmis.interfaceapp.config;
import com.vmis.interfaceapp.config.properties.VmisProperties;
import com.vmis.interfaceapp.config.properties.GpkiProperties;
import com.vmis.interfaceapp.gpki.GpkiService;
import com.vmis.interfaceapp.gpki.NoopGpkiService;
import com.vmis.interfaceapp.gpki.RealGpkiService;
@ -11,9 +11,9 @@ import org.springframework.context.annotation.Configuration;
public class GpkiConfig {
@Bean
public GpkiService gpkiService(VmisProperties properties) {
if (properties.getGpki().isEnabledFlag()) {
return new RealGpkiService(properties);
public GpkiService gpkiService(GpkiProperties gpkiProperties) {
if (gpkiProperties.isEnabledFlag()) {
return new RealGpkiService(gpkiProperties);
}
return new NoopGpkiService();
}

@ -1,6 +1,6 @@
package com.vmis.interfaceapp.config;
import com.vmis.interfaceapp.config.properties.VmisProperties;
import com.vmis.interfaceapp.config.properties.HttpProperties;
import org.apache.hc.client5.http.config.RequestConfig;
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.HttpClientBuilder;
@ -21,10 +21,9 @@ import org.springframework.http.converter.StringHttpMessageConverter;
public class HttpClientConfig {
@Bean
public RestTemplate restTemplate(VmisProperties props, RestTemplateBuilder builder) {
VmisProperties.GovProps gov = props.getGov();
int connectTimeout = gov.getConnectTimeoutMillis();
int readTimeout = gov.getReadTimeoutMillis();
public RestTemplate restTemplate(HttpProperties httpProps, RestTemplateBuilder builder) {
int connectTimeout = httpProps.getConnectTimeoutMillis();
int readTimeout = httpProps.getReadTimeoutMillis();
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(connectTimeout, java.util.concurrent.TimeUnit.MILLISECONDS)

@ -1,10 +1,13 @@
package com.vmis.interfaceapp.config;
import com.vmis.interfaceapp.config.properties.VmisProperties;
import com.vmis.interfaceapp.config.properties.GpkiProperties;
import com.vmis.interfaceapp.config.properties.HttpProperties;
import com.vmis.interfaceapp.config.properties.NewVmisProperties;
import com.vmis.interfaceapp.config.properties.OldVmisProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableConfigurationProperties(VmisProperties.class)
@EnableConfigurationProperties({OldVmisProperties.class, NewVmisProperties.class, GpkiProperties.class, HttpProperties.class})
public class PropertiesConfig {
}

@ -0,0 +1,36 @@
package com.vmis.interfaceapp.config.properties;
import jakarta.validation.constraints.NotBlank;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.validation.annotation.Validated;
@Data
@ConfigurationProperties(prefix = "gpki")
@Validated
public class GpkiProperties {
/** "Y" 또는 "N" */
@NotBlank
private String enabled = "N";
private boolean useSign = true;
@NotBlank
private String charset = "UTF-8";
@NotBlank
private String certServerId;
@NotBlank
private String targetServerId;
// Optional advanced config for native GPKI util
private Boolean ldap; // null -> util default
private String gpkiLicPath; // e.g., C:/gpki2/gpkisecureweb/conf
private String certFilePath; // directory for target cert files when LDAP=false
private String envCertFilePathName; // ..._env.cer
private String envPrivateKeyFilePathName; // ..._env.key
private String envPrivateKeyPasswd;
private String sigCertFilePathName; // ..._sig.cer
private String sigPrivateKeyFilePathName; // ..._sig.key
private String sigPrivateKeyPasswd;
public boolean isEnabledFlag() {
return "Y".equalsIgnoreCase(enabled);
}
}

@ -0,0 +1,13 @@
package com.vmis.interfaceapp.config.properties;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.validation.annotation.Validated;
@Data
@ConfigurationProperties(prefix = "http")
@Validated
public class HttpProperties {
private int connectTimeoutMillis = 5000;
private int readTimeoutMillis = 10000;
}

@ -0,0 +1,81 @@
package com.vmis.interfaceapp.config.properties;
import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.validation.annotation.Validated;
/**
* VMIS (, () )
*/
@Data
@ConfigurationProperties(prefix = "new.vmis")
@Validated
public class NewVmisProperties {
@NotNull
private SystemProps system = new SystemProps();
@NotNull
private GovProps gov = new GovProps();
@Data
public static class SystemProps {
@NotBlank
private String infoSysId;
/** INFO_SYS_IP_ADDR */
private String infoSysIpAddr;
/** 시군구코드 (SGG_CD) */
private String sggCd;
// 담당자 정보
private String picId;
private String picIpAddr;
private String picNm;
}
@Data
public static class GovProps {
@NotBlank
private String scheme = "http";
@NotBlank
private String host;
@NotBlank
private String basePath;
@NotNull
private Services services = new Services();
public String buildServiceUrl(String path) {
StringBuilder sb = new StringBuilder();
sb.append(scheme).append("://").append(host);
if (basePath != null && !basePath.isEmpty()) {
if (!basePath.startsWith("/")) sb.append('/');
sb.append(basePath);
}
if (path != null && !path.isEmpty()) {
if (!path.startsWith("/")) sb.append('/');
sb.append(path);
}
return sb.toString();
}
@Data
public static class Services {
@NotNull
private Service basic = new Service();
@NotNull
private Service ledger = new Service();
}
@Data
public static class Service {
@NotBlank
private String path;
@NotBlank
private String linkInfoCd;
@NotBlank
private String apiKey;
@NotBlank
private String cvmisApikey;
}
}
}

@ -6,16 +6,17 @@ import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.validation.annotation.Validated;
/**
* VMIS ()
*/
@Data
@ConfigurationProperties(prefix = "vmis")
@ConfigurationProperties(prefix = "old.vmis")
@Validated
public class VmisProperties {
public class OldVmisProperties {
@NotNull
private SystemProps system = new SystemProps();
@NotNull
private GpkiProps gpki = new GpkiProps();
@NotNull
private GovProps gov = new GovProps();
@Data
@ -33,34 +34,6 @@ public class VmisProperties {
private String chargerNm;
}
@Data
public static class GpkiProps {
/** "Y" 또는 "N" */
@NotBlank
private String enabled = "N";
private boolean useSign = true;
@NotBlank
private String charset = "UTF-8";
@NotBlank
private String certServerId;
@NotBlank
private String targetServerId;
// Optional advanced config for native GPKI util
private Boolean ldap; // null -> util default
private String gpkiLicPath; // e.g., C:/gpki2/gpkisecureweb/conf
private String certFilePath; // directory for target cert files when LDAP=false
private String envCertFilePathName; // ..._env.cer
private String envPrivateKeyFilePathName; // ..._env.key
private String envPrivateKeyPasswd;
private String sigCertFilePathName; // ..._sig.cer
private String sigPrivateKeyFilePathName; // ..._sig.key
private String sigPrivateKeyPasswd;
public boolean isEnabledFlag() {
return "Y".equalsIgnoreCase(enabled);
}
}
@Data
public static class GovProps {
@NotBlank
@ -69,8 +42,6 @@ public class VmisProperties {
private String host;
@NotBlank
private String basePath;
private int connectTimeoutMillis = 5000;
private int readTimeoutMillis = 10000;
@NotNull
private Services services = new Services();
@ -92,8 +63,7 @@ public class VmisProperties {
public static class Services {
@NotNull
private Service basic = new Service();
@NotNull
private Service ledger = new Service();
// 구버전에는 ledger(갑부) 서비스 없음
}
@Data

@ -1,12 +1,12 @@
package com.vmis.interfaceapp.controller;
import com.vmis.interfaceapp.model.basic.BasicRequest;
import com.vmis.interfaceapp.model.basic.BasicResponse;
import com.vmis.interfaceapp.model.basic.OldBasicRequest;
import com.vmis.interfaceapp.model.basic.OldBasicResponse;
import com.vmis.interfaceapp.model.common.Envelope;
import com.vmis.interfaceapp.model.ledger.LedgerRequest;
import com.vmis.interfaceapp.model.ledger.LedgerResponse;
import com.vmis.interfaceapp.service.CarBassMatterInqireService;
import com.vmis.interfaceapp.service.CarLedgerFrmbkService;
import com.vmis.interfaceapp.model.ledger.NewLedgerRequest;
import com.vmis.interfaceapp.model.ledger.NewLedgerResponse;
import com.vmis.interfaceapp.service.NewCarLedgerFrmbkService;
import com.vmis.interfaceapp.service.OldCarBassMatterInqireService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.ExampleObject;
@ -16,7 +16,9 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* REST
@ -55,8 +57,8 @@ import org.springframework.web.bind.annotation.*;
@Tag(name = "Vehicle Interfaces", description = "시군구연계 자동차 정보 연계 API")
public class VehicleInterfaceController {
private final CarBassMatterInqireService carBassMatterInqireService;
private final CarLedgerFrmbkService carLedgerFrmbkService;
private final OldCarBassMatterInqireService oldCarBassMatterInqireService;
private final NewCarLedgerFrmbkService newCarLedgerFrmbkService;
/**
@ -100,9 +102,9 @@ public class VehicleInterfaceController {
* @param envelope Envelope (header) (data)
* @return ResponseEntity&lt;Envelope&lt;BasicResponse&gt;&gt; HTTP , ,
*/
@PostMapping(value = "/basic", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@PostMapping(value = "/old-basic", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@Operation(
summary = "자동차기본사항조회",
summary = "자동차기본사항조회 - 구버전",
description = "시군구연계 자동차기본사항조회 인터페이스. 요청 바디를 모델로 받아 정부시스템으로 전달합니다.",
requestBody = @RequestBody(
content = @Content(
@ -114,7 +116,7 @@ public class VehicleInterfaceController {
"data": [{
"record": [{
"LEVY_STDDE": "20250101",
"VHRNO": "12가3456",
"VHRNO": "차량번호",
"VIN": null
}]
}]
@ -124,11 +126,11 @@ public class VehicleInterfaceController {
)
)
)
public ResponseEntity<Envelope<BasicResponse>> basic(
@jakarta.validation.Valid @org.springframework.web.bind.annotation.RequestBody Envelope<BasicRequest> envelope
public ResponseEntity<Envelope<OldBasicResponse>> oldBasic(
@jakarta.validation.Valid @org.springframework.web.bind.annotation.RequestBody Envelope<OldBasicRequest> envelope
) {
// 서비스에서 요청 보강/로깅/호출을 모두 오케스트레이션
return carBassMatterInqireService.basic(envelope);
return oldCarBassMatterInqireService.basic(envelope);
}
/**
@ -190,9 +192,9 @@ public class VehicleInterfaceController {
* @param envelope Envelope (header) (data)
* @return ResponseEntity&lt;Envelope&lt;LedgerResponse&gt;&gt; HTTP , ,
*/
@PostMapping(value = "/ledger", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@PostMapping(value = "/new-ledger", consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
@Operation(
summary = "자동차등록원부(갑)",
summary = "자동차등록원부(갑) - 신버전",
description = "시군구연계 자동차등록원부(갑) 인터페이스. 요청 바디를 모델로 받아 정부시스템으로 전달합니다.",
requestBody = @RequestBody(
content = @Content(
@ -203,13 +205,14 @@ public class VehicleInterfaceController {
{
"data": [
{
"VHRNO": "12가3456",
"ONES_INFORMATION_OPEN": "1",
"CPTTR_NM": "홍길동",
"CPTTR_IHIDNUM": "8801011234567",
"CPTTR_LEGALDONG_CODE": "1111011700",
"DETAIL_EXPRESSION": "1",
"INQIRE_SE_CODE": "1"
"VHRNO": "차량번호",
"PRVC_RLS": "1",
"CVLPR_NM": "홍길동",
"CVLPR_IDECNO": "8801011234567",
"CVLPR_STDG_CD": "1111011700",
"PATH_SE_CD": "3",
"DSCTN_INDCT": "1",
"INQ_SE_CD": "1"
}
]
}
@ -218,10 +221,10 @@ public class VehicleInterfaceController {
)
)
)
public ResponseEntity<Envelope<LedgerResponse>> ledger(
@org.springframework.web.bind.annotation.RequestBody Envelope<LedgerRequest> envelope
public ResponseEntity<Envelope<NewLedgerResponse>> newLedger(
@org.springframework.web.bind.annotation.RequestBody Envelope<NewLedgerRequest> envelope
) {
// 서비스에서 요청 보강/호출을 오케스트레이션
return carLedgerFrmbkService.ledger(envelope);
return newCarLedgerFrmbkService.ledger(envelope);
}
}

@ -1,23 +1,23 @@
package com.vmis.interfaceapp.gpki;
import com.vmis.interfaceapp.config.properties.VmisProperties;
import com.vmis.interfaceapp.config.properties.GpkiProperties;
import com.vmis.interfaceapp.util.GpkiCryptoUtil;
import lombok.extern.slf4j.Slf4j;
/**
* Real GPKI service backed by native GPKI JNI via legacy NewGpkiUtil wrapper.
* Uses YAML-configured paths and options in {@link VmisProperties.GpkiProps}.
* Uses YAML-configured paths and options in {@link GpkiProperties}.
*/
@Slf4j
public class RealGpkiService implements GpkiService {
private final VmisProperties props;
private final GpkiProperties gpkiProps;
private final GpkiCryptoUtil crypto;
public RealGpkiService(VmisProperties props) {
this.props = props;
public RealGpkiService(GpkiProperties gpkiProps) {
this.gpkiProps = gpkiProps;
try {
this.crypto = GpkiCryptoUtil.from(props.getGpki());
this.crypto = GpkiCryptoUtil.from(gpkiProps);
} catch (Exception e) {
throw new IllegalStateException("Failed to initialize GPKI (JNI) util. Check YAML paths/passwords and license.", e);
}
@ -25,9 +25,9 @@ public class RealGpkiService implements GpkiService {
@Override
public String encrypt(String plain) throws Exception {
String charset = props.getGpki().getCharset();
String targetId = props.getGpki().getTargetServerId();
boolean useSign = props.getGpki().isUseSign();
String charset = gpkiProps.getCharset();
String targetId = gpkiProps.getTargetServerId();
boolean useSign = gpkiProps.isUseSign();
try {
// 샘플 순서 준수: encrypt(bytes) → (서명) → Base64
return crypto.encryptThenSignToBase64(plain, targetId, charset, useSign);
@ -42,8 +42,8 @@ public class RealGpkiService implements GpkiService {
@Override
public String decrypt(String cipher) throws Exception {
String charset = props.getGpki().getCharset();
boolean useSign = props.getGpki().isUseSign();
String charset = gpkiProps.getCharset();
boolean useSign = gpkiProps.isUseSign();
try {
// 샘플 순서 준수: Base64 decode → (서명검증) → decrypt → String 변환
return crypto.decodeValidateThenDecrypt(cipher, charset, useSign);

@ -1,650 +0,0 @@
package com.vmis.interfaceapp.model.basic;
import com.vmis.interfaceapp.config.ApiConstant;
import com.vmis.interfaceapp.model.common.Envelope;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.time.LocalDateTime;
/**
*
*
* <p>API .
* INSERT, UPDATE .</p>
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class CarBassMatterInqireVO {
// ==== Static factory/mapping methods (moved from Service) ====
public static CarBassMatterInqireVO fromRequest(BasicRequest request) {
BasicRequest.Record first = null;
if (request != null && request.getRecord() != null && !request.getRecord().isEmpty()) {
first = request.getRecord().get(0);
}
return CarBassMatterInqireVO.builder()
.infoSysId(request.getInfoSysId())
.infoSysIp(request.getInfoSysIp())
.sigunguCode(request.getSigunguCode())
.cntcInfoCode(request.getCntcInfoCode())
.chargerId(request.getChargerId())
.chargerIp(request.getChargerIp())
.chargerNm(request.getChargerNm())
.dmndLevyStdde(first != null ? first.getLevyStdde() : null)
.dmndInqireSeCode(first != null ? first.getInqireSeCode() : null)
.dmndVhrno(first != null ? first.getVhrno() : null)
.dmndVin(first != null ? first.getVin() : null)
.rgtr(ApiConstant.DEFAULT_REGISTRANT)
.build();
}
public static CarBassMatterInqireVO fromResponse(String id, Envelope<BasicResponse> envelope) {
if (envelope == null || envelope.getData() == null || envelope.getData().isEmpty()) return null;
BasicResponse response = envelope.getData().get(0);
CarBassMatterInqireVO.CarBassMatterInqireVOBuilder builder = CarBassMatterInqireVO.builder()
.carBassMatterInqireId(id)
.cntcResultCode(response.getCntcResultCode())
.cntcResultDtls(response.getCntcResultDtls());
if (response.getRecord() != null && !response.getRecord().isEmpty()) {
BasicResponse.Record record = response.getRecord().get(0);
applyRecord(builder, record);
}
return builder.build();
}
private static void applyRecord(CarBassMatterInqireVO.CarBassMatterInqireVOBuilder builder, BasicResponse.Record record) {
builder
.prye(record.getPrye()) // 연식
.registDe(record.getRegistDe()) // 등록일
.ersrRegistSeCode(record.getErsrRegistSeCode()) // 말소 등록 구분 코드
.ersrRegistSeNm(record.getErsrRegistSeNm()) // 말소 등록 구분명
.ersrRegistDe(record.getErsrRegistDe()) // 말소 등록일
.registDetailCode(record.getRegistDetailCode()) // 등록 상세 코드
.dsplvl(record.getDsplvl()) // 배기량
.useStrnghldLegaldongCode(record.getUseStrnghldLegaldongCode()) // 사용 본거지 법정동 코드
.useStrnghldAdstrdCode(record.getUseStrnghldAdstrdCode()) // 사용 본거지 행정동 코드
.useStrnghldMntn(record.getUseStrnghldMntn()) // 사용 본거지 산
.useStrnghldLnbr(record.getUseStrnghldLnbr()) // 사용 본거지 번지
.useStrnghldHo(record.getUseStrnghldHo()) // 사용 본거지 호
.useStrnghldAdresNm(record.getUseStrnghldAdresNm()) // 사용 본거지 상세주소
.useStrnghldRoadNmCode(record.getUseStrnghldRoadNmCode()) // 사용 본거지 도로명 코드
.usgsrhldUndgrndBuldSeCode(record.getUsgsrhldUndgrndBuldSeCode()) // 사용 본거지 지하 건물 구분 코드
.useStrnghldBuldMainNo(record.getUseStrnghldBuldMainNo()) // 사용 본거지 건물 주요 번호
.useStrnghldBuldSubNo(record.getUseStrnghldBuldSubNo()) // 사용 본거지 건물 부 번호
.usgsrhldAdresFull(record.getUsgsrhldAdresFull()) // 사용 본거지 전체주소
.mberSeCode(record.getMberSeCode()) // 대표소유자 회원 구분 코드
.mberSeNo(record.getMberSeNo()) // 대표소유자 회원 번호
.mberNm(record.getMberNm()) // 대표소유자 성명
.telno(record.getTelno()) // 대표소유자 전화번호
.ownerLegaldongCode(record.getOwnerLegaldongCode()) // 소유자 법정동 코드
.ownerAdstrdCode(record.getOwnerAdstrdCode()) // 소유자 행정동 코드
.ownerMntn(record.getOwnerMntn()) // 소유자 산
.ownerLnbr(record.getOwnerLnbr()) // 소유자 번지
.ownerHo(record.getOwnerHo()) // 소유자 호
.ownerAdresNm(record.getOwnerAdresNm()) // 소유자 상세주소
.ownerRoadNmCode(record.getOwnerRoadNmCode()) // 소유자 도로명 코드
.ownerUndgrndBuldSeCode(record.getOwnerUndgrndBuldSeCode()) // 소유자 지하건물 구분 코드
.ownerBuldMainNo(record.getOwnerBuldMainNo()) // 소유자 건물 주요 번호
.ownerBuldSubNo(record.getOwnerBuldSubNo()) // 소유자 건물 부 번호
.ownrWholaddr(record.getOwnerAdresFull()) // 소유자 전체주소
.aftrVhrno(record.getAftrVhrno()) // 신 차량번호
.useFuelCode(record.getUseFuelCode()) // 사용 연료 코드
.prposSeCode(record.getPrposSeCode()) // 용도 구분 코드
.mtrsFomNm(record.getMtrsFomNm()) // 원동기 형식명
.frntVhrno(record.getFrntVhrno()) // 이전 차량번호
.vhrno(record.getVhrno()) // 차량번호
.vin(record.getVin()) // 차대번호
.cnm(record.getCnm()) // 차명
.vhcleTotWt(record.getVhcleTotWt()) // 차량 총 중량
.caagEndde(record.getCaagEndde()) // 차령 만료일자
.changeDe(record.getChangeDe()) // 차번호 변경시기
.vhctyAsortCode(record.getVhctyAsortCode()) // 차종 종별 코드
.vhctyTyCode(record.getVhctyTyCode()) // 차종 유형 코드
.vhctySeCode(record.getVhctySeCode()) // 차종 분류 코드
.mxmmLdg(record.getMxmmLdg()) // 최대 적재량
.vhctyAsortNm(record.getVhctyAsortNm()) // 차종 종별명
.vhctyTyNm(record.getVhctyTyNm()) // 차종 유형명
.vhctySeNm(record.getVhctySeNm()) // 차종 분류명
.frstRegistDe(record.getFrstRegistDe()) // 최초 등록일
.fomNm(record.getFomNm()) // 형식
.acqsDe(record.getAcqsDe()) // 취득 일자
.acqsEndDe(record.getAcqsEndDe()) // 취득 종료일자
.yblMd(record.getYblMd()) // 제작 년월일
.transrRegistDe(record.getTransrRegistDe()) // 이전 등록일
.spcfRegistSttusCode(record.getSpcfRegistSttusCode()) // 제원 등록 상태 코드
.colorNm(record.getColorNm()) // 색상명
.mrtgCo(record.getMrtgCo()) // 저당수
.seizrCo(record.getSeizrCo()) // 압류건수
.stmdCo(record.getStmdCo()) // 구조변경수
.nmplCsdyAt(record.getNmplCsdyAt()) // 번호판 영치 여부
.nmplCsdyRemnrDe(record.getNmplCsdyRemnrDe()) // 번호판 영치 최고일
.originSeCode(record.getOriginSeCode()) // 출처 구분 코드
.nmplStndrdCode(record.getNmplStndrdCode()) // 번호판 규격 코드
.acqsAmount(record.getAcqsAmount()) // 취득 금액
.insptValidPdBgnde(record.getInsptValidPdBgnde()) // 검사 유효 기간 시작일
.insptValidPdEndde(record.getInsptValidPdEndde()) // 검사 유효 기간 종료일
.useStrnghldGrcCode(record.getUseStrnghldGrcCode()) // 사용 본거지 관청 코드
.tkcarPscapCo(record.getTkcarPscapCo()) // 승차정원수
.spmnno(record.getSpmnno()) // 제원관리번호
.trvlDstnc(record.getTrvlDstnc()) // 주행거리
.frstRegistRqrcno(record.getFrstRegistRqrcno()) // 최초 등록 접수번호
.vlntErsrPrvntcNticeDe(record.getVlntErsrPrvntcNticeDe()) // 예고통지일
.registInsttNm(record.getRegistInsttNm()) // 등록 기관명
.processImprtyResnCode(record.getProcessImprtyResnCode()) // 처리 불가 사유 코드
.processImprtyResnDtls(record.getProcessImprtyResnDtls()) // 처리 불가 사유 명세
.cbdLt(record.getCbdLt()) // 차체 길이
.cbdBt(record.getCbdBt()) // 차체 너비
.cbdHg(record.getCbdHg()) // 차체 높이
.frstMxmmLdg(record.getFrstMxmmLdg()) // 최초 최대 적재량
.fuelCnsmpRt(record.getFuelCnsmpRt()) // 연료 소비율
.elctyCmpndFuelCnsmpRt(record.getElctyCmpndFuelCnsmpRt()); // 전기 복합 연료 소비율
}
/**
* ID (PK)
* : CBMI000000000001
*/
private String carBassMatterInqireId;
// ===== 요청 정보 =====
/**
* ID
*/
private String infoSysId;
/**
* IP
*/
private String infoSysIp;
/**
*
*/
private String sigunguCode;
/**
*
*/
private String cntcInfoCode;
/**
* ID
*/
private String chargerId;
/**
* IP
*/
private String chargerIp;
/**
*
*/
private String chargerNm;
/**
*
*/
private String dmndLevyStdde;
/**
*
*/
private String dmndInqireSeCode;
/**
*
*/
private String dmndVhrno;
/**
*
*/
private String dmndVin;
// ===== 응답 정보 (결과 수신 시 UPDATE) =====
/**
*
*/
private String cntcResultCode;
/**
*
*/
private String cntcResultDtls;
/**
*
*/
private String prye;
/**
*
*/
private String registDe;
/**
*
*/
private String ersrRegistSeCode;
/**
*
*/
private String ersrRegistSeNm;
/**
*
*/
private String ersrRegistDe;
/**
*
*/
private String registDetailCode;
/**
*
*/
private String dsplvl;
/**
*
*/
private String useStrnghldLegaldongCode;
/**
*
*/
private String useStrnghldAdstrdCode;
/**
*
*/
private String useStrnghldMntn;
/**
*
*/
private String useStrnghldLnbr;
/**
*
*/
private String useStrnghldHo;
/**
*
*/
private String useStrnghldAdresNm;
/**
*
*/
private String useStrnghldRoadNmCode;
/**
*
*/
private String usgsrhldUndgrndBuldSeCode;
/**
*
*/
private String useStrnghldBuldMainNo;
/**
*
*/
private String useStrnghldBuldSubNo;
/**
*
*/
private String usgsrhldAdresFull;
/**
*
*/
private String mberSeCode;
/**
*
*/
private String mberSeNo;
/**
*
*/
private String telno;
/**
*
*/
private String ownerLegaldongCode;
/**
*
*/
private String ownerAdstrdCode;
/**
*
*/
private String ownerMntn;
/**
*
*/
private String ownerLnbr;
/**
*
*/
private String ownerHo;
/**
*
*/
private String ownerAdresNm;
/**
*
*/
private String ownerRoadNmCode;
/**
*
*/
private String ownerUndgrndBuldSeCode;
/**
*
*/
private String ownerBuldMainNo;
/**
*
*/
private String ownerBuldSubNo;
/**
*
*/
private String ownrWholaddr;
/**
*
*/
private String aftrVhrno;
/**
*
*/
private String useFuelCode;
/**
*
*/
private String prposSeCode;
/**
*
*/
private String mtrsFomNm;
/**
*
*/
private String frntVhrno;
/**
*
*/
private String vhrno;
/**
*
*/
private String vin;
/**
*
*/
private String cnm;
/**
*
*/
private String vhcleTotWt;
/**
*
*/
private String caagEndde;
/**
*
*/
private String changeDe;
/**
*
*/
private String vhctyAsortCode;
/**
*
*/
private String vhctyTyCode;
/**
*
*/
private String vhctySeCode;
/**
*
*/
private String mxmmLdg;
/**
*
*/
private String vhctyAsortNm;
/**
*
*/
private String vhctyTyNm;
/**
*
*/
private String vhctySeNm;
/**
*
*/
private String frstRegistDe;
/**
*
*/
private String fomNm;
/**
*
*/
private String acqsDe;
/**
*
*/
private String acqsEndDe;
/**
*
*/
private String yblMd;
/**
*
*/
private String transrRegistDe;
/**
*
*/
private String spcfRegistSttusCode;
/**
*
*/
private String colorNm;
/**
*
*/
private String mrtgCo;
/**
*
*/
private String seizrCo;
/**
*
*/
private String stmdCo;
/**
*
*/
private String nmplCsdyAt;
/**
*
*/
private String nmplCsdyRemnrDe;
/**
*
*/
private String originSeCode;
/**
*
*/
private String nmplStndrdCode;
/**
*
*/
private String acqsAmount;
/**
*
*/
private String insptValidPdBgnde;
/**
*
*/
private String insptValidPdEndde;
/**
*
*/
private String useStrnghldGrcCode;
/**
*
*/
private String tkcarPscapCo;
/**
*
*/
private String spmnno;
/**
*
*/
private String trvlDstnc;
/**
*
*/
private String frstRegistRqrcno;
/**
*
*/
private String vlntErsrPrvntcNticeDe;
/**
*
*/
private String registInsttNm;
/**
*
*/
private String processImprtyResnCode;
/**
*
*/
private String processImprtyResnDtls;
/**
*
*/
private String cbdLt;
/**
*
*/
private String cbdBt;
/**
*
*/
private String cbdHg;
/**
*
*/
private String frstMxmmLdg;
/**
*
*/
private String fuelCnsmpRt;
/**
*
*/
private String elctyCmpndFuelCnsmpRt;
/**
*
*/
private LocalDateTime regDt;
/**
*
*/
private String rgtr;
/**
*
*/
private String mberNm;
}

@ -10,36 +10,36 @@ import lombok.Setter;
@JsonInclude(JsonInclude.Include.NON_NULL)
@Getter
@Setter
@Schema(description = "자동차기본사항조회 요청 항목")
public class BasicRequest {
@Schema(description = "자동차기본사항조회 요청 항목 (구버전)")
public class OldBasicRequest {
// 본문 공통 메타 (application.yml에서 자동 설정)
@Schema(description = "정보시스템ID (자동설정: vmis.system.infoSysId)", example = "41-345")
@Schema(description = "정보시스템ID (자동설정: old.vmis.system.infoSysId)", example = "41-345")
@JsonProperty("INFO_SYS_ID")
private String infoSysId;
@Schema(description = "정보시스템IP (자동설정: vmis.system.infoSysIp)", example = "105.19.10.135")
@Schema(description = "정보시스템IP (자동설정: old.vmis.system.infoSysIp)", example = "105.19.10.135")
@JsonProperty("INFO_SYS_IP")
private String infoSysIp;
@Schema(description = "시군구코드 (자동설정: vmis.system.sigunguCode)", example = "41460")
@Schema(description = "시군구코드 (자동설정: old.vmis.system.sigunguCode)", example = "41460")
@JsonProperty("SIGUNGU_CODE")
private String sigunguCode;
// 서비스별 필드 (application.yml에서 자동 설정)
@Schema(description = "연계정보코드 (자동설정: vmis.gov.services.basic.cntcInfoCode)", example = "AC1_FD11_01")
@Schema(description = "연계정보코드 (자동설정: old.vmis.gov.services.basic.cntcInfoCode)", example = "AC1_FD11_01")
@JsonProperty("CNTC_INFO_CODE")
private String cntcInfoCode;
@Schema(description = "담당자ID (자동설정: vmis.system.chargerId)", example = "")
@Schema(description = "담당자ID (자동설정: old.vmis.system.chargerId)", example = "")
@JsonProperty("CHARGER_ID")
private String chargerId;
@Schema(description = "담당자IP (자동설정: vmis.system.chargerIp)", example = "")
@Schema(description = "담당자IP (자동설정: old.vmis.system.chargerIp)", example = "")
@JsonProperty("CHARGER_IP")
private String chargerIp;
@Schema(description = "담당자명(사용자) (자동설정: vmis.system.chargerNm)", example = "")
@Schema(description = "담당자명 (자동설정: old.vmis.system.chargerNm)", example = "")
@JsonProperty("CHARGER_NM")
private String chargerNm;
@ -47,38 +47,10 @@ public class BasicRequest {
@JsonProperty("record")
private java.util.List<Record> record;
/*
// 추가 항목 (명세 샘플 기준)
@Schema(description = "개인정보공개", example = "Y")
@JsonProperty("ONES_INFORMATION_OPEN")
private String onesInformationOpen;
@Schema(description = "민원인성명")
@JsonProperty("CPTTR_NM")
private String cpttrNm;
@Schema(description = "민원인주민번호")
@JsonProperty("CPTTR_IHIDNUM")
@Size(max = 13)
private String cpttrIhidnum;
@Schema(description = "민원인법정동코드")
@JsonProperty("CPTTR_LEGALDONG_CODE")
private String cpttrLegaldongCode;
@Schema(description = "경로구분코드")
@JsonProperty("ROUTE_SE_CODE")
private String routeSeCode;
@Schema(description = "내역표시")
@JsonProperty("DETAIL_EXPRESSION")
private String detailExpression;
*/
@JsonInclude(JsonInclude.Include.NON_NULL)
@Getter
@Setter
@Schema(name = "BasicRequest.Record", description = "기본사항 요청 record 항목")
@Schema(name = "OldBasicRequest.Record", description = "기본사항 요청 record 항목 (구버전)")
public static class Record {
@Schema(description = "부과기준일", example = "20250101")
@JsonProperty("LEVY_STDDE")

@ -11,10 +11,10 @@ import java.util.List;
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
@Schema(description = "자동차기본사항조회 응답 모델")
@Schema(description = "자동차기본사항조회 응답 모델 (구버전)")
@Getter
@Setter
public class BasicResponse {
public class OldBasicResponse {
@JsonProperty("CNTC_RESULT_CODE")
private String cntcResultCode;
@ -28,7 +28,7 @@ public class BasicResponse {
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
@Schema(name = "BasicRecord", description = "기본사항 record 항목")
@Schema(name = "OldBasicRecord", description = "기본사항 record 항목 (구버전)")
@Getter
@Setter
public static class Record {

@ -1,73 +0,0 @@
package com.vmis.interfaceapp.model.ledger;
import com.vmis.interfaceapp.config.ApiConstant;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.ArrayList;
import java.util.List;
/**
* () VO
*
* <p>tb_car_ledger_frmbk_dtl </p>
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class CarLedgerFrmbkDtlVO {
// ==== Static factory/mapping methods (moved from Service) ====
public static List<CarLedgerFrmbkDtlVO> listFromResponse(LedgerResponse res, String masterId) {
List<CarLedgerFrmbkDtlVO> list = new ArrayList<>();
if (res == null || res.getRecord() == null) return list;
for (LedgerResponse.Record r : res.getRecord()) {
CarLedgerFrmbkDtlVO vo = CarLedgerFrmbkDtlVO.builder()
.carLedgerFrmbkId(masterId) // 원부 마스터 ID (FK)
.mainchk(r.getMainchk()) // 주요 체크
.changeJobSeCode(r.getChangeJobSeCode()) // 변경 작업 구분 코드
.mainno(r.getMainno()) // 주번호
.subno(r.getSubno()) // 부번호
.dtls(r.getDtls()) // 상세 내역
.rqrcno(r.getRqrcno()) // 접수번호
.vhmno(r.getVhmno()) // 차량관리번호
.ledgerGroupNo(r.getLedgerGroupNo()) // 원부 그룹 번호
.ledgerIndvdlzNo(r.getLedgerIndvdlzNo()) // 원부 개별화 번호
.gubunNm(r.getGubunNm()) // 구분명
.changeDe(r.getChangeDe()) // 변경일자
.detailSn(r.getDetailSn()) // 상세 순번
.flag(r.getFlag()) // 플래그
.rgtr(ApiConstant.DEFAULT_REGISTRANT) // 등록자
.build();
list.add(vo);
}
return list;
}
// PK
private String carLedgerFrmbkDtlId;
// FK
private String carLedgerFrmbkId;
// 본문
private String mainchk;
private String changeJobSeCode;
private String mainno;
private String subno;
private String dtls;
private String rqrcno;
private String vhmno;
private String ledgerGroupNo;
private String ledgerIndvdlzNo;
private String gubunNm;
private String changeDe;
private String detailSn;
private String flag;
// 감사
private String rgtr;
}

@ -1,192 +0,0 @@
package com.vmis.interfaceapp.model.ledger;
import com.vmis.interfaceapp.config.ApiConstant;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* () VO
*
* <p>tb_car_ledger_frmbk </p>
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class CarLedgerFrmbkVO {
// ==== Static factory/mapping methods (moved from Service) ====
public static CarLedgerFrmbkVO fromRequest(com.vmis.interfaceapp.model.ledger.LedgerRequest request) {
return CarLedgerFrmbkVO.builder()
.infoSysId(request.getInfoSysId())
.infoSysIp(request.getInfoSysIp())
.sigunguCode(request.getSigunguCode())
.cntcInfoCode(request.getCntcInfoCode())
.chargerId(request.getChargerId())
.chargerIp(request.getChargerIp())
.chargerNm(request.getChargerNm())
.dmndVhrno(request.getVhrno())
.rgtr(ApiConstant.DEFAULT_REGISTRANT)
.build();
}
public static CarLedgerFrmbkVO fromResponseMaster(String id, com.vmis.interfaceapp.model.ledger.LedgerResponse res) {
return CarLedgerFrmbkVO.builder()
.carLedgerFrmbkId(id) // 등록원부 ID
.cntcResultCode(res.getCntcResultCode()) // 연계 결과 코드
.cntcResultDtls(res.getCntcResultDtls()) // 연계 결과 상세
.ledgerGroupNo(res.getLedgerGroupNo()) // 원부 그룹 번호
.ledgerIndvdlzNo(res.getLedgerIndvdlzNo()) // 원부 개별화 번호
.vhmno(res.getVhmno()) // 차량관리번호
.vhrno(res.getVhrno()) // 차량번호
.vin(res.getVin()) // 차대번호
.vhctyAsortCode(res.getVhctyAsortCode()) // 차종 종별 코드
.vhctyAsortNm(res.getVhctyAsortNm()) // 차종 종별명
.cnm(res.getCnm()) // 차명
.colorCode(res.getColorCode()) // 색상 코드
.colorNm(res.getColorNm()) // 색상명
.nmplStndrdCode(res.getNmplStndrdCode()) // 번호판 규격 코드
.nmplStndrdNm(res.getNmplStndrdNm()) // 번호판 규격명
.prposSeCode(res.getPrposSeCode()) // 용도 구분 코드
.prposSeNm(res.getPrposSeNm()) // 용도 구분명
.mtrsFomNm(res.getMtrsFomNm()) // 원동기 형식명
.fomNm(res.getFomNm()) // 형식명
.acqsAmount(res.getAcqsAmount()) // 취득 금액
.registDetailCode(res.getRegistDetailCode()) // 등록 상세 코드
.registDetailNm(res.getRegistDetailNm()) // 등록 상세명
.frstRegistDe(res.getFrstRegistDe()) // 최초 등록일
.caagEndde(res.getCaagEndde()) // 차령 만료일자
.prye(res.getPrye()) // 연식
.spmnno1(res.getSpmnno1()) // 제원관리번호1
.spmnno2(res.getSpmnno2()) // 제원관리번호2
.yblMd(res.getYblMd()) // 제작 년월일
.trvlDstnc(res.getTrvlDstnc()) // 주행거리
.insptValidPdBgnde(res.getInsptValidPdBgnde()) // 검사 유효 기간 시작일
.insptValidPdEndde(res.getInsptValidPdEndde()) // 검사 유효 기간 종료일
.chckValidPdBgnde(res.getChckValidPdBgnde()) // 점검 유효 기간 시작일
.chckValidPdEndde(res.getChckValidPdEndde()) // 점검 유효 기간 종료일
.registReqstSeNm(res.getRegistReqstSeNm()) // 등록 청구 구분명
.frstRegistRqrcno(res.getFrstRegistRqrcno()) // 최초 등록 접수번호
.nmplCsdyRemnrDe(res.getNmplCsdyRemnrDe()) // 번호판 영치 최고일
.nmplCsdyAt(res.getNmplCsdyAt()) // 번호판 영치 여부
.bssUsePd(res.getBssUsePd()) // 사업용 기간
.octhtErsrPrvntcNticeDe(res.getOcthtErsrPrvntcNticeDe()) // 직권말소 예고통지일
.ersrRegistDe(res.getErsrRegistDe()) // 말소 등록일
.ersrRegistSeCode(res.getErsrRegistSeCode()) // 말소 등록 구분 코드
.ersrRegistSeNm(res.getErsrRegistSeNm()) // 말소 등록 구분명
.mrtgcnt(res.getMrtgcnt()) // 저당건수
.vhclecnt(res.getVhclecnt()) // 압류건수
.stmdcnt(res.getStmdcnt()) // 구조변경건수
.adres1(res.getAdres1()) // 주소1
.adresNm1(res.getAdresNm1()) // 주소명1
.adres(res.getAdres()) // 주소
.adresNm(res.getAdresNm()) // 주소명
.indvdlBsnmAt(res.getIndvdlBsnmAt()) // 개인사업자 여부
.telno(res.getTelno()) // 전화번호
.mberNm(res.getMberNm()) // 소유자명
.mberSeCode(res.getMberSeCode()) // 소유자 구분 코드
.mberSeNo(res.getMberSeNo()) // 소유자 번호
.taxxmptTrgterSeCode(res.getTaxxmptTrgterSeCode()) // 면세 대상 구분 코드
.taxxmptTrgterSeCodeNm(res.getTaxxmptTrgterSeCodeNm()) // 면세 대상 구분명
.cntMatter(res.getCntMatter()) // 내용 사항
.emdNm(res.getEmdNm()) // 읍면동명
.prvntccnt(res.getPrvntccnt()) // 예방건수
.xportFlflAtSttemntDe(res.getXportFlflAtSttemntDe()) // 수출이행신고일
.partnRqrcno(res.getPartnRqrcno()) // 협력업체 접수번호
.build();
}
// PK
private String carLedgerFrmbkId;
// 요청(헤더/본문) 정보
private String infoSysId;
private String infoSysIp;
private String sigunguCode;
private String cntcInfoCode;
private String chargerId;
private String chargerIp;
private String chargerNm;
// 요청 본문
private String dmndVhrno;
private String dmndOnesInformationOpen;
private String dmndCpttrNm;
private String dmndCpttrIhidnum;
private String dmndCpttrLegaldongCode;
private String dmndRouteSeCode;
private String dmndDetailExpression;
private String dmndInqireSeCode;
// 응답 요약 정보
private String cntcResultCode;
private String cntcResultDtls;
// 응답 본문(마스터)
private String ledgerGroupNo;
private String ledgerIndvdlzNo;
private String vhmno;
private String vhrno;
private String vin;
private String vhctyAsortCode;
private String vhctyAsortNm;
private String cnm;
private String colorCode;
private String colorNm;
private String nmplStndrdCode;
private String nmplStndrdNm;
private String prposSeCode;
private String prposSeNm;
private String mtrsFomNm;
private String fomNm;
private String acqsAmount;
private String registDetailCode;
private String registDetailNm;
private String frstRegistDe;
private String caagEndde;
private String prye;
private String spmnno1;
private String spmnno2;
private String yblMd;
private String trvlDstnc;
private String insptValidPdBgnde;
private String insptValidPdEndde;
private String chckValidPdBgnde;
private String chckValidPdEndde;
private String registReqstSeNm;
private String frstRegistRqrcno;
private String nmplCsdyRemnrDe;
private String nmplCsdyAt;
private String bssUsePd;
private String octhtErsrPrvntcNticeDe;
private String ersrRegistDe;
private String ersrRegistSeCode;
private String ersrRegistSeNm;
private String mrtgcnt;
private String vhclecnt;
private String stmdcnt;
private String adres1;
private String adresNm1;
private String adres;
private String adresNm;
private String indvdlBsnmAt;
private String telno;
private String mberNm;
private String mberSeCode;
private String mberSeNo;
private String taxxmptTrgterSeCode;
private String taxxmptTrgterSeCodeNm;
private String cntMatter;
private String emdNm;
private String prvntccnt;
private String xportFlflAtSttemntDe;
private String partnRqrcno;
private String frstTrnsfrDe;
private String processImprtyResnCode;
private String processImprtyResnDtls;
// 감사
private String rgtr;
}

@ -1,79 +0,0 @@
package com.vmis.interfaceapp.model.ledger;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Size;
import lombok.Getter;
import lombok.Setter;
@JsonInclude(JsonInclude.Include.NON_NULL)
@Schema(description = "자동차등록원부(갑) 요청 항목")
@Getter
@Setter
public class LedgerRequest {
// 본문 공통 메타 (application.yml에서 자동 설정)
@Schema(description = "정보시스템ID (자동설정: vmis.system.infoSysId)", example = "41-345")
@JsonProperty("INFO_SYS_ID")
private String infoSysId;
@Schema(description = "정보시스템IP (자동설정: vmis.system.infoSysIp)", example = "105.19.10.135")
@JsonProperty("INFO_SYS_IP")
private String infoSysIp;
@Schema(description = "시군구코드 (자동설정: vmis.system.sigunguCode)", example = "41460")
@JsonProperty("SIGUNGU_CODE")
private String sigunguCode;
// 서비스별 필드 (application.yml에서 자동 설정)
@Schema(description = "연계정보코드 (자동설정: vmis.gov.services.ledger.cntcInfoCode)", example = "AC1_FD11_02")
@JsonProperty("CNTC_INFO_CODE")
private String cntcInfoCode;
@Schema(description = "담당자ID (자동설정: vmis.system.chargerId)", example = "")
@JsonProperty("CHARGER_ID")
private String chargerId;
@Schema(description = "담당자IP (자동설정: vmis.system.chargerIp)", example = "")
@JsonProperty("CHARGER_IP")
private String chargerIp;
@Schema(description = "담당자명(사용자) (자동설정: vmis.system.chargerNm)", example = "")
@JsonProperty("CHARGER_NM")
private String chargerNm;
@Schema(description = "자동차등록번호")
@JsonProperty("VHRNO")
private String vhrno;
@Schema(description = "개인정보공개 {1:소유자공개, 2:비공개, 3:비공개(주민등록번호), 4:비공개(사용본거지)}")
@JsonProperty("ONES_INFORMATION_OPEN")
private String onesInformationOpen;
@Schema(description = "민원인성명")
@JsonProperty("CPTTR_NM")
private String cpttrNm;
@Schema(description = "민원인주민번호")
@JsonProperty("CPTTR_IHIDNUM")
@Size(max = 13)
private String cpttrIhidnum;
@Schema(description = "민원인법정동코드")
@JsonProperty("CPTTR_LEGALDONG_CODE")
private String cpttrLegaldongCode;
@Schema(description = "경로구분코드 고정코드:3")
@JsonProperty("ROUTE_SE_CODE")
private String routeSeCode;
@Schema(description = "내역표시 {1:전체내역, 2:최종내역}")
@JsonProperty("DETAIL_EXPRESSION")
private String detailExpression;
@Schema(description = "조회구분코드 (자동설정: 1:열람 고정)")
@JsonProperty("INQIRE_SE_CODE")
private String inqireSeCode;
}

@ -1,223 +0,0 @@
package com.vmis.interfaceapp.model.ledger;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
@Schema(description = "자동차등록원부(갑) 응답 모델")
@Getter
@Setter
public class LedgerResponse {
@JsonProperty("CNTC_RESULT_CODE")
private String cntcResultCode;
@JsonProperty("CNTC_RESULT_DTLS")
private String cntcResultDtls;
@JsonProperty("LEDGER_GROUP_NO")
private String ledgerGroupNo;
@JsonProperty("LEDGER_INDVDLZ_NO")
private String ledgerIndvdlzNo;
@JsonProperty("VHMNO")
private String vhmno;
@JsonProperty("VHRNO")
private String vhrno;
@JsonProperty("VIN")
private String vin;
@JsonProperty("VHCTY_ASORT_CODE")
private String vhctyAsortCode;
@JsonProperty("VHCTY_ASORT_NM")
private String vhctyAsortNm;
@JsonProperty("CNM")
private String cnm;
@JsonProperty("COLOR_CODE")
private String colorCode;
@JsonProperty("COLOR_NM")
private String colorNm;
@JsonProperty("NMPL_STNDRD_CODE")
private String nmplStndrdCode;
@JsonProperty("NMPL_STNDRD_NM")
private String nmplStndrdNm;
@JsonProperty("PRPOS_SE_CODE")
private String prposSeCode;
@JsonProperty("PRPOS_SE_NM")
private String prposSeNm;
@JsonProperty("MTRS_FOM_NM")
private String mtrsFomNm;
@JsonProperty("FOM_NM")
private String fomNm;
@JsonProperty("ACQS_AMOUNT")
private String acqsAmount;
@JsonProperty("REGIST_DETAIL_CODE")
private String registDetailCode;
@JsonProperty("REGIST_DETAIL_NM")
private String registDetailNm;
@JsonProperty("FRST_REGIST_DE")
private String frstRegistDe;
@JsonProperty("CAAG_ENDDE")
private String caagEndde;
@JsonProperty("PRYE")
private String prye;
@JsonProperty("SPMNNO1")
private String spmnno1;
@JsonProperty("SPMNNO2")
private String spmnno2;
@JsonProperty("YBL_MD")
private String yblMd;
@JsonProperty("TRVL_DSTNC")
private String trvlDstnc;
@JsonProperty("INSPT_VALID_PD_BGNDE")
private String insptValidPdBgnde;
@JsonProperty("INSPT_VALID_PD_ENDDE")
private String insptValidPdEndde;
@JsonProperty("CHCK_VALID_PD_BGNDE")
private String chckValidPdBgnde;
@JsonProperty("CHCK_VALID_PD_ENDDE")
private String chckValidPdEndde;
@JsonProperty("REGIST_REQST_SE_NM")
private String registReqstSeNm;
@JsonProperty("FRST_REGIST_RQRCNO")
private String frstRegistRqrcno;
@JsonProperty("NMPL_CSDY_REMNR_DE")
private String nmplCsdyRemnrDe;
@JsonProperty("NMPL_CSDY_AT")
private String nmplCsdyAt;
@JsonProperty("BSS_USE_PD")
private String bssUsePd;
@JsonProperty("OCTHT_ERSR_PRVNTC_NTICE_DE")
private String octhtErsrPrvntcNticeDe;
@JsonProperty("ERSR_REGIST_DE")
private String ersrRegistDe;
@JsonProperty("ERSR_REGIST_SE_CODE")
private String ersrRegistSeCode;
@JsonProperty("ERSR_REGIST_SE_NM")
private String ersrRegistSeNm;
@JsonProperty("MRTGCNT")
private String mrtgcnt;
@JsonProperty("VHCLECNT")
private String vhclecnt;
@JsonProperty("STMDCNT")
private String stmdcnt;
@JsonProperty("ADRES1")
private String adres1;
@JsonProperty("ADRES_NM1")
private String adresNm1;
@JsonProperty("ADRES")
private String adres;
@JsonProperty("ADRES_NM")
private String adresNm;
@JsonProperty("INDVDL_BSNM_AT")
private String indvdlBsnmAt;
@JsonProperty("TELNO")
private String telno;
@JsonProperty("MBER_NM")
private String mberNm;
@JsonProperty("MBER_SE_CODE")
private String mberSeCode;
@JsonProperty("MBER_SE_NO")
private String mberSeNo;
@JsonProperty("TAXXMPT_TRGTER_SE_CODE")
private String taxxmptTrgterSeCode;
@JsonProperty("TAXXMPT_TRGTER_SE_CODE_NM")
private String taxxmptTrgterSeCodeNm;
@JsonProperty("CNT_MATTER")
private String cntMatter;
@JsonProperty("EMD_NM")
private String emdNm;
@JsonProperty("PRVNTCCNT")
private String prvntccnt;
@JsonProperty("XPORT_FLFL_AT_STTEMNT_DE")
private String xportFlflAtSttemntDe;
@JsonProperty("PARTN_RQRCNO")
private String partnRqrcno;
@JsonProperty("record")
private List<Record> record;
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
@Schema(name = "LedgerRecord", description = "원부 변경내역 record")
@Getter
@Setter
public static class Record {
@JsonProperty("MAINCHK") private String mainchk;
@JsonProperty("CHANGE_JOB_SE_CODE") private String changeJobSeCode;
@JsonProperty("MAINNO") private String mainno;
@JsonProperty("SUBNO") private String subno;
@JsonProperty("DTLS") private String dtls;
@JsonProperty("RQRCNO") private String rqrcno;
@JsonProperty("VHMNO") private String vhmno;
@JsonProperty("LEDGER_GROUP_NO") private String ledgerGroupNo;
@JsonProperty("LEDGER_INDVDLZ_NO") private String ledgerIndvdlzNo;
@JsonProperty("GUBUN_NM") private String gubunNm;
@JsonProperty("CHANGE_DE") private String changeDe;
@JsonProperty("DETAIL_SN") private String detailSn;
@JsonProperty("FLAG") private String flag;
}
}

@ -0,0 +1,79 @@
package com.vmis.interfaceapp.model.ledger;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Size;
import lombok.Getter;
import lombok.Setter;
@JsonInclude(JsonInclude.Include.NON_NULL)
@Schema(description = "자동차등록원부(갑) 요청 항목 (신버전)")
@Getter
@Setter
public class NewLedgerRequest {
// 본문 공통 메타 (application.yml에서 자동 설정)
@Schema(description = "정보시스템ID (자동설정: new.vmis.system.infoSysId)", example = "41-345")
@JsonProperty("INFO_SYS_ID")
private String infoSysId;
@Schema(description = "정보시스템IP주소 (자동설정: new.vmis.system.infoSysIpAddr)", example = "105.19.10.135")
@JsonProperty("INFO_SYS_IP_ADDR")
private String infoSysIpAddr;
@Schema(description = "시군구코드 (자동설정: new.vmis.system.sggCd)", example = "41460")
@JsonProperty("SGG_CD")
private String sggCd;
// 서비스별 필드 (application.yml에서 자동 설정)
@Schema(description = "연계정보코드 (자동설정: new.vmis.gov.services.ledger.linkInfoCd)", example = "AC1_FD11_02")
@JsonProperty("LINK_INFO_CD")
private String linkInfoCd;
@Schema(description = "담당자ID (자동설정: new.vmis.system.picId)", example = "")
@JsonProperty("PIC_ID")
private String picId;
@Schema(description = "담당자IP주소 (자동설정: new.vmis.system.picIpAddr)", example = "")
@JsonProperty("PIC_IP_ADDR")
private String picIpAddr;
@Schema(description = "담당자명 (자동설정: new.vmis.system.picNm)", example = "")
@JsonProperty("PIC_NM")
private String picNm;
@Schema(description = "자동차등록번호")
@JsonProperty("VHRNO")
private String vhrno;
@Schema(description = "개인정보공개 {1:소유자공개, 2:비공개, 3:비공개(주민등록번호), 4:비공개(사용본거지)}")
@JsonProperty("PRVC_RLS")
private String prvcRls;
@Schema(description = "민원인성명")
@JsonProperty("CVLPR_NM")
private String cvlprNm;
@Schema(description = "민원인주민번호")
@JsonProperty("CVLPR_IDECNO")
@Size(max = 13)
private String cvlprIdecno;
@Schema(description = "민원인법정동코드")
@JsonProperty("CVLPR_STDG_CD")
private String cvlprStdgCd;
@Schema(description = "경로구분코드 고정코드:3")
@JsonProperty("PATH_SE_CD")
private String pathSeCd;
@Schema(description = "내역표시 {1:전체내역, 2:최종내역}")
@JsonProperty("DSCTN_INDCT")
private String dsctnIndct;
@Schema(description = "조회구분코드 (자동설정: 1:열람 고정)")
@JsonProperty("INQ_SE_CD")
private String inqSeCd;
}

@ -0,0 +1,343 @@
package com.vmis.interfaceapp.model.ledger;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Getter;
import lombok.Setter;
import java.util.List;
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
@Schema(description = "자동차등록원부(갑) 응답 모델 (신버전)")
@Getter
@Setter
public class NewLedgerResponse {
@JsonProperty("CNTC_RESULT_CODE")
private String cntcResultCode;
@JsonProperty("CNTC_RESULT_DTLS")
private String cntcResultDtls;
/** 원부그룹번호 */
@JsonProperty("LEDGER_GROUP_NO")
private String ledgerGroupNo;
/** 원부개별번호 */
@JsonProperty("LEDGER_INDIV_NO")
private String ledgerIndivNo;
/** 차량관리번호 */
@JsonProperty("VHMNO")
private String vhmno;
/** 차량등록번호 */
@JsonProperty("VHRNO")
private String vhrno;
/** 차대번호 */
@JsonProperty("VIN")
private String vin;
/** 차종종별코드 */
@JsonProperty("CARMDL_ASORT_CD")
private String carmdlAsortCd;
/** 차종종별명 */
@JsonProperty("CARMDL_ASORT_NM")
private String carmdlAsortNm;
/** 차명 */
@JsonProperty("ATMB_NM")
private String atmbNm;
/** 색상코드 */
@JsonProperty("COLOR_CD")
private String colorCd;
/** 색상명 */
@JsonProperty("COLOR_NM")
private String colorNm;
/** 번호판규격코드 */
@JsonProperty("NOPLT_SPCFCT_CD")
private String nopltSpcfctCd;
/** 번호판규격명 */
@JsonProperty("NOPLT_SPCFCT_NM")
private String nopltSpcfctNm;
/** 용도구분코드 */
@JsonProperty("USG_SE_CD")
private String usgSeCd;
/** 용도구분명 */
@JsonProperty("USG_SE_NM")
private String usgSeNm;
/** 원동기형식명 */
@JsonProperty("MTRS_FOM_NM")
private String mtrsFomNm;
/** 형식명 */
@JsonProperty("FOM_NM")
private String fomNm;
/** 취득금액 */
@JsonProperty("ACQS_AMT")
private String acqsAmt;
/** 등록상세코드 */
@JsonProperty("REG_DTL_CD")
private String regDtlCd;
/** 등록상세명 */
@JsonProperty("REG_DTL_NM")
private String regDtlNm;
/** 최초등록일 */
@JsonProperty("FRST_REG_YMD")
private String frstRegYmd;
/** 차령종료일 */
@JsonProperty("VEAG_END_YMD")
private String veagEndYmd;
/** 연식 */
@JsonProperty("YRIDNW")
private String yridnw;
/** 제원관리번호1 */
@JsonProperty("SPMNNO_1")
private String spmnno1;
/** 제원관리번호2 */
@JsonProperty("SPMNNO_2")
private String spmnno2;
/** 제작년월일 */
@JsonProperty("FBCTN_YMD")
private String fbctnYmd;
/** 주행거리 */
@JsonProperty("DRVNG_DSTNC")
private String drvngDstnc;
/** 검사유효기간시작일 */
@JsonProperty("INSP_VLD_PD_BGNG_YMD")
private String inspVldPdBgngYmd;
/** 검사유효기간종료일 */
@JsonProperty("INSP_VLD_PD_END_YMD")
private String inspVldPdEndYmd;
/** 점검유효기간시작일 */
@JsonProperty("CHCK_VLD_PD_BGNG_YMD")
private String chckVldPdBgngYmd;
/** 점검유효기간종료일 */
@JsonProperty("CHCK_VLD_PD_END_YMD")
private String chckVldPdEndYmd;
/** 등록신청구분명 */
@JsonProperty("REG_APLY_SE_NM")
private String regAplySeNm;
/** 최초등록접수번호 */
@JsonProperty("FRST_REG_APLY_RCPT_NO")
private String frstRegAplyRcptNo;
/** 번호판영치최고일 */
@JsonProperty("NOPLT_CSDY_AVTSMT_YMD")
private String nopltCsdyAvtsmtYmd;
/** 번호판영치여부 */
@JsonProperty("NOPLT_CSDY_YN")
private String nopltCsdyYn;
/** 사업용사용기간 */
@JsonProperty("BSS_USE_PD_YMD")
private String bssUsePdYmd;
/** 직권말소예고통지일 */
@JsonProperty("OCTHT_ERSR_PRVNTC_AVTSMT_YMD")
private String octhtErsrPrvntcAvtsmtYmd;
/** 말소등록일 */
@JsonProperty("ERSR_REG_YMD")
private String ersrRegYmd;
/** 말소등록구분코드 */
@JsonProperty("ERSR_REG_SE_CD")
private String ersrRegSeCd;
/** 말소등록구분명 */
@JsonProperty("ERSR_REG_SE_NM")
private String ersrRegSeNm;
/** 저당수 */
@JsonProperty("MRTG_CNT")
private String mrtgCnt;
/** 압류건수 */
@JsonProperty("SZR_CNT")
private String szrCnt;
/** 구조변경수 */
@JsonProperty("STRCT_CHG_CNT")
private String strctChgCnt;
/** 사용본거지주소 */
@JsonProperty("USGSRHLD_ADDR_1")
private String usgsrhldAddr1;
/** 사용본거지주소상세 */
@JsonProperty("USGSRHLD_ADDR_DTL_1")
private String usgsrhldAddrDtl1;
/** 소유자주소 */
@JsonProperty("OWNR_ADDR")
private String ownrAddr;
/** 소유자주소상세 */
@JsonProperty("OWNR_ADDR_DTL")
private String ownrAddrDtl;
/** 개인사업자여부 */
@JsonProperty("INDVDL_BZMN_YN")
private String indvdlBzmnYn;
/** 대표소유자전화번호 */
@JsonProperty("RPRS_OWNR_TELNO")
private String rprsOwnrTelno;
/** 대표소유자성명 */
@JsonProperty("RPRS_OWNR_NM")
private String rprsOwnrNm;
/** 대표소유자회원구분코드 */
@JsonProperty("RPRS_OWNR_MBR_SE_CD")
private String rprsOwnrMbrSeCd;
/** 대표소유자회원번호 */
@JsonProperty("RPRSV_OWNR_IDECNO")
private String rprsvOwnrIdecno;
/** 비과세대상구분코드명 */
@JsonProperty("TAXXMPT_APLCN_SE_CD")
private String taxxmptAplcnSeCd;
/** 비과세대상구분코드 */
@JsonProperty("TAXXMPT_TRPR_SE_CD")
private String taxxmptTrprSeCd;
/** 특기사항건수 */
@JsonProperty("SPCABL_MTTR_CNT")
private String spcablMttrCnt;
/** 사용본거지행정동명 */
@JsonProperty("USGSRHLD_DONG_NM")
private String usgsrhldDongNm;
/** 예고수 */
@JsonProperty("PRVNTC_CNT")
private String prvntcCnt;
/** 수출이행여부신고일 */
@JsonProperty("XPORT_FLFL_YN_DCLR_YMD")
private String xportFlflYnDclrYmd;
/** 발급번호 */
@JsonProperty("ISSU_NO")
private String issuNo;
/** 최초양도일 */
@JsonProperty("FRST_TRNSFR_YMD")
private String frstTrnsfrYmd;
/** 구동축전지식별번호 */
@JsonProperty("DRIV_SRGBTRY_IDNTF_NO")
private String drivSrgbtryIdntfNo;
/** 처리불가사유코드 */
@JsonProperty("PROCESS_IMPRTY_RESN_CODE")
private String processImprtyResnCode;
/** 처리불가사유상세 */
@JsonProperty("PROCESS_IMPRTY_RESN_DTLS")
private String processImprtyResnDtls;
@JsonProperty("record")
private List<Record> record;
@JsonInclude(JsonInclude.Include.NON_NULL)
@JsonIgnoreProperties(ignoreUnknown = true)
@Schema(name = "NewLedgerRecord", description = "원부 변경내역 record (신버전)")
@Getter
@Setter
public static class Record {
/** 해제여부 */
@JsonProperty("SZR_RMV_DTL_SN")
private String szrRmvDtlSn;
/** 변경업무구분코드 */
@JsonProperty("CHG_TASK_SE_CD")
private String chgTaskSeCd;
/** 주번호 */
@JsonProperty("MAIN_NO")
private String mainNo;
/** 부번호 */
@JsonProperty("SNO")
private String sno;
/** 사항란 */
@JsonProperty("SPCABL_MTTR")
private String spcablMttr;
/** 세대주명 */
@JsonProperty("HSHLDR_NM")
private String hshldrNm;
/** 세대주개인암호화번호 */
@JsonProperty("HSHLDR_IDECNO")
private String hshldrIdecno;
/** 접수번호 */
@JsonProperty("APLY_RCPT_NO")
private String aplyRcptNo;
/** 차량관리번호 */
@JsonProperty("VHMNO")
private String vhmno;
/** 원부그룹번호 */
@JsonProperty("LEDGER_GROUP_NO")
private String ledgerGroupNo;
/** 원부개별번호 */
@JsonProperty("LEDGER_INDIV_NO")
private String ledgerIndivNo;
/** 변경업무구분명 */
@JsonProperty("CHG_TASK_SE_NM")
private String chgTaskSeNm;
/** 변경일자 */
@JsonProperty("CHG_YMD")
private String chgYmd;
/** 상세순번 */
@JsonProperty("DTL_SN")
private String dtlSn;
/** 표기여부 */
@JsonProperty("FLAG")
private String flag;
}
}

@ -1,82 +0,0 @@
package com.vmis.interfaceapp.service;
import com.vmis.interfaceapp.client.GovernmentApi;
import com.vmis.interfaceapp.model.basic.BasicRequest;
import com.vmis.interfaceapp.model.basic.BasicResponse;
import com.vmis.interfaceapp.model.common.Envelope;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
/**
*
*
* <p>API .</p>
* <ul>
* <li> : createInitialRequest() - 퀀 ID INSERT</li>
* <li> : updateResponse() - UPDATE</li>
* </ul>
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class CarBassMatterInqireService {
private final GovernmentApi governmentApi;
private final RequestEnricher enricher;
//private final CarBassMatterInqireLogService logService;
/**
* : -> -> -> .
*/
public ResponseEntity<Envelope<BasicResponse>> basic(Envelope<BasicRequest> envelope) {
// 1) 요청 보강
enricher.enrichBasic(envelope);
String generatedId = null;
try {
// 2) 최초 요청 로그 저장 (첫 번째 데이터 기준)
/*if (envelope.getData() != null && !envelope.getData().isEmpty()) {
BasicRequest req = envelope.getData().get(0);
CarBassMatterInqireVO logEntity = CarBassMatterInqireVO.fromRequest(req);
generatedId = logService.createInitialRequestNewTx(logEntity);
}*/
// 3) 외부 API 호출
ResponseEntity<Envelope<BasicResponse>> response = governmentApi.callBasic(envelope);
// 4) 응답 로그 업데이트
// 원본 소스, 정상적인 호출, 리턴(에러 리턴포함) 일 경우에만 에러 로그 남김
/*if (generatedId != null && response.getBody() != null) {
CarBassMatterInqireVO update = CarBassMatterInqireVO.fromResponse(generatedId, response.getBody());
if (update != null) {
logService.updateResponseNewTx(update);
}
}*/
return response;
} catch (Exception e) {
// 5) 오류 로그 업데이트
/*if (generatedId != null) {
try {
String detail = ExceptionDetailUtil.buildForLog(e);
CarBassMatterInqireVO errorLog = CarBassMatterInqireVO.builder()
.carBassMatterInqireId(generatedId) // 자동차기본사항조회 ID (PK)
.cntcResultCode(ApiConstant.CNTC_RESULT_CODE_ERROR) // 연계결과코드 (에러)
.cntcResultDtls(detail) // 연계결과상세 (에러 메시지)
.build();
logService.updateResponseNewTx(errorLog);
log.error("[BASIC-ERR-LOG] API 호출 에러 정보 저장 완료(별도TX) - ID: {}, detail: {}", generatedId, detail, e);
} catch (Exception ignore) {
log.error("[BASIC-ERR-LOG] 에러 로그 저장 실패 - ID: {}", generatedId, ignore);
}
}*/
throw e;
}
}
}

@ -1,70 +0,0 @@
package com.vmis.interfaceapp.service;
import com.vmis.interfaceapp.client.GovernmentApi;
import com.vmis.interfaceapp.model.common.Envelope;
import com.vmis.interfaceapp.model.ledger.LedgerRequest;
import com.vmis.interfaceapp.model.ledger.LedgerResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
/**
* () ()
* - , API ,
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class CarLedgerFrmbkService {
private final GovernmentApi governmentApi;
private final RequestEnricher enricher;
/**
* () : -> (TX) -> -> (/, TX) -> (TX).
*/
public ResponseEntity<Envelope<LedgerResponse>> ledger(Envelope<LedgerRequest> envelope) {
// 1) 요청 보강
enricher.enrichLedger(envelope);
String generatedId = null;
try {
// 3) 외부 API 호출
ResponseEntity<Envelope<LedgerResponse>> response = governmentApi.callLedger(envelope);
// 4) 응답 로그 업데이트 (마스터 + 상세)
/*if (generatedId != null && response.getBody() != null &&
response.getBody().getData() != null && !response.getBody().getData().isEmpty()) {
LedgerResponse body = response.getBody().getData().get(0);
CarLedgerFrmbkVO masterUpdate = CarLedgerFrmbkVO.fromResponseMaster(generatedId, body);
logService.updateResponseNewTx(masterUpdate);
List<CarLedgerFrmbkDtlVO> details = CarLedgerFrmbkDtlVO.listFromResponse(body, generatedId);
if (details != null && !details.isEmpty()) {
logService.saveDetailsNewTx(generatedId, details);
}
}*/
return response;
} catch (Exception e) {
// 5) 오류 로그 업데이트
/*if (generatedId != null) {
try {
String detail = ExceptionDetailUtil.buildForLog(e);
CarLedgerFrmbkVO errorLog = CarLedgerFrmbkVO.builder()
.carLedgerFrmbkId(generatedId)
.cntcResultCode(ApiConstant.CNTC_RESULT_CODE_ERROR)
.cntcResultDtls(detail)
.build();
logService.updateResponseNewTx(errorLog);
log.error("[LEDGER-ERR-LOG] API 호출 에러 정보 저장 완료(별도TX) - ID: {}, detail: {}", generatedId, detail, e);
} catch (Exception ignore) {
log.error("[LEDGER-ERR-LOG] 에러 로그 저장 실패 - ID: {}", generatedId, ignore);
}
}*/
throw e;
}
}
}

@ -0,0 +1,33 @@
package com.vmis.interfaceapp.service;
import com.vmis.interfaceapp.client.GovernmentApi;
import com.vmis.interfaceapp.model.common.Envelope;
import com.vmis.interfaceapp.model.ledger.NewLedgerRequest;
import com.vmis.interfaceapp.model.ledger.NewLedgerResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
/**
* () ()
* - , API ,
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class NewCarLedgerFrmbkService {
private final GovernmentApi governmentApi;
private final RequestEnricher enricher;
public ResponseEntity<Envelope<NewLedgerResponse>> ledger(Envelope<NewLedgerRequest> envelope) {
// 1) 요청 보강
enricher.enrichNewLedger(envelope);
// 2) 외부 API 호출
ResponseEntity<Envelope<NewLedgerResponse>> response = governmentApi.callNewLedger(envelope);
return response;
}
}

@ -0,0 +1,37 @@
package com.vmis.interfaceapp.service;
import com.vmis.interfaceapp.client.GovernmentApi;
import com.vmis.interfaceapp.model.basic.OldBasicRequest;
import com.vmis.interfaceapp.model.basic.OldBasicResponse;
import com.vmis.interfaceapp.model.common.Envelope;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
/**
* ()
*
* <p>API .</p>
* <ul>
* <li> : createInitialRequest() - 퀀 ID INSERT</li>
* <li> : updateResponse() - UPDATE</li>
* </ul>
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class OldCarBassMatterInqireService {
private final GovernmentApi governmentApi;
private final RequestEnricher enricher;
public ResponseEntity<Envelope<OldBasicResponse>> basic(Envelope<OldBasicRequest> envelope) {
// 1) 요청 보강
enricher.enrichOldBasic(envelope);
// 2) 외부 API 호출
ResponseEntity<Envelope<OldBasicResponse>> response = governmentApi.callOldBasic(envelope);
return response;
}
}

@ -1,38 +1,50 @@
package com.vmis.interfaceapp.service;
import com.vmis.interfaceapp.config.properties.VmisProperties;
import com.vmis.interfaceapp.model.basic.BasicRequest;
import com.vmis.interfaceapp.config.properties.NewVmisProperties;
import com.vmis.interfaceapp.config.properties.OldVmisProperties;
import com.vmis.interfaceapp.model.basic.OldBasicRequest;
import com.vmis.interfaceapp.model.common.Envelope;
import com.vmis.interfaceapp.model.ledger.LedgerRequest;
import com.vmis.interfaceapp.model.ledger.NewLedgerRequest;
import org.springframework.stereotype.Component;
import lombok.extern.slf4j.Slf4j;
/**
* Populates incoming request models with values from YAML configuration.
* Unconditionally overwrites the listed fields per requirement:
* - INFO_SYS_ID, INFO_SYS_IP, SIGUNGU_CODE
* - CNTC_INFO_CODE (service specific)
* - CHARGER_ID, CHARGER_IP, CHARGER_NM
* - INQIRE_SE_CODE (automatic based on business rules)
* - Basic: VHRNO not null 3:, VIN not null 2:
* - Ledger: Always 1 ()
*
* <p> (OldBasicRequest):</p>
* <ul>
* <li>INFO_SYS_ID, INFO_SYS_IP, SIGUNGU_CODE</li>
* <li>CNTC_INFO_CODE (service specific)</li>
* <li>CHARGER_ID, CHARGER_IP, CHARGER_NM</li>
* <li>INQIRE_SE_CODE: VHRNO not null 3:, VIN not null 2:</li>
* </ul>
*
* <p> (NewLedgerRequest):</p>
* <ul>
* <li>INFO_SYS_ID, INFO_SYS_IP_ADDR, SGG_CD</li>
* <li>LINK_INFO_CD (service specific)</li>
* <li>PIC_ID, PIC_IP_ADDR, PIC_NM</li>
* <li>INQ_SE_CD: Always 1 ()</li>
* </ul>
*/
@Slf4j
@Component
public class RequestEnricher {
private final VmisProperties props;
private final OldVmisProperties oldProps;
private final NewVmisProperties newProps;
public RequestEnricher(VmisProperties props) {
this.props = props;
public RequestEnricher(OldVmisProperties oldProps, NewVmisProperties newProps) {
this.oldProps = oldProps;
this.newProps = newProps;
}
public void enrichBasic(Envelope<BasicRequest> envelope) {
public void enrichOldBasic(Envelope<OldBasicRequest> envelope) {
if (envelope == null || envelope.getData() == null) return;
VmisProperties.SystemProps sys = props.getSystem();
String cntc = props.getGov().getServices().getBasic().getCntcInfoCode();
for (BasicRequest req : envelope.getData()) {
OldVmisProperties.SystemProps sys = oldProps.getSystem();
String cntc = oldProps.getGov().getServices().getBasic().getCntcInfoCode();
for (OldBasicRequest req : envelope.getData()) {
if (req == null) continue;
// 메타 필드 보강 (data level)
req.setInfoSysId(sys.getInfoSysId());
@ -44,10 +56,10 @@ public class RequestEnricher {
req.setChargerNm(sys.getChargerNm());
// record 배열이 없으면 생성 (최소 1개)
java.util.List<BasicRequest.Record> records = req.getRecord();
java.util.List<OldBasicRequest.Record> records = req.getRecord();
if (records == null || records.isEmpty()) {
BasicRequest.Record r = new BasicRequest.Record();
java.util.ArrayList<BasicRequest.Record> list = new java.util.ArrayList<>();
OldBasicRequest.Record r = new OldBasicRequest.Record();
java.util.ArrayList<OldBasicRequest.Record> list = new java.util.ArrayList<>();
list.add(r);
req.setRecord(list);
records = list;
@ -55,46 +67,47 @@ public class RequestEnricher {
// 자동차 기본사항 조회 시 INQIRE_SE_CODE 자동 설정
// VHRNO(차량번호) not null → 3:자동차번호, VIN(차대번호) not null → 2:차대번호
BasicRequest.Record first = records.get(0);
if (first.getVhrno() != null && !first.getVhrno().trim().isEmpty()) {
first.setInqireSeCode("3");
} else if (first.getVin() != null && !first.getVin().trim().isEmpty()) {
first.setInqireSeCode("2");
for (OldBasicRequest.Record record : records) {
if (record.getVhrno() != null && !record.getVhrno().trim().isEmpty()) {
record.setInqireSeCode("3");
} else if (record.getVin() != null && !record.getVin().trim().isEmpty()) {
record.setInqireSeCode("2");
}
}
}
log.debug("[ENRICH] basic: applied INFO_SYS_ID={}, INFO_SYS_IP={}, SIGUNGU_CODE={}, CNTC_INFO_CODE={}",
log.debug("[ENRICH] oldBasic: applied INFO_SYS_ID={}, INFO_SYS_IP={}, SIGUNGU_CODE={}, CNTC_INFO_CODE={}",
sys.getInfoSysId(), sys.getInfoSysIp(), sys.getSigunguCode(), cntc);
}
public void enrichLedger(Envelope<LedgerRequest> envelope) {
public void enrichNewLedger(Envelope<NewLedgerRequest> envelope) {
if (envelope == null || envelope.getData() == null) return;
VmisProperties.SystemProps sys = props.getSystem();
String cntc = props.getGov().getServices().getLedger().getCntcInfoCode();
for (LedgerRequest req : envelope.getData()) {
NewVmisProperties.SystemProps sys = newProps.getSystem();
String linkInfoCd = newProps.getGov().getServices().getLedger().getLinkInfoCd();
for (NewLedgerRequest req : envelope.getData()) {
if (req == null) continue;
req.setInfoSysId(sys.getInfoSysId());
req.setInfoSysIp(sys.getInfoSysIp());
req.setSigunguCode(sys.getSigunguCode());
req.setCntcInfoCode(cntc);
req.setChargerId(sys.getChargerId());
req.setChargerIp(sys.getChargerIp());
req.setChargerNm(sys.getChargerNm());
req.setInfoSysIpAddr(sys.getInfoSysIpAddr());
req.setSggCd(sys.getSggCd());
req.setLinkInfoCd(linkInfoCd);
req.setPicId(sys.getPicId());
req.setPicIpAddr(sys.getPicIpAddr());
req.setPicNm(sys.getPicNm());
// 고정값 설정 (값이 없는 경우에만 설정)
if (req.getOnesInformationOpen() == null || req.getOnesInformationOpen().isEmpty()) {
req.setOnesInformationOpen("1"); // 개인정보공개 (소유자공개)
if (req.getPrvcRls() == null || req.getPrvcRls().isEmpty()) {
req.setPrvcRls("1"); // 개인정보공개 (소유자공개)
}
if (req.getRouteSeCode() == null || req.getRouteSeCode().isEmpty()) {
req.setRouteSeCode("3"); // 경로구분코드
if (req.getPathSeCd() == null || req.getPathSeCd().isEmpty()) {
req.setPathSeCd("3"); // 경로구분코드
}
if (req.getDetailExpression() == null || req.getDetailExpression().isEmpty()) {
req.setDetailExpression("1"); // 내역표시 (전체내역)
if (req.getDsctnIndct() == null || req.getDsctnIndct().isEmpty()) {
req.setDsctnIndct("1"); // 내역표시 (전체내역)
}
if (req.getInqireSeCode() == null || req.getInqireSeCode().isEmpty()) {
req.setInqireSeCode("1"); // 조회구분코드 (열람)
if (req.getInqSeCd() == null || req.getInqSeCd().isEmpty()) {
req.setInqSeCd("1"); // 조회구분코드 (열람)
}
}
log.debug("[ENRICH] ledger: applied INFO_SYS_ID={}, INFO_SYS_IP={}, SIGUNGU_CODE={}, CNTC_INFO_CODE={}",
sys.getInfoSysId(), sys.getInfoSysIp(), sys.getSigunguCode(), cntc);
log.debug("[ENRICH] newLedger: applied INFO_SYS_ID={}, INFO_SYS_IP_ADDR={}, SGG_CD={}, LINK_INFO_CD={}",
sys.getInfoSysId(), sys.getInfoSysIpAddr(), sys.getSggCd(), linkInfoCd);
}
}

@ -1,6 +1,6 @@
package com.vmis.interfaceapp.util;
import com.vmis.interfaceapp.config.properties.VmisProperties;
import com.vmis.interfaceapp.config.properties.GpkiProperties;
import lombok.Getter;
import lombok.Setter;
@ -29,7 +29,7 @@ public class GpkiCryptoUtil {
private NewGpkiUtil delegate;
public static GpkiCryptoUtil from(VmisProperties.GpkiProps props) throws Exception {
public static GpkiCryptoUtil from(GpkiProperties props) throws Exception {
GpkiCryptoUtil util = new GpkiCryptoUtil();
util.setGpkiLicPath(props.getGpkiLicPath());
util.setLdap(props.getLdap());

@ -56,45 +56,73 @@ logging:
org.springframework: INFO # Spring Framework 로거 레벨
org.springframework.web: DEBUG # Spring Web 로거 레벨 - HTTP 요청/응답 로그 포함
# 인터페이스 및 연계 설정 - 개발(DEV) 환경
vmis:
system:
infoSysId: "41-345" # 정보시스템 ID
infoSysIp: "105.19.10.135" # 정보시스템 IP 주소
sigunguCode: "41460" # 시군구 코드 (경기도 용인시)
departmentCode: "" # 부서 코드
chargerId: "" # 담당자 ID
chargerIp: "" # 담당자 IP 주소
chargerNm: "" # 담당자 이름
gpki:
enabled: "N" # GPKI 사용 여부 (개발환경에서는 비활성화)
useSign: true # 서명 사용 여부
charset: "UTF-8" # 문자셋 인코딩
certServerId: "SVR5640020001" # 인증서 서버 ID (요청 시스템)
targetServerId: "SVR1611000006" # 대상 서버 ID (차세대교통안전공단)
ldap: true # LDAP 사용 여부
gpkiLicPath: "C:\\GPKI\\VMIS-Lic" # GPKI 라이선스 파일 경로
certFilePath: "c:\\GPKI\\Certificate\\class1" # 인증서 파일 디렉토리 경로
envCertFilePathName: "c:\\GPKI\\Certificate\\class1\\SVR5640020001_env.cer" # 암호화용 인증서 파일 경로
envPrivateKeyFilePathName: "c:\\GPKI\\Certificate\\class1\\SVR5640020001_env.key" # 암호화용 개인키 파일 경로
envPrivateKeyPasswd: "*sbm204221" # 암호화용 개인키 비밀번호
sigCertFilePathName: "c:\\GPKI\\Certificate\\class1\\SVR5640020001_sig.cer" # 서명용 인증서 파일 경로
sigPrivateKeyFilePathName: "c:\\GPKI\\Certificate\\class1\\SVR5640020001_sig.key" # 서명용 개인키 파일 경로
sigPrivateKeyPasswd: "*sbm204221" # 서명용 개인키 비밀번호
gov:
scheme: "http" # 프로토콜 (http/https)
host: "10.188.225.94:29001" # 개발(DEV) 행정망 호스트 및 포트
basePath: "/piss/api/molit" # API 기본 경로
connectTimeoutMillis: 5000 # 연결 타임아웃 (밀리초) - 5초
readTimeoutMillis: 10000 # 읽기 타임아웃 (밀리초) - 10초
services:
basic: # 시군구연계 자동차기본사항조회 서비스
path: "/SignguCarBassMatterInqireService" # 서비스 경로
cntcInfoCode: "AC1_FD11_01" # 연계정보코드
apiKey: "05e8d748fb366a0831dce71a32424460746a72d591cf483ccc130534dd51e394" # API 인증키
cvmisApikey: "014F9215-B6D9A3B6-4CED5225-68408C46" # CVMIS API 키
ledger: # 시군구연계 자동차등록원부(갑) 서비스
path: "/SignguCarLedgerFrmbkService" # 서비스 경로
cntcInfoCode: "AC1_FD11_02" # 연계정보코드
apiKey: "1beeb01857c2e7e9b41c002b007ccb9754d9c272f66d4bb64fc45b302c69e529" # API 인증키
cvmisApikey: "63DF159B-7B9C64C5-86CCB15C-5F93E750" # CVMIS API 키
# HTTP 클라이언트 설정 - 공통
http:
connectTimeoutMillis: 5000 # 연결 타임아웃 (밀리초) - 5초
readTimeoutMillis: 10000 # 읽기 타임아웃 (밀리초) - 10초
# GPKI 설정 - 공통
gpki:
enabled: "N" # GPKI 사용 여부 (개발환경에서는 비활성화)
useSign: true # 서명 사용 여부
charset: "UTF-8" # 문자셋 인코딩
certServerId: "SVR5640020001" # 인증서 서버 ID (요청 시스템)
targetServerId: "SVR1611000006" # 대상 서버 ID (차세대교통안전공단)
ldap: true # LDAP 사용 여부
gpkiLicPath: "C:\\GPKI\\VMIS-Lic" # GPKI 라이선스 파일 경로
certFilePath: "c:\\GPKI\\Certificate\\class1" # 인증서 파일 디렉토리 경로
envCertFilePathName: "c:\\GPKI\\Certificate\\class1\\SVR5640020001_env.cer" # 암호화용 인증서 파일 경로
envPrivateKeyFilePathName: "c:\\GPKI\\Certificate\\class1\\SVR5640020001_env.key" # 암호화용 개인키 파일 경로
envPrivateKeyPasswd: "*sbm204221" # 암호화용 개인키 비밀번호
sigCertFilePathName: "c:\\GPKI\\Certificate\\class1\\SVR5640020001_sig.cer" # 서명용 인증서 파일 경로
sigPrivateKeyFilePathName: "c:\\GPKI\\Certificate\\class1\\SVR5640020001_sig.key" # 서명용 개인키 파일 경로
sigPrivateKeyPasswd: "*sbm204221" # 서명용 개인키 비밀번호
# 구버전 인터페이스 및 연계 설정 - 개발(DEV) 환경
old:
vmis:
system:
infoSysId: "41-345" # 정보시스템 ID
infoSysIp: "105.19.10.135" # 정보시스템 IP 주소
sigunguCode: "41460" # 시군구 코드 (경기도 용인시)
departmentCode: "" # 부서 코드
chargerId: "" # 담당자 ID
chargerIp: "" # 담당자 IP 주소
chargerNm: "" # 담당자 이름
gov:
scheme: "http" # 프로토콜 (http/https)
host: "10.188.225.94:29001" # 개발(DEV) 행정망 호스트 및 포트
basePath: "/piss/api/molit" # API 기본 경로
services:
basic: # 시군구연계 자동차기본사항조회 서비스 (구버전)
path: "/SignguCarBassMatterInqireService" # 서비스 경로
cntcInfoCode: "AC1_FD11_01" # 연계정보코드
apiKey: "05e8d748fb366a0831dce71a32424460746a72d591cf483ccc130534dd51e394" # API 인증키
cvmisApikey: "014F9215-B6D9A3B6-4CED5225-68408C46" # CVMIS API 키
# 시군구연계 자동차등록원부(갑) 서비스 (구버전, 없음.)
# 신버전 인터페이스 및 연계 설정 - 개발(DEV) 환경
new:
vmis:
system:
infoSysId: "41-345" # 정보시스템 ID
infoSysIpAddr: "105.19.10.135" # 정보시스템 IP 주소
sggCd: "41460" # 시군구 코드 (경기도 용인시)
picId: "" # 담당자 ID
picIpAddr: "" # 담당자 IP 주소
picNm: "" # 담당자 이름
gov:
scheme: "http" # 프로토콜 (http/https)
host: "10.188.225.94:29001" # 개발(DEV) 행정망 호스트 및 포트
basePath: "/piss/api/molit" # API 기본 경로
services:
basic: # 시군구연계 자동차기본사항조회 서비스 (신규버전)
path: "/SignguCarBassMatterInqireService" # 서비스 경로
linkInfoCd: "AC1_FD11_01" # 연계정보코드
apiKey: "05e8d748fb366a0831dce71a32424460746a72d591cf483ccc130534dd51e394" # API 인증키
cvmisApikey: "014F9215-B6D9A3B6-4CED5225-68408C46" # CVMIS API 키
ledger: # 시군구연계 자동차등록원부(갑) 서비스 (신규버전)
path: "/SignguCarLedgerFrmbkService" # 서비스 경로
linkInfoCd: "AC1_FD11_02" # 연계정보코드
apiKey: "1beeb01857c2e7e9b41c002b007ccb9754d9c272f66d4bb64fc45b302c69e529" # API 인증키
cvmisApikey: "63DF159B-7B9C64C5-86CCB15C-5F93E750" # CVMIS API 키

@ -18,46 +18,73 @@ logging:
org.springframework: WARN # Spring Framework 로거 레벨 - 경고 이상만 출력
org.springframework.web: INFO # Spring Web 로거 레벨 - 요청/응답 기본 정보 출력
# 인터페이스 및 연계 설정 - 운영(PRD) 환경
# 주의: 실제 운영 키/호스트는 배포 환경 변수나 외부 설정(Secret)로 주입 권장
vmis:
system:
infoSysId: "41-345" # 정보시스템 ID
infoSysIp: "105.19.10.135" # 정보시스템 IP 주소
sigunguCode: "41460" # 시군구 코드 (경기도 용인시)
departmentCode: "" # 부서 코드
chargerId: "" # 담당자 ID
chargerIp: "" # 담당자 IP 주소
chargerNm: "" # 담당자 이름
gpki:
enabled: "Y" # GPKI 사용 여부 (운영환경에서는 활성화)
useSign: true # 서명 사용 여부
charset: "UTF-8" # 문자셋 인코딩
certServerId: "SVR5640020001" # 인증서 서버 ID (요청 시스템)
targetServerId: "SVR1611000006" # 대상 서버 ID (차세대교통안전공단)
ldap: true # LDAP 사용 여부
gpkiLicPath: "C:\\GPKI\\VMIS-Lic" # GPKI 라이선스 파일 경로
certFilePath: "c:\\GPKI\\Certificate\\class1" # 인증서 파일 디렉토리 경로
envCertFilePathName: "c:\\GPKI\\Certificate\\class1\\SVR5640020001_env.cer" # 암호화용 인증서 파일 경로
envPrivateKeyFilePathName: "c:\\GPKI\\Certificate\\class1\\SVR5640020001_env.key" # 암호화용 개인키 파일 경로
envPrivateKeyPasswd: "*sbm204221" # 암호화용 개인키 비밀번호
sigCertFilePathName: "c:\\GPKI\\Certificate\\class1\\SVR5640020001_sig.cer" # 서명용 인증서 파일 경로
sigPrivateKeyFilePathName: "c:\\GPKI\\Certificate\\class1\\SVR5640020001_sig.key" # 서명용 개인키 파일 경로
sigPrivateKeyPasswd: "*sbm204221" # 서명용 개인키 비밀번호
gov:
scheme: "http" # 프로토콜 (http/https)
host: "10.188.225.25:29001" # 운영(PRD) 행정망 호스트 및 포트 (명세에 맞춰 수정)
basePath: "/piss/api/molit" # API 기본 경로
connectTimeoutMillis: 5000 # 연결 타임아웃 (밀리초) - 5초
readTimeoutMillis: 10000 # 읽기 타임아웃 (밀리초) - 10초
services:
basic: # 시군구연계 자동차기본사항조회 서비스
path: "/SignguCarBassMatterInqireService" # 서비스 경로
cntcInfoCode: "AC1_FD11_01" # 연계정보코드
apiKey: "05e8d748fb366a0831dce71a32424460746a72d591cf483ccc130534dd51e394" # API 인증키
cvmisApikey: "014F9215-B6D9A3B6-4CED5225-68408C46" # CVMIS API 키
ledger: # 시군구연계 자동차등록원부(갑) 서비스
path: "/SignguCarLedgerFrmbkService" # 서비스 경로
cntcInfoCode: "AC1_FE08_01" # 연계정보코드
apiKey: "1beeb01857c2e7e9b41c002b007ccb9754d9c272f66d4bb64fc45b302c69e529" # API 인증키
cvmisApikey: "63DF159B-7B9C64C5-86CCB15C-5F93E750" # CVMIS API 키
# HTTP 클라이언트 설정 - 공통
http:
connectTimeoutMillis: 5000 # 연결 타임아웃 (밀리초) - 5초
readTimeoutMillis: 10000 # 읽기 타임아웃 (밀리초) - 10초
# GPKI 설정 - 공통
gpki:
enabled: "Y" # GPKI 사용 여부 (운영환경에서는 활성화)
useSign: true # 서명 사용 여부
charset: "UTF-8" # 문자셋 인코딩
certServerId: "SVR5640020001" # 인증서 서버 ID (요청 시스템)
targetServerId: "SVR1611000006" # 대상 서버 ID (차세대교통안전공단)
ldap: true # LDAP 사용 여부
gpkiLicPath: "C:\\GPKI\\VMIS-Lic" # GPKI 라이선스 파일 경로
certFilePath: "c:\\GPKI\\Certificate\\class1" # 인증서 파일 디렉토리 경로
envCertFilePathName: "c:\\GPKI\\Certificate\\class1\\SVR5640020001_env.cer" # 암호화용 인증서 파일 경로
envPrivateKeyFilePathName: "c:\\GPKI\\Certificate\\class1\\SVR5640020001_env.key" # 암호화용 개인키 파일 경로
envPrivateKeyPasswd: "*sbm204221" # 암호화용 개인키 비밀번호
sigCertFilePathName: "c:\\GPKI\\Certificate\\class1\\SVR5640020001_sig.cer" # 서명용 인증서 파일 경로
sigPrivateKeyFilePathName: "c:\\GPKI\\Certificate\\class1\\SVR5640020001_sig.key" # 서명용 개인키 파일 경로
sigPrivateKeyPasswd: "*sbm204221" # 서명용 개인키 비밀번호
# 구버전 인터페이스 및 연계 설정 - 운영(PRD) 환경
old:
vmis:
system:
infoSysId: "41-345" # 정보시스템 ID
infoSysIp: "105.19.10.135" # 정보시스템 IP 주소
sigunguCode: "41460" # 시군구 코드 (경기도 용인시)
departmentCode: "" # 부서 코드
chargerId: "" # 담당자 ID
chargerIp: "" # 담당자 IP 주소
chargerNm: "" # 담당자 이름
gov:
scheme: "http" # 프로토콜 (http/https)
host: "10.188.225.25:29001" # 운영(PRD) 행정망 호스트 및 포트 (명세에 맞춰 수정)
basePath: "/piss/api/molit" # API 기본 경로
services:
basic: # 시군구연계 자동차기본사항조회 서비스 (구버전)
path: "/SignguCarBassMatterInqireService" # 서비스 경로
cntcInfoCode: "AC1_FD11_01" # 연계정보코드
apiKey: "05e8d748fb366a0831dce71a32424460746a72d591cf483ccc130534dd51e394" # API 인증키
cvmisApikey: "014F9215-B6D9A3B6-4CED5225-68408C46" # CVMIS API 키
# 시군구연계 자동차등록원부(갑) 서비스 (구버전, 없음.)
# 신버전 인터페이스 및 연계 설정 - 운영(PRD) 환경
new:
vmis:
system:
infoSysId: "41-345" # 정보시스템 ID
infoSysIpAddr: "105.19.10.135" # 정보시스템 IP 주소
sggCd: "41460" # 시군구 코드 (경기도 용인시)
picId: "" # 담당자 ID
picIpAddr: "" # 담당자 IP 주소
picNm: "" # 담당자 이름
gov:
scheme: "http" # 프로토콜 (http/https)
host: "10.188.225.25:29001" # 운영(PRD) 행정망 호스트 및 포트
basePath: "/piss/api/molit" # API 기본 경로
services:
basic: # 시군구연계 자동차기본사항조회 서비스 (신규버전)
path: "/SignguCarBassMatterInqireService" # 서비스 경로
linkInfoCd: "AC1_FD11_01" # 연계정보코드
apiKey: "05e8d748fb366a0831dce71a32424460746a72d591cf483ccc130534dd51e394" # API 인증키
cvmisApikey: "014F9215-B6D9A3B6-4CED5225-68408C46" # CVMIS API 키
ledger: # 시군구연계 자동차등록원부(갑) 서비스 (신규버전)
path: "/SignguCarLedgerFrmbkService" # 서비스 경로
linkInfoCd: "AC1_FD11_02" # 연계정보코드
apiKey: "1beeb01857c2e7e9b41c002b007ccb9754d9c272f66d4bb64fc45b302c69e529" # API 인증키
cvmisApikey: "63DF159B-7B9C64C5-86CCB15C-5F93E750" # CVMIS API 키

Loading…
Cancel
Save