diff --git a/docs/DB_DDL_VO_Mapper_변경사항.md b/docs/DB_DDL_VO_Mapper_변경사항.md new file mode 100644 index 0000000..07a32bf --- /dev/null +++ b/docs/DB_DDL_VO_Mapper_변경사항.md @@ -0,0 +1,357 @@ +# DB DDL 및 VO, XML Mapper 변경사항 정리 + +작업일: 2025-11-21 + +## 개요 + +테이블 DDL의 컬럼 추가 및 변경에 따라 관련 VO, XML Mapper, API 매핑 메소드를 전반적으로 확인 및 수정하였습니다. + +--- + +## 1. tb_car_ledger_frmbk (자동차 등록 원부 갑) + +### 1.1 DDL 변경사항 +- **추가된 컬럼**: + - `DRIV_SRGBTRY_IDNTF_NO` (varchar(20)) - 구동축전지 식별번호 + +- **기존 컬럼**: PRCS_IMPRTY_RSN_CD, PRCS_IMPRTY_RSN_DTLS + - 기존 VO 및 Mapper에서 잘못된 컬럼명 사용 중이었음 (PROCESS_IMPRTY_RESN_CODE → PRCS_IMPRTY_RSN_CD) + +### 1.2 VmisCarLedgerFrmbkVO.java 수정사항 + +**파일 경로**: `src/main/java/go/kr/project/api/model/response/VmisCarLedgerFrmbkVO.java` + +#### 추가된 필드 +```java +private String drivSrgbtryIdntfNo; // DRIV_SRGBTRY_IDNTF_NO +``` + +#### 수정된 필드 (필드명 변경) +```java +// 변경 전 +private String processImprtyResnCode; // PROCESS_IMPRTY_RESN_CODE (잘못된 컬럼명) +private String processImprtyResnDtls; // PROCESS_IMPRTY_RESN_DTLS (잘못된 컬럼명) + +// 변경 후 +private String prcsImprtyRsnCd; // PRCS_IMPRTY_RSN_CD +private String prcsImprtyRsnDtls; // PRCS_IMPRTY_RSN_DTLS +``` + +#### fromNewResponseMaster 메소드 수정 + +NewLedgerResponse의 실제 필드명에 맞게 getter 메소드 호출 수정: + +```java +// 변경 전 (잘못된 getter 메소드명 - 구버전 필드명 사용) +.ledgerIndivNo(response.getLedgerIndvdlzNo()) // ❌ +.carmdlAsortCd(response.getVhctyAsortCode()) // ❌ +.atmbNm(response.getCnm()) // ❌ +.colorCd(response.getColorCode()) // ❌ +.nopltSpcfctCd(response.getNmplStndrdCode()) // ❌ +.usgSeCd(response.getPrposSeCode()) // ❌ +.acqsAmt(response.getAcqsAmount()) // ❌ +.regDtlCd(response.getRegistDetailCode()) // ❌ +.frstRegYmd(response.getFrstRegistDe()) // ❌ +.veagEndYmd(response.getCaagEndde()) // ❌ +.yridnw(response.getPrye()) // ❌ +.fbctnYmd(response.getYblMd()) // ❌ +.drvngDstnc(response.getTrvlDstnc()) // ❌ +... (등 60여 개 필드) + +// 변경 후 (올바른 getter 메소드명 - 신규 필드명 사용) +.ledgerIndivNo(response.getLedgerIndivNo()) // ✅ +.carmdlAsortCd(response.getCarmdlAsortCd()) // ✅ +.atmbNm(response.getAtmbNm()) // ✅ +.colorCd(response.getColorCd()) // ✅ +.nopltSpcfctCd(response.getNopltSpcfctCd()) // ✅ +.usgSeCd(response.getUsgSeCd()) // ✅ +.acqsAmt(response.getAcqsAmt()) // ✅ +.regDtlCd(response.getRegDtlCd()) // ✅ +.frstRegYmd(response.getFrstRegYmd()) // ✅ +.veagEndYmd(response.getVeagEndYmd()) // ✅ +.yridnw(response.getYridnw()) // ✅ +.fbctnYmd(response.getFbctnYmd()) // ✅ +.drvngDstnc(response.getDrvngDstnc()) // ✅ +.issuNo(response.getIssuNo()) // ✅ 추가 +.frstTrnsfrYmd(response.getFrstTrnsfrYmd()) // ✅ 추가 +.drivSrgbtryIdntfNo(response.getDrivSrgbtryIdntfNo()) // ✅ 추가 +... (등 64개 필드) +``` + +### 1.3 CarLedgerFrmbkMapper_maria.xml 수정사항 + +**파일 경로**: `src/main/resources/mybatis/mapper/api/CarLedgerFrmbkMapper_maria.xml` + +#### updateCarLedgerFrmbk 수정 +```xml + +DRIV_SRGBTRY_IDNTF_NO = #{drivSrgbtryIdntfNo}, + + + +PROCESS_IMPRTY_RESN_CODE = #{processImprtyResnCode}, +PROCESS_IMPRTY_RESN_DTLS = #{processImprtyResnDtls}, + + +PRCS_IMPRTY_RSN_CD = #{prcsImprtyRsnCd}, +PRCS_IMPRTY_RSN_DTLS = #{prcsImprtyRsnDtls}, +``` + +--- + +## 2. tb_car_ledger_frmbk_dtl (자동차 등록 원부 갑 상세) + +### 2.1 DDL 변경사항 +- **추가된 컬럼**: + - `HSHLDR_NM` (varchar(75)) - 세대주명 + - `HSHLDR_IDECNO` (varchar(500)) - 세대주개인암호화번호 + +### 2.2 VmisCarLedgerFrmbkDtlVO.java 수정사항 + +**파일 경로**: `src/main/java/go/kr/project/api/model/response/VmisCarLedgerFrmbkDtlVO.java` + +#### 추가된 필드 +```java +private String hshldrNm; // HSHLDR_NM +private String hshldrIdecno; // HSHLDR_IDECNO +``` + +#### 매핑 메소드 수정 (listNewFromExchange) + +NewLedgerResponse.Record 클래스의 필드명이 변경됨에 따라 매핑 메소드 수정: + +```java +// 변경 전 (잘못된 필드명) +.szrRmvDtlSn(record.getMainchk()) +.chgTaskSeCd(record.getChangeJobSeCode()) +.mainNo(record.getMainno()) +.sno(record.getSubno()) +.spcablMttr(record.getDtls()) +.aplyRcptNo(record.getRqrcno()) +.ledgerIndivNo(record.getLedgerIndvdlzNo()) +.chgTaskSeNm(record.getGubunNm()) +.chgYmd(record.getChangeDe()) +.dtlSn(record.getDetailSn()) + +// 변경 후 (올바른 필드명) +.szrRmvDtlSn(record.getSzrRmvDtlSn()) +.chgTaskSeCd(record.getChgTaskSeCd()) +.mainNo(record.getMainNo()) +.sno(record.getSno()) +.spcablMttr(record.getSpcablMttr()) +.hshldrNm(record.getHshldrNm()) // 신규 추가 +.hshldrIdecno(record.getHshldrIdecno()) // 신규 추가 +.aplyRcptNo(record.getAplyRcptNo()) +.ledgerIndivNo(record.getLedgerIndivNo()) +.chgTaskSeNm(record.getChgTaskSeNm()) +.chgYmd(record.getChgYmd()) +.dtlSn(record.getDtlSn()) +``` + +#### 매핑 메소드 수정 (fromRecord) + +동일하게 NewLedgerResponse.Record 매핑 수정 및 신규 필드 추가 + +### 2.3 CarLedgerFrmbkMapper_maria.xml 수정사항 + +**파일 경로**: `src/main/resources/mybatis/mapper/api/CarLedgerFrmbkMapper_maria.xml` + +#### insertCarLedgerFrmbkDtl 수정 +```xml + +HSHLDR_NM, +HSHLDR_IDECNO, + + +#{hshldrNm}, +#{hshldrIdecno}, +``` + +--- + +## 3. tb_car_ffnlg_trgt (자동차 과태료 대상) + +### 3.1 변경사항 +- DDL과 VO(CarFfnlgTrgtVO.java) 비교 결과 일치함 +- 수정 불필요 + +--- + +## 4. tb_car_bass_matter_inqire (자동차 기본 사항 조회) + +### 4.1 VmisCarBassMatterInqireVO.java 수정사항 + +**파일 경로**: `src/main/java/go/kr/project/api/model/response/VmisCarBassMatterInqireVO.java` + +#### fromOldRequest 메소드 수정 + +OldBasicRequest의 구조가 헤더 정보(외부 클래스)와 요청 데이터(record 배열)로 분리되어 있음을 반영: + +```java +// 변경 전 (잘못된 구조 - request에서 직접 가져옴) +.dmndLevyStdde(request.getLevyStdde()) // ❌ request에 없음 +.dmndInqireSeCode(request.getInqireSeCode()) // ❌ request에 없음 +.dmndVhrno(request.getVhrno()) // ❌ request에 없음 +.dmndVin(request.getVin()) // ❌ request에 없음 + +// 변경 후 (올바른 구조 - request.record[0]에서 가져옴) +OldBasicRequest.Record record = request.getRecord().get(0); +.dmndLevyStdde(record.getLevyStdde()) // ✅ record[0]에서 가져옴 +.dmndInqireSeCode(record.getInqireSeCode()) // ✅ record[0]에서 가져옴 +.dmndVhrno(record.getVhrno()) // ✅ record[0]에서 가져옴 +.dmndVin(record.getVin()) // ✅ record[0]에서 가져옴 +``` + +#### OldBasicRequest 구조 설명 + +``` +OldBasicRequest +├─ 헤더 정보 (외부 클래스) +│ ├─ infoSysId +│ ├─ infoSysIp +│ ├─ sigunguCode +│ ├─ cntcInfoCode +│ ├─ chargerId +│ ├─ chargerIp +│ └─ chargerNm +└─ record[] (요청 데이터 배열) + └─ [0] + ├─ levyStdde (부과기준일) + ├─ inqireSeCode (조회구분코드) + ├─ vhrno (자동차등록번호) + └─ vin (차대번호) +``` + +--- + +## 5. NewLedgerResponse 클래스 변경 + +### 5.1 외부 클래스 필드명 변경사항 +**파일 경로**: `src/main/java/go/kr/project/api/model/response/NewLedgerResponse.java` + +외부 클래스(마스터 정보)의 필드명이 API 응답 규격에 맞게 변경됨: + +#### 주요 변경된 필드 (일부) +```java +// 변경 전 (구버전 필드명) +private String ledgerIndvdlzNo; // LEDGER_INDVDLZ_NO +private String vhctyAsortCode; // VHCTY_ASORT_CODE +private String cnm; // CNM +private String colorCode; // COLOR_CODE +private String nmplStndrdCode; // NMPL_STNDRD_CODE +private String prposSeCode; // PRPOS_SE_CODE +private String acqsAmount; // ACQS_AMOUNT +private String registDetailCode; // REGIST_DETAIL_CODE +private String frstRegistDe; // FRST_REGIST_DE +private String caagEndde; // CAAG_ENDDE +private String prye; // PRYE +private String yblMd; // YBL_MD +private String trvlDstnc; // TRVL_DSTNC + +// 변경 후 (신버전 필드명) +private String ledgerIndivNo; // LEDGER_INDIV_NO ✅ +private String carmdlAsortCd; // CARMDL_ASORT_CD ✅ +private String atmbNm; // ATMB_NM ✅ +private String colorCd; // COLOR_CD ✅ +private String nopltSpcfctCd; // NOPLT_SPCFCT_CD ✅ +private String usgSeCd; // USG_SE_CD ✅ +private String acqsAmt; // ACQS_AMT ✅ +private String regDtlCd; // REG_DTL_CD ✅ +private String frstRegYmd; // FRST_REG_YMD ✅ +private String veagEndYmd; // VEAG_END_YMD ✅ +private String yridnw; // YRIDNW ✅ +private String fbctnYmd; // FBCTN_YMD ✅ +private String drvngDstnc; // DRVNG_DSTNC ✅ +``` + +**영향**: VmisCarLedgerFrmbkVO.fromNewResponseMaster 메소드의 모든 getter 호출 변경 필요 + +### 5.2 Record 내부 클래스 변경사항 + +Record 내부 클래스의 필드명이 API 규격에 맞게 변경됨: + +#### 추가된 필드 +```java +@JsonProperty("HSHLDR_NM") +private String hshldrNm; // 세대주명 + +@JsonProperty("HSHLDR_IDECNO") +private String hshldrIdecno; // 세대주개인암호화번호 +``` + +#### 기존 필드 (필드명 변경) +- `SZR_RMV_DTL_SN`: Mainchk → szrRmvDtlSn +- `CHG_TASK_SE_CD`: ChangeJobSeCode → chgTaskSeCd +- `MAIN_NO`: Mainno → mainNo +- `SNO`: Subno → sno +- `SPCABL_MTTR`: Dtls → spcablMttr +- `APLY_RCPT_NO`: Rqrcno → aplyRcptNo +- `LEDGER_INDIV_NO`: LedgerIndvdlzNo → ledgerIndivNo +- `CHG_TASK_SE_NM`: GubunNm → chgTaskSeNm +- `CHG_YMD`: ChangeDe → chgYmd +- `DTL_SN`: DetailSn → dtlSn + +--- + +## 6. 작업 체크리스트 + +- [x] DDL 파일 읽기 (tb_car_ffnlg_trgt, tb_car_ledger_frmbk, tb_car_ledger_frmbk_dtl, tb_car_bass_matter_inqire) +- [x] 관련 VO 파일 읽기 및 확인 +- [x] 관련 XML mapper 파일 읽기 및 확인 +- [x] API 매핑 메소드 확인 +- [x] DDL 변경사항과 현재 구현 비교 +- [x] VmisCarLedgerFrmbkVO 수정 (필드 추가, 컬럼명 수정) +- [x] VmisCarLedgerFrmbkVO.fromNewResponseMaster 메소드 수정 (NewLedgerResponse 필드명 변경 반영) +- [x] VmisCarLedgerFrmbkDtlVO 수정 (HSHLDR 필드 추가, fromRecord 메소드 수정) +- [x] CarLedgerFrmbkMapper_maria.xml 수정 +- [x] VmisCarBassMatterInqireVO.fromOldRequest 메소드 수정 (record 배열 구조 반영) +- [x] 변경사항 MD 파일 작성 + +--- + +## 7. 주의사항 + +### 7.1 필드명 네이밍 규칙 +- VO 필드명: camelCase (예: prcsImprtyRsnCd) +- DB 컬럼명: SNAKE_CASE (예: PRCS_IMPRTY_RSN_CD) +- MyBatis mapper에서 자동 매핑됨 + +### 7.2 API 응답 매핑 +- NewLedgerResponse.Record의 필드명은 API 응답 JSON 규격과 일치해야 함 +- @JsonProperty 어노테이션으로 명시적 매핑 + +### 7.3 테스트 필요 항목 +- [ ] 자동차 등록 원부 갑 조회 API 테스트 +- [ ] 자동차 등록 원부 갑 상세 조회 API 테스트 +- [ ] DB INSERT/UPDATE 쿼리 테스트 +- [ ] 신규 필드 매핑 정상 동작 확인 + +--- + +## 8. 다음 단계 + +1. VmisCarBassMatterInqireVO의 NewBasicResponse 매핑 추가 필요 여부 확인 +2. 통합 테스트 실행 +3. 변경사항 배포 전 검증 + +--- + +## 변경 파일 목록 + +``` +수정된 파일: +- src/main/java/go/kr/project/api/model/response/VmisCarLedgerFrmbkVO.java +- src/main/java/go/kr/project/api/model/response/VmisCarLedgerFrmbkDtlVO.java +- src/main/java/go/kr/project/api/model/response/VmisCarBassMatterInqireVO.java +- src/main/resources/mybatis/mapper/api/CarLedgerFrmbkMapper_maria.xml + +확인된 DDL: +- DB/DDL/vips/tb_car_ledger_frmbk.sql +- DB/DDL/vips/tb_car_ledger_frmbk_dtl.sql +- DB/DDL/vips/tb_car_bass_matter_inqire.sql +- DB/DDL/vips/tb_car_ffnlg_trgt.sql + +수정된 Request/Response 모델: +- src/main/java/go/kr/project/api/model/request/OldBasicRequest.java (구조 확인) +- src/main/java/go/kr/project/api/model/response/NewLedgerResponse.java +``` diff --git a/docs/리눅스 rocky MariaDB 설정.md b/docs/리눅스 rocky MariaDB 설정.md new file mode 100644 index 0000000..b894abc --- /dev/null +++ b/docs/리눅스 rocky MariaDB 설정.md @@ -0,0 +1,813 @@ +# Rocky Linux 9.5 MariaDB 설치 및 설정 가이드 + +## 요구사항 +1. Rocky Linux 9.5 version +2. root 권한 또는 sudo 권한이 있는 계정 +3. 목표: MariaDB 설치, 보안 설정, 사용자 생성, 데이터베이스 생성, 백업 스키마 복원 + +--- + +## 1단계: MariaDB 설치 + +### 1.1 MariaDB 서버 설치 +```bash +# MariaDB 서버 및 클라이언트 설치 +dnf install -y mariadb-server mariadb + +# 또는 yum 사용 +yum install -y mariadb-server mariadb +``` + +### 1.2 MariaDB 서비스 시작 및 자동 시작 설정 +```bash +# MariaDB 서비스 시작 +systemctl start mariadb + +# 부팅 시 자동 시작 설정 +systemctl enable mariadb + +# 서비스 상태 확인 +systemctl status mariadb +``` + +### 1.3 MariaDB 버전 확인 +```bash +# MariaDB 버전 확인 +mysql --version + +# 또는 MariaDB 접속 후 확인 +mysql -e "SELECT VERSION();" +``` + +--- + +## 2단계: MariaDB 보안 설정 + +### 2.1 초기 보안 설정 실행 +```bash +# MariaDB 보안 설정 스크립트 실행 +mysql_secure_installation +``` + +### 2.2 보안 설정 질문 및 권장 답변 +설정 중 아래와 같은 질문이 나타납니다: + +``` +1. Enter current password for root (enter for none): + → 처음 설치 시 비밀번호가 없으므로 Enter 입력 + +2. Switch to unix_socket authentication [Y/n] + → n (기존 방식 유지 권장) + +3. Change the root password? [Y/n] + → Y (root 비밀번호 설정) + → 새 비밀번호 입력 및 확인 + +4. Remove anonymous users? [Y/n] + → Y (익명 사용자 제거) + +5. Disallow root login remotely? [Y/n] + → Y (원격 root 로그인 차단 - 보안 강화) + → n (원격 접속이 필요한 경우) + +6. Remove test database and access to it? [Y/n] + → Y (테스트 데이터베이스 제거) + +7. Reload privilege tables now? [Y/n] + → Y (권한 테이블 즉시 적용) +``` + +### 2.3 root로 MariaDB 접속 확인 +```bash +# root 계정으로 MariaDB 접속 +mysql -u root -p +# 비밀번호 입력 후 접속 + +# 접속 확인 후 종료 +MariaDB [(none)]> show databases; +MariaDB [(none)]> exit; +``` + +--- + +## 3단계: 커스텀 포트 설정 (53306) + +### 3.1 MariaDB 포트 변경 +```bash +# MariaDB 설정 파일 편집 +vi /etc/my.cnf.d/mariadb-server.cnf +``` + +설정 파일에 포트 추가: +```ini +[mysqld] +port=53306 +``` + +설정 변경 후 서비스 재시작: +```bash +# MariaDB 재시작 +systemctl restart mariadb + +# 포트 확인 +ss -tlnp | grep 53306 +``` + +### 3.2 방화벽 설정 (외부 접속 허용) +```bash +# 커스텀 포트(53306) 방화벽 허용 +firewall-cmd --permanent --add-port=53306/tcp +firewall-cmd --reload + +# 방화벽 설정 확인 +firewall-cmd --list-all +``` + +--- + +## 4단계: 데이터베이스 생성 + +### 4.1 MariaDB 접속 +```bash +# root로 MariaDB 접속 +mysql -u root -p +# 비밀번호 입력 +``` + +### 4.2 데이터베이스 생성 +```sql +-- VIPS 데이터베이스 생성 +CREATE DATABASE vips CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- 데이터베이스 목록 확인 +SHOW DATABASES; + +-- VIPS 데이터베이스 선택 +USE vips; +``` + +### 4.3 데이터베이스 문자셋 확인 +```sql +-- 데이터베이스 문자셋 확인 +SELECT + SCHEMA_NAME, + DEFAULT_CHARACTER_SET_NAME, + DEFAULT_COLLATION_NAME +FROM information_schema.SCHEMATA +WHERE SCHEMA_NAME = 'vips'; +``` + +--- + +## 5단계: 사용자 생성 및 권한 부여 + +### 5.1 로컬 접속용 사용자 생성 +```sql +-- VIPS 로컬 접속용 사용자 생성 +CREATE USER 'vips'@'localhost' IDENTIFIED BY 'xit5811807'; + +-- VIPS 데이터베이스에 모든 권한 부여 +GRANT ALL PRIVILEGES ON vips.* TO 'vips'@'localhost'; + +-- 권한 적용 +FLUSH PRIVILEGES; +``` + +### 5.2 원격 접속용 사용자 생성 +```sql +-- 특정 IP에서 접속 가능한 사용자 생성 +CREATE USER 'vips'@'192.168.1.100' IDENTIFIED BY 'xit5811807'; +GRANT ALL PRIVILEGES ON vips.* TO 'vips'@'192.168.1.100'; + +-- 모든 IP에서 접속 가능한 사용자 생성 (application-prd.yml 설정) +CREATE USER 'vips'@'%' IDENTIFIED BY 'xit5811807'; +GRANT ALL PRIVILEGES ON vips.* TO 'vips'@'%'; + +-- 권한 적용 +FLUSH PRIVILEGES; +``` + +### 5.3 읽기 전용 사용자 생성 (선택사항) +```sql +-- 읽기 전용 사용자 생성 +CREATE USER 'vips_readonly'@'%' IDENTIFIED BY 'vips_readonly_password'; +GRANT SELECT ON vips.* TO 'vips_readonly'@'%'; +FLUSH PRIVILEGES; +``` + +### 5.4 사용자 목록 및 권한 확인 +```sql +-- 사용자 목록 확인 +SELECT User, Host FROM mysql.user; + +-- VIPS 사용자의 권한 확인 +SHOW GRANTS FOR 'vips'@'localhost'; +SHOW GRANTS FOR 'vips'@'%'; + +-- 현재 사용자 확인 +SELECT USER(), CURRENT_USER(); +``` + +### 5.5 원격 접속을 위한 MariaDB 설정 변경 +```bash +# MariaDB 설정 파일 편집 +vi /etc/my.cnf.d/mariadb-server.cnf +``` + +설정 파일에서 다음 부분 수정: +```ini +[mysqld] +# bind-address를 주석 처리하거나 0.0.0.0으로 변경 +# bind-address=127.0.0.1 +bind-address=0.0.0.0 + +# 또는 특정 IP만 허용 +# bind-address=192.168.1.50 +``` + +설정 변경 후 서비스 재시작: +```bash +# MariaDB 재시작 +systemctl restart mariadb + +# 재시작 확인 +systemctl status mariadb +``` + +--- + +## 6단계: 백업 스키마 업로드 (전체 데이터베이스 복원) + +### 6.1 백업 파일 서버로 전송 + +**방법 1: SCP 사용 (로컬 PC에서 실행)** +```bash +# Windows PowerShell 또는 CMD에서 실행 +scp C:\backup\vips_backup.sql root@서버IP:/tmp/ +``` + +**방법 2: SFTP 사용** +```bash +# SFTP 접속 +sftp root@서버IP + +# 파일 전송 +put vips_backup.sql /tmp/ +exit +``` + +### 6.2 백업 파일 권한 설정 +```bash +# 백업 파일 권한 확인 +ls -la /tmp/vips_backup.sql + +# 필요시 권한 변경 +chmod 644 /tmp/vips_backup.sql +``` + +### 6.3 백업 파일 복원 - 방법 1 (명령행에서 직접 복원) +```bash +# 커스텀 포트 53306 사용하여 복원 +mysql -u root -p -P 53306 vips < /tmp/vips_backup.sql + +# 비밀번호 입력 없이 실행 (스크립트용) +mysql -u root -p비밀번호 -P 53306 vips < /tmp/vips_backup.sql +``` + +### 6.4 백업 파일 복원 - 방법 2 (MySQL 내부에서 복원) +```bash +# MariaDB 접속 (포트 53306 명시) +mysql -u root -p -P 53306 +``` + +```sql +-- VIPS 데이터베이스 선택 +USE vips; + +-- 백업 파일 실행 +SOURCE /tmp/vips_backup.sql; + +-- 또는 +\. /tmp/vips_backup.sql +``` + +### 6.5 백업 파일 복원 - 방법 3 (새 데이터베이스 생성 포함) +백업 파일에 CREATE DATABASE가 포함된 경우: +```bash +# 데이터베이스 이름 지정 없이 복원 (포트 53306) +mysql -u root -p -P 53306 < /tmp/vips_backup.sql +``` + +### 6.6 대용량 백업 파일 복원 +대용량 파일의 경우 타임아웃 방지를 위한 옵션 추가: +```bash +# 타임아웃 설정 증가 (포트 53306) +mysql -u root -p -P 53306 \ + --max_allowed_packet=512M \ + --connect_timeout=3600 \ + --wait_timeout=3600 \ + vips < /tmp/vips_backup.sql +``` + +### 6.7 압축된 백업 파일 복원 +```bash +# .gz 파일 복원 (포트 53306) +gunzip < /tmp/vips_backup.sql.gz | mysql -u root -p -P 53306 vips + +# .zip 파일 복원 (포트 53306) +unzip -p /tmp/vips_backup.sql.zip | mysql -u root -p -P 53306 vips +``` + +--- + +## 7단계: 복원 결과 확인 + +### 7.1 MariaDB 접속 +```bash +# VIPS 사용자로 접속 (포트 53306) +mysql -u vips -p -P 53306 vips +# 비밀번호 입력: xit5811807 +``` + +### 7.2 데이터베이스 및 테이블 확인 +```sql +-- 현재 데이터베이스 확인 +SELECT DATABASE(); + +-- 테이블 목록 확인 +SHOW TABLES; + +-- 테이블 개수 확인 +SELECT COUNT(*) AS table_count +FROM information_schema.tables +WHERE table_schema = 'vips'; + +-- 각 테이블의 상세 정보 확인 +SHOW TABLE STATUS FROM vips; +``` + +### 7.3 테이블 구조 확인 +```sql +-- 특정 테이블 구조 확인 (VIPS 테이블 예시) +DESC tb_vehicle_info; +-- 또는 +DESCRIBE tb_vehicle_info; +-- 또는 +SHOW COLUMNS FROM tb_vehicle_info; + +-- 테이블 생성 DDL 확인 +SHOW CREATE TABLE tb_vehicle_info; +``` + +### 7.4 데이터 확인 +```sql +-- 특정 테이블의 레코드 수 확인 +SELECT COUNT(*) FROM tb_vehicle_info; + +-- 상위 10개 데이터 조회 +SELECT * FROM tb_vehicle_info LIMIT 10; + +-- 모든 테이블의 레코드 수 확인 +SELECT + TABLE_NAME, + TABLE_ROWS +FROM information_schema.TABLES +WHERE TABLE_SCHEMA = 'vips' +ORDER BY TABLE_ROWS DESC; +``` + +### 7.5 인덱스 및 제약조건 확인 +```sql +-- 특정 테이블의 인덱스 확인 +SHOW INDEX FROM tb_vehicle_info; + +-- 외래키 제약조건 확인 +SELECT + CONSTRAINT_NAME, + TABLE_NAME, + COLUMN_NAME, + REFERENCED_TABLE_NAME, + REFERENCED_COLUMN_NAME +FROM information_schema.KEY_COLUMN_USAGE +WHERE TABLE_SCHEMA = 'vips' +AND REFERENCED_TABLE_NAME IS NOT NULL; +``` + +### 7.6 데이터베이스 용량 확인 +```sql +-- VIPS 데이터베이스 전체 크기 확인 +SELECT + table_schema AS 'Database', + ROUND(SUM(data_length + index_length) / 1024 / 1024, 2) AS 'Size (MB)' +FROM information_schema.tables +WHERE table_schema = 'vips' +GROUP BY table_schema; + +-- 테이블별 크기 확인 +SELECT + table_name AS 'Table', + ROUND(((data_length + index_length) / 1024 / 1024), 2) AS 'Size (MB)' +FROM information_schema.tables +WHERE table_schema = 'vips' +ORDER BY (data_length + index_length) DESC; +``` + +### 7.7 문자셋 확인 +```sql +-- 데이터베이스 문자셋 확인 +SHOW VARIABLES LIKE 'character_set%'; +SHOW VARIABLES LIKE 'collation%'; + +-- 포트 확인 +SHOW VARIABLES LIKE 'port'; + +-- VIPS 테이블의 문자셋 확인 +SELECT + TABLE_NAME, + TABLE_COLLATION +FROM information_schema.TABLES +WHERE TABLE_SCHEMA = 'vips'; +``` + +--- + +## 8단계: 접속 테스트 및 문제 해결 + +### 8.1 로컬 접속 테스트 +```bash +# VIPS 사용자로 로컬 접속 테스트 (포트 53306) +mysql -u vips -p -P 53306 vips + +# 접속 후 간단한 쿼리 실행 +mysql -u vips -pxit5811807 -P 53306 vips -e "SELECT COUNT(*) AS table_count FROM information_schema.tables WHERE table_schema='vips';" +``` + +### 8.2 원격 접속 테스트 (다른 서버에서) +```bash +# 원격 서버에서 접속 테스트 (application-prd.yml 설정과 동일) +mysql -h 211.119.124.117 -P 53306 -u vips -p vips + +# 비밀번호 포함하여 테스트 (스크립트용) +mysql -h 211.119.124.117 -P 53306 -u vips -pxit5811807 vips -e "SHOW TABLES;" +``` + +### 8.3 접속 문제 해결 + +**문제 1: Access denied for user** +```sql +-- MariaDB에 root로 접속하여 사용자 확인 +SELECT User, Host FROM mysql.user WHERE User='vips'; + +-- 호스트가 일치하지 않으면 재생성 +DROP USER 'vips'@'잘못된호스트'; +CREATE USER 'vips'@'올바른호스트' IDENTIFIED BY 'xit5811807'; +GRANT ALL PRIVILEGES ON vips.* TO 'vips'@'올바른호스트'; +FLUSH PRIVILEGES; +``` + +**문제 2: Can't connect to MySQL server** +```bash +# MariaDB 서비스 상태 확인 +systemctl status mariadb + +# 서비스가 중지되어 있으면 시작 +systemctl start mariadb + +# 커스텀 포트 53306 리스닝 확인 +ss -tlnp | grep 53306 +netstat -tlnp | grep 53306 + +# 포트 설정 확인 +mysql -u root -p -e "SHOW VARIABLES LIKE 'port';" + +# 방화벽 확인 +firewall-cmd --list-all +``` + +**문제 3: 원격 접속 불가** +```bash +# bind-address 설정 확인 +grep bind-address /etc/my.cnf.d/mariadb-server.cnf + +# 0.0.0.0 또는 원하는 IP로 설정되어 있는지 확인 +# 변경 후 재시작 필요 +systemctl restart mariadb +``` + +**문제 4: 복원 중 에러 발생** +```bash +# 에러 로그 확인 +tail -100 /var/log/mariadb/mariadb.log + +# 또는 +journalctl -u mariadb -n 100 + +# SQL 파일 문법 확인 (일부만 실행해보기) +head -100 /tmp/myapp_db_backup.sql +``` + +--- + +## 9단계: 백업 설정 (추가 운영 관리) + +### 9.1 수동 백업 명령어 +```bash +# VIPS 전체 데이터베이스 백업 (포트 53306) +mysqldump -u root -p -P 53306 vips > /backup/vips_$(date +%Y%m%d_%H%M%S).sql + +# 압축 백업 +mysqldump -u root -p -P 53306 vips | gzip > /backup/vips_$(date +%Y%m%d_%H%M%S).sql.gz + +# 특정 테이블만 백업 +mysqldump -u root -p -P 53306 vips tb_vehicle_info tb_user > /backup/vips_tables_$(date +%Y%m%d).sql + +# 구조만 백업 (데이터 제외) +mysqldump -u root -p -P 53306 --no-data vips > /backup/vips_schema_only.sql + +# 데이터만 백업 (구조 제외) +mysqldump -u root -p -P 53306 --no-create-info vips > /backup/vips_data_only.sql +``` + +### 9.2 백업 디렉토리 생성 및 권한 설정 +```bash +# 백업 디렉토리 생성 +mkdir -p /backup/mariadb + +# 권한 설정 +chown root:root /backup/mariadb +chmod 700 /backup/mariadb +``` + +### 9.3 자동 백업 스크립트 생성 +```bash +# 백업 스크립트 생성 +vi /backup/mariadb_backup.sh +``` + +스크립트 내용: +```bash +#!/bin/bash + +# VIPS 데이터베이스 백업 스크립트 +DB_NAME="vips" +DB_USER="root" +DB_PASS="your_root_password" +DB_PORT="53306" +BACKUP_DIR="/backup/mariadb" +DATE=$(date +%Y%m%d_%H%M%S) +BACKUP_FILE="$BACKUP_DIR/${DB_NAME}_${DATE}.sql.gz" +RETENTION_DAYS=7 + +# 백업 디렉토리 생성 (없으면) +mkdir -p $BACKUP_DIR + +# 백업 실행 +echo "Starting VIPS database backup at $(date)" +mysqldump -u $DB_USER -p$DB_PASS -P $DB_PORT $DB_NAME | gzip > $BACKUP_FILE + +# 백업 결과 확인 +if [ $? -eq 0 ]; then + echo "Backup completed successfully: $BACKUP_FILE" + + # 파일 크기 확인 + FILE_SIZE=$(du -h "$BACKUP_FILE" | cut -f1) + echo "Backup file size: $FILE_SIZE" + + # 오래된 백업 파일 삭제 (7일 이상) + find $BACKUP_DIR -name "${DB_NAME}_*.sql.gz" -mtime +$RETENTION_DAYS -delete + echo "Old backups cleaned up (retention: $RETENTION_DAYS days)" +else + echo "Backup failed!" + exit 1 +fi + +echo "Backup process finished at $(date)" +``` + +스크립트 실행 권한 부여: +```bash +chmod 700 /backup/mariadb_backup.sh +``` + +### 9.4 cron을 이용한 자동 백업 설정 +```bash +# crontab 편집 +crontab -e +``` + +cron 설정 추가: +```bash +# 매일 새벽 2시에 백업 실행 +0 2 * * * /backup/mariadb_backup.sh >> /backup/mariadb/backup.log 2>&1 + +# 매주 일요일 새벽 3시에 백업 실행 +0 3 * * 0 /backup/mariadb_backup.sh >> /backup/mariadb/backup.log 2>&1 + +# 매월 1일 새벽 4시에 백업 실행 +0 4 1 * * /backup/mariadb_backup.sh >> /backup/mariadb/backup.log 2>&1 +``` + +cron 설정 확인: +```bash +# crontab 목록 확인 +crontab -l + +# cron 서비스 상태 확인 +systemctl status crond + +# cron 로그 확인 +tail -f /var/log/cron +``` + +--- + +## 전체 실행 순서 요약 + +```bash +# 1. MariaDB 설치 +dnf install -y mariadb-server mariadb +systemctl start mariadb +systemctl enable mariadb + +# 2. 보안 설정 +mysql_secure_installation + +# 3. 커스텀 포트 설정 (53306) +vi /etc/my.cnf.d/mariadb-server.cnf +# [mysqld] 섹션에 port=53306 추가 + +# 4. 원격 접속 설정 +vi /etc/my.cnf.d/mariadb-server.cnf +# bind-address=0.0.0.0 설정 +systemctl restart mariadb + +# 5. 방화벽 설정 +firewall-cmd --permanent --add-port=53306/tcp +firewall-cmd --reload + +# 6. 포트 확인 +ss -tlnp | grep 53306 + +# 7. MariaDB 접속하여 데이터베이스 및 사용자 생성 +mysql -u root -p -P 53306 +``` + +```sql +-- VIPS 데이터베이스 생성 +CREATE DATABASE vips CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; + +-- VIPS 사용자 생성 및 권한 부여 +CREATE USER 'vips'@'localhost' IDENTIFIED BY 'xit5811807'; +GRANT ALL PRIVILEGES ON vips.* TO 'vips'@'localhost'; + +-- 원격 접속용 사용자 (application-prd.yml 설정) +CREATE USER 'vips'@'%' IDENTIFIED BY 'xit5811807'; +GRANT ALL PRIVILEGES ON vips.* TO 'vips'@'%'; + +FLUSH PRIVILEGES; +exit; +``` + +```bash +# 8. 백업 파일 업로드 (로컬 PC에서) +scp vips_backup.sql root@서버IP:/tmp/ + +# 9. 백업 복원 (서버에서, 포트 53306 명시) +mysql -u root -p -P 53306 vips < /tmp/vips_backup.sql + +# 10. 복원 확인 +mysql -u vips -pxit5811807 -P 53306 vips +``` + +```sql +-- 테이블 확인 +SHOW TABLES; +SELECT COUNT(*) AS table_count FROM information_schema.tables WHERE table_schema='vips'; +exit; +``` + +--- + +## 유용한 MariaDB 관리 명령어 + +### 데이터베이스 관리 +```sql +-- 모든 데이터베이스 목록 +SHOW DATABASES; + +-- 데이터베이스 삭제 (주의!) +DROP DATABASE vips; + +-- 데이터베이스 이름 변경 (직접 지원 안함, 백업/복원 필요) +-- 방법: 백업 → 새 DB 생성 → 복원 → 기존 DB 삭제 +``` + +### 사용자 관리 +```sql +-- 모든 사용자 목록 +SELECT User, Host FROM mysql.user; + +-- VIPS 사용자 비밀번호 변경 +ALTER USER 'vips'@'localhost' IDENTIFIED BY 'new_password'; +ALTER USER 'vips'@'%' IDENTIFIED BY 'new_password'; + +-- 사용자 삭제 +DROP USER 'vips'@'localhost'; +DROP USER 'vips'@'%'; + +-- 특정 권한만 회수 +REVOKE DELETE ON vips.* FROM 'vips'@'localhost'; + +-- 모든 권한 회수 +REVOKE ALL PRIVILEGES ON vips.* FROM 'vips'@'localhost'; +``` + +### 테이블 관리 +```sql +-- 테이블 삭제 +DROP TABLE table_name; + +-- 테이블 비우기 (구조는 유지) +TRUNCATE TABLE table_name; + +-- 테이블 이름 변경 +RENAME TABLE old_name TO new_name; + +-- 테이블 복사 +CREATE TABLE new_table LIKE old_table; +INSERT INTO new_table SELECT * FROM old_table; +``` + +### 성능 모니터링 +```sql +-- 현재 실행 중인 쿼리 확인 +SHOW PROCESSLIST; + +-- 특정 프로세스 강제 종료 +KILL [process_id]; + +-- 상태 변수 확인 +SHOW STATUS; +SHOW VARIABLES; + +-- 느린 쿼리 확인 +SHOW VARIABLES LIKE 'slow_query%'; +``` + +--- + +## 보안 권장사항 + +1. **강력한 비밀번호 사용** + - 최소 12자 이상, 대소문자/숫자/특수문자 조합 + +2. **최소 권한 원칙** + - 애플리케이션 사용자에게 필요한 최소 권한만 부여 + - 읽기 전용 작업에는 SELECT 권한만 부여 + +3. **원격 root 접속 차단** + - root는 localhost에서만 접속 허용 + +4. **정기적인 백업** + - 매일 자동 백업 설정 + - 백업 파일 주기적 확인 + +5. **방화벽 설정** + - 필요한 IP만 53306 포트 접근 허용 + - 특정 IP 대역만 접근 허용 설정 + ```bash + # 특정 IP만 허용 (예시) + firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="53306" accept' + firewall-cmd --reload + ``` + +6. **MariaDB 업데이트** + - 정기적인 보안 패치 적용 + ```bash + dnf update mariadb-server + ``` + +--- + +## 참고사항 + +- **VIPS 프로젝트 설정** + - 데이터베이스: vips + - 사용자: vips + - 비밀번호: xit5811807 + - 포트: 53306 (커스텀 포트) + - 문자셋: UTF-8 (utf8mb4) + +- **MariaDB 기본 정보** + - 기본 포트: 3306 (VIPS는 53306 사용) + - 설정 파일 위치: `/etc/my.cnf`, `/etc/my.cnf.d/mariadb-server.cnf` + - 데이터 디렉토리: `/var/lib/mysql/` + - 로그 파일: `/var/log/mariadb/mariadb.log` + - 소켓 파일: `/var/lib/mysql/mysql.sock` + +--- + +## 문의 및 추가 정보 + +- MariaDB 공식 문서: https://mariadb.com/kb/ +- Rocky Linux 공식 문서: https://docs.rockylinux.org/ diff --git a/docs/자동차과태료_비교로직_정리.md b/docs/자동차과태료_비교로직_정리.md index 3e3f026..5acfca6 100644 --- a/docs/자동차과태료_비교로직_정리.md +++ b/docs/자동차과태료_비교로직_정리.md @@ -6,7 +6,7 @@ ### 기본 설정 -- **API 선택**: YML flag 값에 따라 구/신 API 호출 결정 +- **API 선택**: 각 api별 YML flag 값에 따라 구/신 API 호출 결정 - **통합 모델**: 구/신 API 응답을 통일된 model object로 처리 - 구 API: 자동차기본정보 API - 신 API: 자동차기본정보 API, 자동차등록원부(갑) diff --git a/src/main/java/go/kr/project/api/config/properties/VmisProperties.java b/src/main/java/go/kr/project/api/config/properties/VmisProperties.java index 138e65a..47c2cd1 100644 --- a/src/main/java/go/kr/project/api/config/properties/VmisProperties.java +++ b/src/main/java/go/kr/project/api/config/properties/VmisProperties.java @@ -28,19 +28,27 @@ public class VmisProperties { public static class ApiProps { @NotNull private UrlProps url = new UrlProps(); + // 구/신 API 선택 플래그 (YML flag) + private boolean useOldBasic = false; // true = /old-basic, false = /new-basic + private boolean useNewLedger = true; // 현재는 신규 원부만 사용 @Data public static class UrlProps { @NotBlank private String base = "http://localhost:8081/api/v1/vehicles"; // 기본 Base URL + // 구/신 API 엔드포인트 경로 (신규 요구사항 반영) @NotBlank - private String basic = "/basic"; // 자동차기본정보 엔드포인트 경로 + private String oldBasic = "/old-basic"; // 구 자동차기본정보 @NotBlank - private String ledger = "/ledger"; // 자동차등록원부 엔드포인트 경로 + private String newBasic = "/new-basic"; // 신 자동차기본정보 + @NotBlank + private String newLedger = "/new-ledger"; // 신 자동차등록원부(갑) // 외부 VMIS-interface 호출용 전체 URL 조합 헬퍼 - public String buildBasicUrl() { return join(base, basic); } - public String buildLedgerUrl() { return join(base, ledger); } + // 구/신 URL 조합 헬퍼 + public String buildOldBasicUrl() { return join(base, oldBasic); } + public String buildNewBasicUrl() { return join(base, newBasic); } + public String buildNewLedgerUrl() { return join(base, newLedger); } private String join(String base, String path) { String b = base; diff --git a/src/main/java/go/kr/project/api/controller/VehicleInterfaceController.java b/src/main/java/go/kr/project/api/controller/VehicleInterfaceController.java index 00ec930..a369d2b 100644 --- a/src/main/java/go/kr/project/api/controller/VehicleInterfaceController.java +++ b/src/main/java/go/kr/project/api/controller/VehicleInterfaceController.java @@ -1,10 +1,10 @@ package go.kr.project.api.controller; import go.kr.project.api.model.Envelope; -import go.kr.project.api.model.request.BasicRequest; -import go.kr.project.api.model.request.LedgerRequest; -import go.kr.project.api.model.response.BasicResponse; -import go.kr.project.api.model.response.LedgerResponse; +import go.kr.project.api.model.request.OldBasicRequest; +import go.kr.project.api.model.request.NewLedgerRequest; +import go.kr.project.api.model.response.OldBasicResponse; +import go.kr.project.api.model.response.NewLedgerResponse; import go.kr.project.api.service.ExternalVehicleApiService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; @@ -69,18 +69,18 @@ public class VehicleInterfaceController { ) ) ) - public ResponseEntity> basic( - @org.springframework.web.bind.annotation.RequestBody Envelope envelope + public ResponseEntity> basic( + @org.springframework.web.bind.annotation.RequestBody Envelope envelope ) { // 중요 로직: Swagger 요청 Envelope에서 BasicRequest 추출 (차량번호 및 필수 파라미터 포함) - BasicRequest request = (envelope != null && !envelope.getData().isEmpty()) ? envelope.getData().get(0) : null; + OldBasicRequest request = (envelope != null && !envelope.getData().isEmpty()) ? envelope.getData().get(0) : null; if (request == null || request.getVhrno() == null || request.getVhrno().trim().isEmpty()) { return ResponseEntity.ok(new Envelope<>(Collections.emptyList())); } // VehicleInfoService는 모드에 따라 구현체가 자동 주입되어 분기 처리 - BasicResponse basic = service.getBasicInfo(request); - Envelope out = (basic != null) ? new Envelope<>(basic) : new Envelope<>(Collections.emptyList()); + OldBasicResponse basic = service.getBasicInfo(request); + Envelope out = (basic != null) ? new Envelope<>(basic) : new Envelope<>(Collections.emptyList()); return ResponseEntity.ok(out); } @@ -102,17 +102,17 @@ public class VehicleInterfaceController { ) ) ) - public ResponseEntity> ledger( - @org.springframework.web.bind.annotation.RequestBody Envelope envelope + public ResponseEntity> ledger( + @org.springframework.web.bind.annotation.RequestBody Envelope envelope ) { // 중요 로직: Swagger 요청 Envelope에서 LedgerRequest 추출 (차량번호 및 필수 파라미터 포함) - LedgerRequest request = (envelope != null && !envelope.getData().isEmpty()) ? envelope.getData().get(0) : null; + NewLedgerRequest request = (envelope != null && !envelope.getData().isEmpty()) ? envelope.getData().get(0) : null; if (request == null || request.getVhrno() == null || request.getVhrno().trim().isEmpty()) { return ResponseEntity.ok(new Envelope<>(Collections.emptyList())); } - LedgerResponse ledger = service.getLedgerInfo(request); - Envelope out = (ledger != null) ? new Envelope<>(ledger) : new Envelope<>(Collections.emptyList()); + NewLedgerResponse ledger = service.getLedgerInfo(request); + Envelope out = (ledger != null) ? new Envelope<>(ledger) : new Envelope<>(Collections.emptyList()); return ResponseEntity.ok(out); } } diff --git a/src/main/java/go/kr/project/api/model/ApiExchangeEnvelope.java b/src/main/java/go/kr/project/api/model/ApiExchangeEnvelope.java new file mode 100644 index 0000000..ea39844 --- /dev/null +++ b/src/main/java/go/kr/project/api/model/ApiExchangeEnvelope.java @@ -0,0 +1,30 @@ +package go.kr.project.api.model; + +import com.fasterxml.jackson.annotation.JsonInclude; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Getter; +import lombok.Setter; + +/** + * 외부 VMIS-interface 신규 응답 래퍼 + * { "txId": "yyyyMMddHHmmssSSS12345678", "request": {"data": [...]}, "response": {"data": [...]} } + * + * 중요로직: 외부호출 프로젝트에서 요청/응답을 함께 반환하므로 해당 구조를 그대로 매핑한다. + */ +@JsonInclude(JsonInclude.Include.NON_NULL) +@Getter +@Setter +public class ApiExchangeEnvelope { + + /** 트랜잭션 ID */ + @JsonProperty("txId") + private String txId; + + /** 요청 데이터 래퍼 */ + @JsonProperty("request") + private Envelope request; + + /** 응답 데이터 래퍼 */ + @JsonProperty("response") + private Envelope response; +} diff --git a/src/main/java/go/kr/project/api/model/VehicleApiResponseVO.java b/src/main/java/go/kr/project/api/model/VehicleApiResponseVO.java index cb61c8c..ba7ef22 100644 --- a/src/main/java/go/kr/project/api/model/VehicleApiResponseVO.java +++ b/src/main/java/go/kr/project/api/model/VehicleApiResponseVO.java @@ -1,7 +1,7 @@ package go.kr.project.api.model; -import go.kr.project.api.model.response.BasicResponse; -import go.kr.project.api.model.response.LedgerResponse; +import go.kr.project.api.model.response.OldBasicResponse; +import go.kr.project.api.model.response.NewLedgerResponse; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Getter; @@ -21,8 +21,8 @@ public class VehicleApiResponseVO { private boolean success; // 성공 여부 private String message; // 메시지 - private BasicResponse basicInfo; // 차량 기본정보 - private LedgerResponse ledgerInfo; // 등록원부 정보 + private OldBasicResponse basicInfo; // 차량 기본정보 + private NewLedgerResponse ledgerInfo; // 등록원부 정보 private String carBassMatterInqireId; // 자동차 기본 사항 조회 ID private String carLedgerFrmbkId; // 자동차 등록 원부 갑 ID diff --git a/src/main/java/go/kr/project/api/model/request/BasicRequest.java b/src/main/java/go/kr/project/api/model/request/BasicRequest.java deleted file mode 100644 index 2bc3f18..0000000 --- a/src/main/java/go/kr/project/api/model/request/BasicRequest.java +++ /dev/null @@ -1,89 +0,0 @@ -package go.kr.project.api.model.request; - -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; - -@JsonInclude(JsonInclude.Include.NON_NULL) -@Getter -@Setter -@Schema(description = "자동차기본사항조회 요청 항목") -public class BasicRequest { - - // 본문 공통 메타 (VmisRequestEnricher에서 자동 설정) - @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; - - // 서비스별 필드 (VmisRequestEnricher에서 자동 설정) - @Schema(description = "연계정보코드 (자동설정: vmis.gov.services.basic.cntcInfoCode)", example = "AC1_FD11_01") - @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 = "부과기준일", example = "20250101") - @JsonProperty("LEVY_STDDE") - private String levyStdde; - - @Schema(description = "조회구분코드 {2:차대번호(VIN), 3:자동차번호(VHRNO)} (VmisRequestEnricher에서 자동설정)") - @JsonProperty("INQIRE_SE_CODE") - private String inqireSeCode; - - @Schema(description = "자동차등록번호", example = "12가3456") - @JsonProperty("VHRNO") - private String vhrno; - - @Schema(description = "차대번호", example = "KMHAB812345678901") - @JsonProperty("VIN") - private String vin; - - /* - // 추가 항목 (명세 샘플 기준) - @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; - */ - -} diff --git a/src/main/java/go/kr/project/api/model/request/LedgerRequest.java b/src/main/java/go/kr/project/api/model/request/LedgerRequest.java deleted file mode 100644 index 920170a..0000000 --- a/src/main/java/go/kr/project/api/model/request/LedgerRequest.java +++ /dev/null @@ -1,80 +0,0 @@ -package go.kr.project.api.model.request; - -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 javax.validation.constraints.Size; - -@JsonInclude(JsonInclude.Include.NON_NULL) -@Schema(description = "자동차등록원부(갑) 요청 항목") -@Getter -@Setter -public class LedgerRequest { - - // 본문 공통 메타 (VmisRequestEnricher에서 자동 설정) - @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; - - // 서비스별 필드 (VmisRequestEnricher에서 자동 설정) - @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 = "자동차등록번호 (필수)", example = "12가3456") - @JsonProperty("VHRNO") - private String vhrno; - - @Schema(description = "개인정보공개 {1:소유자공개, 2:비공개, 3:비공개(주민등록번호), 4:비공개(사용본거지)} (기본값: 1, VmisRequestEnricher에서 자동설정)") - @JsonProperty("ONES_INFORMATION_OPEN") - private String onesInformationOpen; - - @Schema(description = "민원인성명 (통합조회 시 BasicResponse의 MBER_NM에서 자동매핑)") - @JsonProperty("CPTTR_NM") - private String cpttrNm; - - @Schema(description = "민원인주민번호 (통합조회 시 BasicResponse의 MBER_SE_NO에서 자동매핑)") - @JsonProperty("CPTTR_IHIDNUM") - @Size(max = 13) - private String cpttrIhidnum; - - @Schema(description = "민원인법정동코드 (기본값: null)") - @JsonProperty("CPTTR_LEGALDONG_CODE") - private String cpttrLegaldongCode; - - @Schema(description = "경로구분코드 (기본값: 3, VmisRequestEnricher에서 자동설정)") - @JsonProperty("ROUTE_SE_CODE") - private String routeSeCode; - - @Schema(description = "내역표시 {1:전체내역, 2:최종내역} (기본값: 1, VmisRequestEnricher에서 자동설정)") - @JsonProperty("DETAIL_EXPRESSION") - private String detailExpression; - - @Schema(description = "조회구분코드 {1:열람, 2:발급} (기본값: 1, VmisRequestEnricher에서 자동설정)") - @JsonProperty("INQIRE_SE_CODE") - private String inqireSeCode; - -} diff --git a/src/main/java/go/kr/project/api/model/request/NewBasicRequest.java b/src/main/java/go/kr/project/api/model/request/NewBasicRequest.java new file mode 100644 index 0000000..f6b330c --- /dev/null +++ b/src/main/java/go/kr/project/api/model/request/NewBasicRequest.java @@ -0,0 +1,71 @@ +package go.kr.project.api.model.request; + +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; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@Getter +@Setter +@Schema(description = "자동차기본사항조회 요청 항목 (신버전)") +public class NewBasicRequest { // 총 8개 필드 (외부 클래스 8개, 중첩 Record 클래스 4개) + + // 본문 공통 메타 (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.basic.linkInfoCd)", example = "AC1_FD11_01") + @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 = "조회 대상 record 배열") + @JsonProperty("record") + private java.util.List record; + + @JsonInclude(JsonInclude.Include.NON_NULL) + @Getter + @Setter + @Schema(name = "NewBasicRequest.Record", description = "기본사항 요청 record 항목 (신버전)") + public static class Record { + @Schema(description = "부과기준일", example = "20250101") + @JsonProperty("LEVY_CRTR_YMD") + private String levyCrtrYmd; + + @Schema(description = "조회구분코드 (자동설정: VHRNO not null → 3:자동차번호, VIN not null → 2:차대번호)") + @JsonProperty("INQ_SE_CD") + private String inqSeCd; + + @Schema(description = "자동차등록번호", example = "12가3456") + @JsonProperty("VHRNO") + private String vhrno; + + @Schema(description = "차대번호", example = "KMHAB812345678901") + @JsonProperty("VIN") + private String vin; + } + +} diff --git a/src/main/java/go/kr/project/api/model/request/NewLedgerRequest.java b/src/main/java/go/kr/project/api/model/request/NewLedgerRequest.java new file mode 100644 index 0000000..533996b --- /dev/null +++ b/src/main/java/go/kr/project/api/model/request/NewLedgerRequest.java @@ -0,0 +1,80 @@ +package go.kr.project.api.model.request; + +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 javax.validation.constraints.Size; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@Schema(description = "자동차등록원부(갑) 요청 항목 (신버전)") +@Getter +@Setter +public class NewLedgerRequest { // 총 15개 필드 + + // 본문 공통 메타 (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; + +} diff --git a/src/main/java/go/kr/project/api/model/request/OldBasicRequest.java b/src/main/java/go/kr/project/api/model/request/OldBasicRequest.java new file mode 100644 index 0000000..fd3f01f --- /dev/null +++ b/src/main/java/go/kr/project/api/model/request/OldBasicRequest.java @@ -0,0 +1,71 @@ +package go.kr.project.api.model.request; + +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; + +@JsonInclude(JsonInclude.Include.NON_NULL) +@Getter +@Setter +@Schema(description = "자동차기본사항조회 요청 항목 (구버전)") +public class OldBasicRequest { // 총 8개 필드 (외부 클래스 8개, 중첩 Record 클래스 4개) + + // 본문 공통 메타 (application.yml에서 자동 설정) + @Schema(description = "정보시스템ID (자동설정: old.vmis.system.infoSysId)", example = "41-345") + @JsonProperty("INFO_SYS_ID") + private String infoSysId; + + @Schema(description = "정보시스템IP (자동설정: old.vmis.system.infoSysIp)", example = "105.19.10.135") + @JsonProperty("INFO_SYS_IP") + private String infoSysIp; + + @Schema(description = "시군구코드 (자동설정: old.vmis.system.sigunguCode)", example = "41460") + @JsonProperty("SIGUNGU_CODE") + private String sigunguCode; + + // 서비스별 필드 (application.yml에서 자동 설정) + @Schema(description = "연계정보코드 (자동설정: old.vmis.gov.services.basic.cntcInfoCode)", example = "AC1_FD11_01") + @JsonProperty("CNTC_INFO_CODE") + private String cntcInfoCode; + + @Schema(description = "담당자ID (자동설정: old.vmis.system.chargerId)", example = "") + @JsonProperty("CHARGER_ID") + private String chargerId; + + @Schema(description = "담당자IP (자동설정: old.vmis.system.chargerIp)", example = "") + @JsonProperty("CHARGER_IP") + private String chargerIp; + + @Schema(description = "담당자명 (자동설정: old.vmis.system.chargerNm)", example = "") + @JsonProperty("CHARGER_NM") + private String chargerNm; + + @Schema(description = "조회 대상 record 배열") + @JsonProperty("record") + private java.util.List record; + + @JsonInclude(JsonInclude.Include.NON_NULL) + @Getter + @Setter + @Schema(name = "OldBasicRequest.Record", description = "기본사항 요청 record 항목 (구버전)") + public static class Record { + @Schema(description = "부과기준일", example = "20250101") + @JsonProperty("LEVY_STDDE") + private String levyStdde; + + @Schema(description = "조회구분코드 (자동설정: VHRNO not null → 3:자동차번호, VIN not null → 2:차대번호)") + @JsonProperty("INQIRE_SE_CODE") + private String inqireSeCode; + + @Schema(description = "자동차등록번호", example = "12가3456") + @JsonProperty("VHRNO") + private String vhrno; + + @Schema(description = "차대번호", example = "KMHAB812345678901") + @JsonProperty("VIN") + private String vin; + } + +} diff --git a/src/main/java/go/kr/project/api/model/response/BasicResponse.java b/src/main/java/go/kr/project/api/model/response/BasicResponse.java deleted file mode 100644 index 1e0b665..0000000 --- a/src/main/java/go/kr/project/api/model/response/BasicResponse.java +++ /dev/null @@ -1,208 +0,0 @@ -package go.kr.project.api.model.response; - -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 BasicResponse { - - /** 연계결과코드 */ - @JsonProperty("CNTC_RESULT_CODE") - private String cntcResultCode; - - /** 연계결과상세 */ - @JsonProperty("CNTC_RESULT_DTLS") - private String cntcResultDtls; - - /** 레코드 목록 */ - @JsonProperty("record") - private List record; - - - @JsonInclude(JsonInclude.Include.NON_NULL) - @JsonIgnoreProperties(ignoreUnknown = true) - @Schema(name = "BasicRecord", description = "기본사항 record 항목") - @Getter - @Setter - public static class Record { - /** 생산년도 */ - @JsonProperty("PRYE") private String prye; - /** 등록일자 */ - @JsonProperty("REGIST_DE") private String registDe; - /** 말소등록구분코드 */ - @JsonProperty("ERSR_REGIST_SE_CODE") private String ersrRegistSeCode; - /** 말소등록구분명 */ - @JsonProperty("ERSR_REGIST_SE_NM") private String ersrRegistSeNm; - /** 말소등록일자 */ - @JsonProperty("ERSR_REGIST_DE") private String ersrRegistDe; - /** 등록상세코드 */ - @JsonProperty("REGIST_DETAIL_CODE") private String registDetailCode; - /** 배기량 */ - @JsonProperty("DSPLVL") private String dsplvl; - /** 사용본거지법정동코드 */ - @JsonProperty("USE_STRNGHLD_LEGALDONG_CODE") private String useStrnghldLegaldongCode; - /** 사용본거지행정동코드 */ - @JsonProperty("USE_STRNGHLD_ADSTRD_CODE") private String useStrnghldAdstrdCode; - /** 사용본거지산 */ - @JsonProperty("USE_STRNGHLD_MNTN") private String useStrnghldMntn; - /** 사용본거지번지 */ - @JsonProperty("USE_STRNGHLD_LNBR") private String useStrnghldLnbr; - /** 사용본거지호 */ - @JsonProperty("USE_STRNGHLD_HO") private String useStrnghldHo; - /** 사용본거지주소명 */ - @JsonProperty("USE_STRNGHLD_ADRES_NM") private String useStrnghldAdresNm; - /** 사용본거지도로명코드 */ - @JsonProperty("USE_STRNGHLD_ROAD_NM_CODE") private String useStrnghldRoadNmCode; - /** 사용본거지지하건물구분코드 */ - @JsonProperty("USGSRHLD_UNDGRND_BULD_SE_CODE") private String usgsrhldUndgrndBuldSeCode; - /** 사용본거지건물본번 */ - @JsonProperty("USE_STRNGHLD_BULD_MAIN_NO") private String useStrnghldBuldMainNo; - /** 사용본거지건물부번 */ - @JsonProperty("USE_STRNGHLD_BULD_SUB_NO") private String useStrnghldBuldSubNo; - /** 사용본거지주소전체 */ - @JsonProperty("USGSRHLD_ADRES_FULL") private String usgsrhldAdresFull; - /** 소유자구분코드 */ - @JsonProperty("MBER_SE_CODE") private String mberSeCode; - /** 소유자명 */ - @JsonProperty("MBER_NM") private String mberNm; - /** 소유자구분번호 */ - @JsonProperty("MBER_SE_NO") private String mberSeNo; - /** 전화번호 */ - @JsonProperty("TELNO") private String telno; - /** 소유자법정동코드 */ - @JsonProperty("OWNER_LEGALDONG_CODE") private String ownerLegaldongCode; - /** 소유자행정동코드 */ - @JsonProperty("OWNER_ADSTRD_CODE") private String ownerAdstrdCode; - /** 소유자산 */ - @JsonProperty("OWNER_MNTN") private String ownerMntn; - /** 소유자번지 */ - @JsonProperty("OWNER_LNBR") private String ownerLnbr; - /** 소유자호 */ - @JsonProperty("OWNER_HO") private String ownerHo; - /** 소유자주소명 */ - @JsonProperty("OWNER_ADRES_NM") private String ownerAdresNm; - /** 소유자도로명코드 */ - @JsonProperty("OWNER_ROAD_NM_CODE") private String ownerRoadNmCode; - /** 소유자지하건물구분코드 */ - @JsonProperty("OWNER_UNDGRND_BULD_SE_CODE") private String ownerUndgrndBuldSeCode; - /** 소유자건물본번 */ - @JsonProperty("OWNER_BULD_MAIN_NO") private String ownerBuldMainNo; - /** 소유자건물부번 */ - @JsonProperty("OWNER_BULD_SUB_NO") private String ownerBuldSubNo; - /** 소유자주소전체 */ - @JsonProperty("OWNER_ADRES_FULL") private String ownerAdresFull; - /** 변경후차량번호 */ - @JsonProperty("AFTR_VHRNO") private String aftrVhrno; - /** 사용연료코드 */ - @JsonProperty("USE_FUEL_CODE") private String useFuelCode; - /** 용도구분코드 */ - @JsonProperty("PRPOS_SE_CODE") private String prposSeCode; - /** 제작사명 */ - @JsonProperty("MTRS_FOM_NM") private String mtrsFomNm; - /** 변경전차량번호 */ - @JsonProperty("FRNT_VHRNO") private String frntVhrno; - /** 차량번호 */ - @JsonProperty("VHRNO") private String vhrno; - /** 차대번호 */ - @JsonProperty("VIN") private String vin; - /** 차명 */ - @JsonProperty("CNM") private String cnm; - /** 차량총중량 */ - @JsonProperty("VHCLE_TOT_WT") private String vhcleTotWt; - /** 자동차보험종료일자 */ - @JsonProperty("CAAG_ENDDE") private String caagEndde; - /** 변경일자 */ - @JsonProperty("CHANGE_DE") private String changeDe; - /** 차종분류코드 */ - @JsonProperty("VHCTY_ASORT_CODE") private String vhctyAsortCode; - /** 차종유형코드 */ - @JsonProperty("VHCTY_TY_CODE") private String vhctyTyCode; - /** 차종구분코드 */ - @JsonProperty("VHCTY_SE_CODE") private String vhctySeCode; - /** 최대적재량 */ - @JsonProperty("MXMM_LDG") private String mxmmLdg; - /** 차종분류명 */ - @JsonProperty("VHCTY_ASORT_NM") private String vhctyAsortNm; - /** 차종유형명 */ - @JsonProperty("VHCTY_TY_NM") private String vhctyTyNm; - /** 차종구분명 */ - @JsonProperty("VHCTY_SE_NM") private String vhctySeNm; - /** 최초등록일자 */ - @JsonProperty("FRST_REGIST_DE") private String frstRegistDe; - /** 형식명 */ - @JsonProperty("FOM_NM") private String fomNm; - /** 취득일자 */ - @JsonProperty("ACQS_DE") private String acqsDe; - /** 취득종료일자 */ - @JsonProperty("ACQS_END_DE") private String acqsEndDe; - /** 연식월 */ - @JsonProperty("YBL_MD") private String yblMd; - /** 이전등록일자 */ - @JsonProperty("TRANSR_REGIST_DE") private String transrRegistDe; - /** 특정등록상태코드 */ - @JsonProperty("SPCF_REGIST_STTUS_CODE") private String spcfRegistSttusCode; - /** 색상명 */ - @JsonProperty("COLOR_NM") private String colorNm; - /** 저당건수 */ - @JsonProperty("MRTG_CO") private String mrtgCo; - /** 압류건수 */ - @JsonProperty("SEIZR_CO") private String seizrCo; - /** 압인건수 */ - @JsonProperty("STMD_CO") private String stmdCo; - /** 번호판보관여부 */ - @JsonProperty("NMPL_CSDY_AT") private String nmplCsdyAt; - /** 번호판보관반납일자 */ - @JsonProperty("NMPL_CSDY_REMNR_DE") private String nmplCsdyRemnrDe; - /** 원산지구분코드 */ - @JsonProperty("ORIGIN_SE_CODE") private String originSeCode; - /** 번호판규격코드 */ - @JsonProperty("NMPL_STNDRD_CODE") private String nmplStndrdCode; - /** 취득금액 */ - @JsonProperty("ACQS_AMOUNT") private String acqsAmount; - /** 검사유효기간시작일자 */ - @JsonProperty("INSPT_VALID_PD_BGNDE") private String insptValidPdBgnde; - /** 검사유효기간종료일자 */ - @JsonProperty("INSPT_VALID_PD_ENDDE") private String insptValidPdEndde; - /** 사용본거지우편번호코드 */ - @JsonProperty("USE_STRNGHLD_GRC_CODE") private String useStrnghldGrcCode; - /** 화물차승차정원수 */ - @JsonProperty("TKCAR_PSCAP_CO") private String tkcarPscapCo; - /** 사양번호 */ - @JsonProperty("SPMNNO") private String spmnno; - /** 주행거리 */ - @JsonProperty("TRVL_DSTNC") private String trvlDstnc; - /** 최초등록신청번호 */ - @JsonProperty("FRST_REGIST_RQRCNO") private String frstRegistRqrcno; - /** 자진말소예방공지일자 */ - @JsonProperty("VLNT_ERSR_PRVNTC_NTICE_DE") private String vlntErsrPrvntcNticeDe; - /** 등록기관명 */ - @JsonProperty("REGIST_INSTT_NM") private String registInsttNm; - /** 처리불가사유코드 */ - @JsonProperty("PROCESS_IMPRTY_RESN_CODE") private String processImprtyResnCode; - /** 처리불가사유상세 */ - @JsonProperty("PROCESS_IMPRTY_RESN_DTLS") private String processImprtyResnDtls; - /** 차체길이 */ - @JsonProperty("CBD_LT") private String cbdLt; - /** 차체너비 */ - @JsonProperty("CBD_BT") private String cbdBt; - /** 차체높이 */ - @JsonProperty("CBD_HG") private String cbdHg; - /** 최초최대적재량 */ - @JsonProperty("FRST_MXMM_LDG") private String frstMxmmLdg; - /** 연료소비율 */ - @JsonProperty("FUEL_CNSMP_RT") private String fuelCnsmpRt; - /** 전기복합연료소비율 */ - @JsonProperty("ELCTY_CMPND_FUEL_CNSMP_RT") private String elctyCmpndFuelCnsmpRt; - - } -} diff --git a/src/main/java/go/kr/project/api/model/response/LedgerResponse.java b/src/main/java/go/kr/project/api/model/response/LedgerResponse.java deleted file mode 100644 index 97b1073..0000000 --- a/src/main/java/go/kr/project/api/model/response/LedgerResponse.java +++ /dev/null @@ -1,324 +0,0 @@ -package go.kr.project.api.model.response; - -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; - - /** 사양번호1 */ - @JsonProperty("SPMNNO1") - private String spmnno1; - - /** 사양번호2 */ - @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; - - /** 주소1 */ - @JsonProperty("ADRES1") - private String adres1; - - /** 주소명1 */ - @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; - - - @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; - - public String getMainchk() { return mainchk; } - public void setMainchk(String mainchk) { this.mainchk = mainchk; } - public String getChangeJobSeCode() { return changeJobSeCode; } - public void setChangeJobSeCode(String changeJobSeCode) { this.changeJobSeCode = changeJobSeCode; } - public String getMainno() { return mainno; } - public void setMainno(String mainno) { this.mainno = mainno; } - public String getSubno() { return subno; } - public void setSubno(String subno) { this.subno = subno; } - public String getDtls() { return dtls; } - public void setDtls(String dtls) { this.dtls = dtls; } - public String getRqrcno() { return rqrcno; } - public void setRqrcno(String rqrcno) { this.rqrcno = rqrcno; } - public String getVhmno() { return vhmno; } - public void setVhmno(String vhmno) { this.vhmno = vhmno; } - public String getLedgerGroupNo() { return ledgerGroupNo; } - public void setLedgerGroupNo(String ledgerGroupNo) { this.ledgerGroupNo = ledgerGroupNo; } - public String getLedgerIndvdlzNo() { return ledgerIndvdlzNo; } - public void setLedgerIndvdlzNo(String ledgerIndvdlzNo) { this.ledgerIndvdlzNo = ledgerIndvdlzNo; } - public String getGubunNm() { return gubunNm; } - public void setGubunNm(String gubunNm) { this.gubunNm = gubunNm; } - public String getChangeDe() { return changeDe; } - public void setChangeDe(String changeDe) { this.changeDe = changeDe; } - public String getDetailSn() { return detailSn; } - public void setDetailSn(String detailSn) { this.detailSn = detailSn; } - public String getFlag() { return flag; } - public void setFlag(String flag) { this.flag = flag; } - } -} diff --git a/src/main/java/go/kr/project/api/model/response/NewBasicResponse.java b/src/main/java/go/kr/project/api/model/response/NewBasicResponse.java new file mode 100644 index 0000000..4726173 --- /dev/null +++ b/src/main/java/go/kr/project/api/model/response/NewBasicResponse.java @@ -0,0 +1,130 @@ +package go.kr.project.api.model.response; + +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; + +/** + * 자동차기본사항조회 응답 모델 (신버전) + * + *

+ * 국토교통부 → 지자체 응답 규격을 매핑한 모델입니다. 상위에 연계결과 정보가 오고, + * 상세 데이터는 record 배열로 전달됩니다. + *

+ */ +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +@Schema(description = "자동차기본사항조회 응답 모델 (신버전)") +@Getter +@Setter +public class NewBasicResponse { // 총 3개 필드 (외부 클래스 3개, 중첩 Record 클래스 84개) + + /** 연계결과코드 (성공/실패 코드) */ + @JsonProperty("LINK_RSLT_CD") + private String linkRsltCd; + + /** 연계결과상세 (에러 메시지 등 상세 사유) */ + @JsonProperty("LINK_RSLT_DTL") + private String linkRsltDtl; + + /** 응답 레코드 목록 */ + @JsonProperty("record") + private List record; + + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonIgnoreProperties(ignoreUnknown = true) + @Schema(name = "NewBasicRecord", description = "기본사항 record 항목 (신버전)") + @Getter + @Setter + public static class Record { + @JsonProperty("VHRNO") private String vhrno; // 차량번호 + @JsonProperty("ATMB_NM") private String atmbNm; // 차명 + @JsonProperty("RPRS_OWNR_NM") private String rprsOwnrNm; // 대표소유자성명 + @JsonProperty("RPRSV_OWNR_IDECNO") private String rprsvOwnrIdecno; // 대표소유자회원번호 + @JsonProperty("ERSR_REG_YMD") private String ersrRegYmd; // 말소등록일 + @JsonProperty("PRCS_IMPRTY_RSN_CD") private String prcsImprtyRsnCd; // 처리불가사유코드 + @JsonProperty("PRCS_IMPRTY_RSN_DTLS") private String prcsImprtyRsnDtls; // 처리불가사유명세 + @JsonProperty("YRIDNW") private String yridnw; // 연식 + @JsonProperty("VIN") private String vin; // 차대번호 + @JsonProperty("CARMDL_ASORT_NM") private String carmdlAsortNm; // 차종종별명 + @JsonProperty("FRST_REG_YMD") private String frstRegYmd; // 최초등록일 + @JsonProperty("COLOR_NM") private String colorNm; // 색상명 + @JsonProperty("STRCT_CHG_CNT") private String strctChgCnt; // 구조변경수 + @JsonProperty("NOPLT_CSDY_YN") private String noplTcsdyYn; // 번호판영치여부 + @JsonProperty("NOPLT_CSDY_AVTSMT_YMD") private String noplTcsdyAvtsmtYmd; // 번호판영치최고일 + @JsonProperty("INSP_VLD_PD_BGNG_YMD") private String inspVldPdBgngYmd; // 검사유효기간시작일 + @JsonProperty("INSP_VLD_PD_END_YMD") private String inspVldPdEndYmd; // 검사유효기간종료일 + @JsonProperty("SPMNNO") private String spmnno; // 제원관리번호 + @JsonProperty("DRVNG_DSTNC") private String drvngDstnc; // 주행거리 + @JsonProperty("FOM_NM") private String fomNm; // 형식 + @JsonProperty("DSPLVL") private String dsplvl; // 배기량 + @JsonProperty("CARMDL_CLSF_NM") private String carmdlClsfNm; // 차종분류명 + @JsonProperty("FBCTN_YMD") private String fbctnYmd; // 제작년월일 + @JsonProperty("USGSRHLD_ADDR_NM") private String usgsrhldAddrNm; // 사용본거지상세주소 + @JsonProperty("MTRS_FOM_NM") private String mtrsFomNm; // 원동기형식명 + @JsonProperty("RDCPCT_CNT") private String rdcpctCnt; // 승차정원수 + @JsonProperty("FRST_REG_APLY_RCPT_NO") private String frstRegAplyRcptNo; // 최초등록접수번호 + @JsonProperty("OGNZ_NM") private String ognzNm; // 등록기관명 + @JsonProperty("ERSR_REG_SE_NM") private String ersrRegSeNm; // 말소등록구분명 + @JsonProperty("BFR_VHRNO") private String bfrVhrno; // 이전차량번호 + @JsonProperty("USE_FUEL_CD") private String useFuelCd; // 사용연료코드 + @JsonProperty("RPRS_OWNR_MBR_SE_CD") private String rprsOwnrMbrSeCd; // 대표소유자회원구분코드 + @JsonProperty("RPRS_OWNR_TELNO") private String rprsOwnrTelno; // 대표소유자전화번호 + @JsonProperty("OWNR_STDG_CD") private String ownrStdgCd; // 소유자법정동코드 + @JsonProperty("OWNR_WHOL_ADDR") private String ownrWholAddr; // 소유자전체주소 + @JsonProperty("VHCL_TOTL_WT") private String vhclTotlWt; // 차량총중량 + @JsonProperty("MXMM_LDG") private String mxmmLdg; // 최대적재량 + @JsonProperty("CBD_LT") private String cbdLt; // 차체길이 + @JsonProperty("CBD_BT") private String cbdBt; // 차체너비 + @JsonProperty("CBD_HG") private String cbdHg; // 차체높이 + @JsonProperty("CARMDL_ASORT_CD") private String carmdlAsortCd; // 차종종별코드 + @JsonProperty("CARMDL_TYPE_CD") private String carmdlTypeCd; // 차종유형코드 + @JsonProperty("FUEL_CNSMPRT") private String fuelCnsmprt; // 연료소비율 + @JsonProperty("ERSR_REG_SE_CD") private String ersrRegSeCd; // 말소등록구분코드 + @JsonProperty("REG_DTL_CD") private String regDtlCd; // 등록상세코드 + @JsonProperty("USGSRHLD_STDG_CD") private String usgsrhldStdgCd; // 사용본거지법정동코드 + @JsonProperty("USGSRHLD_DONG_CD") private String usgsrhldDongCd; // 사용본거지행정동코드 + @JsonProperty("USGSRHLD_MTN_YN") private String usgsrhldMtnYn; // 사용본거지산 여부 + @JsonProperty("USGSRHLD_LNBR") private String usgsrhldLnbr; // 사용본거지번지 + @JsonProperty("USGSRHLD_HO") private String usgsrhldHo; // 사용본거지호 + @JsonProperty("USGSRHLD_ROAD_NM_CD") private String usgsrhldRoadNmCd; // 사용본거지도로명코드 + @JsonProperty("USGSRHLD_UDGD_BLDG_SE_CD") private String usgsrhldUdgdBldgSeCd; // 사용본거지지하건물구분코드 + @JsonProperty("USGSRHLD_BMNO") private String usgsrhldBmno; // 사용본거지건물주요번호 + @JsonProperty("USGSRHLD_BSNO") private String usgsrhldBsno; // 사용본거지건물부번호 + @JsonProperty("OWNR_DONG_CD") private String ownrDongCd; // 소유자행정동코드 + @JsonProperty("OWNR_MTN_YN") private String ownrMtnYn; // 소유자산 여부 + @JsonProperty("OWNR_LNBR") private String ownrLnbr; // 소유자번지 + @JsonProperty("OWNR_HO") private String ownrHo; // 소유자호 + @JsonProperty("OWNR_ADDR_NM") private String ownrAddrNm; // 소유자상세주소 + @JsonProperty("OWNR_ROAD_NM_CD") private String ownrRoadNmCd; // 소유자도로명코드 + @JsonProperty("OWNR_UDGD_BLDG_SE_CD") private String ownrUdgdBldgSeCd; // 소유자지하건물구분코드 + @JsonProperty("OWNR_BMNO") private String ownrBmno; // 소유자건물주요번호 + @JsonProperty("OWNR_BSNO") private String ownrBsno; // 소유자건물부번호 + @JsonProperty("REAR_VHRNO") private String rearVhrno; // 신차량번호 + @JsonProperty("USG_SE_CD") private String usgSeCd; // 용도구분코드 + @JsonProperty("VEAG_END_YMD") private String veagEndYmd; // 차령만료일자 + @JsonProperty("CHG_YMD") private String chgYmd; // 차번호변경시기 + @JsonProperty("CARMDL_SE_CD") private String carmdlSeCd; // 차종분류코드 + @JsonProperty("CARMDL_TYPE_NM") private String carmdlTypeNm; // 차종유형명 + @JsonProperty("ACQS_YMD") private String acqsYmd; // 취득일자 + @JsonProperty("ACQS_END_YMD") private String acqsEndYmd; // 취득종료일자 + @JsonProperty("TRANSR_REG_YMD") private String transrRegYmd; // 이전등록일(양수일) + @JsonProperty("SPCF_REG_STTS_CD") private String spcfRegSttsCd; // 제원등록상태코드 + @JsonProperty("SRC_SE_CD") private String srcSeCd; // 출처구분코드 + @JsonProperty("NOPLT_SPCFCT_CD") private String noplTSpcfctCd; // 번호판규격코드 + @JsonProperty("ACQS_AMT") private String acqsAmt; // 취득금액 + @JsonProperty("USGSRHLD_GRC_CD") private String usgsrhldGrcCd; // 사용본거지관청코드 + @JsonProperty("VLNT_ERSR_PRVNTC_AVTSMT_YMD") private String vlntErsrPrvntcAvtsmtYmd; // 예고통지일 + @JsonProperty("FRST_MXMM_LDG") private String frstMxmmLdg; // 최초최대적재량 + @JsonProperty("REG_YMD") private String regYmd; // 등록일(변경일) + @JsonProperty("ELCTY_CMPND_FUEL_CNSMPRT") private String elctyCmpndFuelCnsmprt; // 전기복합연료소비율 + @JsonProperty("USGSRHLD_WHOL_ADDR") private String usgsrhldWholAddr; // 사용본거지전체주소 + @JsonProperty("MRTG_CNT") private String mrtgCnt; // 저당수 + @JsonProperty("SZR_CNT") private String szrCnt; // 압류건수 + } +} diff --git a/src/main/java/go/kr/project/api/model/response/NewLedgerResponse.java b/src/main/java/go/kr/project/api/model/response/NewLedgerResponse.java new file mode 100644 index 0000000..991ef96 --- /dev/null +++ b/src/main/java/go/kr/project/api/model/response/NewLedgerResponse.java @@ -0,0 +1,343 @@ +package go.kr.project.api.model.response; + +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 { // 총 64개 필드 (외부 클래스 66개, 중첩 Record 클래스 16개) + + @JsonProperty("LINK_RSLT_CD") + private String linkRsltCd; + + @JsonProperty("LINK_RSLT_DTL") + private String linkRsltDtl; + + /** 원부그룹번호 */ + @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; + + + @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; + } +} diff --git a/src/main/java/go/kr/project/api/model/response/OldBasicResponse.java b/src/main/java/go/kr/project/api/model/response/OldBasicResponse.java new file mode 100644 index 0000000..f0c1c27 --- /dev/null +++ b/src/main/java/go/kr/project/api/model/response/OldBasicResponse.java @@ -0,0 +1,132 @@ +package go.kr.project.api.model.response; + +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; + +/** + * 자동차기본사항조회 응답 모델 (구버전) + * + *

+ * 구 규격(도로교통공단/교통안전공단 구버전) 응답을 매핑한 모델입니다. + * 상단에 연계 결과코드/상세가 오고, 상세 데이터는 record 배열로 내려옵니다. + *

+ */ +@JsonInclude(JsonInclude.Include.NON_NULL) +@JsonIgnoreProperties(ignoreUnknown = true) +@Schema(description = "자동차기본사항조회 응답 모델 (구버전)") +@Getter +@Setter +public class OldBasicResponse { // 총 3개 필드 (외부 클래스 3개, 중첩 Record 클래스 84개) + + /** 연계결과코드 */ + @JsonProperty("CNTC_RESULT_CODE") + private String cntcResultCode; + + /** 연계결과상세 */ + @JsonProperty("CNTC_RESULT_DTLS") + private String cntcResultDtls; + + /** 응답 레코드 목록 */ + @JsonProperty("record") + private List record; + + + @JsonInclude(JsonInclude.Include.NON_NULL) + @JsonIgnoreProperties(ignoreUnknown = true) + @Schema(name = "OldBasicRecord", description = "기본사항 record 항목 (구버전)") + @Getter + @Setter + public static class Record { + @JsonProperty("PRYE") private String prye; // 연식 + @JsonProperty("REGIST_DE") private String registDe; // 등록일자(변경일) + @JsonProperty("ERSR_REGIST_SE_CODE") private String ersrRegistSeCode; // 말소등록구분코드 + @JsonProperty("ERSR_REGIST_SE_NM") private String ersrRegistSeNm; // 말소등록구분명 + @JsonProperty("ERSR_REGIST_DE") private String ersrRegistDe; // 말소등록일자 + @JsonProperty("REGIST_DETAIL_CODE") private String registDetailCode; // 등록상세코드 + @JsonProperty("DSPLVL") private String dsplvl; // 배기량 + @JsonProperty("USE_STRNGHLD_LEGALDONG_CODE") private String useStrnghldLegaldongCode; // 사용본거지법정동코드 + @JsonProperty("USE_STRNGHLD_ADSTRD_CODE") private String useStrnghldAdstrdCode; // 사용본거지행정동코드 + @JsonProperty("USE_STRNGHLD_MNTN") private String useStrnghldMntn; // 사용본거지산 여부 + @JsonProperty("USE_STRNGHLD_LNBR") private String useStrnghldLnbr; // 사용본거지번지 + @JsonProperty("USE_STRNGHLD_HO") private String useStrnghldHo; // 사용본거지호 + @JsonProperty("USE_STRNGHLD_ADRES_NM") private String useStrnghldAdresNm; // 사용본거지상세주소 + @JsonProperty("USE_STRNGHLD_ROAD_NM_CODE") private String useStrnghldRoadNmCode; // 사용본거지도로명코드 + @JsonProperty("USGSRHLD_UNDGRND_BULD_SE_CODE") private String usgsrhldUndgrndBuldSeCode; // 사용본거지지하건물구분코드 + @JsonProperty("USE_STRNGHLD_BULD_MAIN_NO") private String useStrnghldBuldMainNo; // 사용본거지건물주요번호 + @JsonProperty("USE_STRNGHLD_BULD_SUB_NO") private String useStrnghldBuldSubNo; // 사용본거지건물부번호 + @JsonProperty("USGSRHLD_ADRES_FULL") private String usgsrhldAdresFull; // 사용본거지전체주소 + @JsonProperty("MBER_SE_CODE") private String mberSeCode; // 대표소유자회원구분코드 + @JsonProperty("MBER_NM") private String mberNm; // 대표소유자성명 + @JsonProperty("MBER_SE_NO") private String mberSeNo; // 대표소유자회원번호 + @JsonProperty("TELNO") private String telno; // 대표소유자전화번호 + @JsonProperty("OWNER_LEGALDONG_CODE") private String ownerLegaldongCode; // 소유자법정동코드 + @JsonProperty("OWNER_ADSTRD_CODE") private String ownerAdstrdCode; // 소유자행정동코드 + @JsonProperty("OWNER_MNTN") private String ownerMntn; // 소유자산 여부 + @JsonProperty("OWNER_LNBR") private String ownerLnbr; // 소유자번지 + @JsonProperty("OWNER_HO") private String ownerHo; // 소유자호 + @JsonProperty("OWNER_ADRES_NM") private String ownerAdresNm; // 소유자상세주소 + @JsonProperty("OWNER_ROAD_NM_CODE") private String ownerRoadNmCode; // 소유자도로명코드 + @JsonProperty("OWNER_UNDGRND_BULD_SE_CODE") private String ownerUndgrndBuldSeCode; // 소유자지하건물구분코드 + @JsonProperty("OWNER_BULD_MAIN_NO") private String ownerBuldMainNo; // 소유자건물주요번호 + @JsonProperty("OWNER_BULD_SUB_NO") private String ownerBuldSubNo; // 소유자건물부번호 + @JsonProperty("OWNER_ADRES_FULL") private String ownerAdresFull; // 소유자전체주소 + @JsonProperty("AFTR_VHRNO") private String aftrVhrno; // 신차량번호 + @JsonProperty("USE_FUEL_CODE") private String useFuelCode; // 사용연료코드 + @JsonProperty("PRPOS_SE_CODE") private String prposSeCode; // 용도구분코드 + @JsonProperty("MTRS_FOM_NM") private String mtrsFomNm; // 원동기형식명 + @JsonProperty("FRNT_VHRNO") private String frntVhrno; // 이전차량번호 + @JsonProperty("VHRNO") private String vhrno; // 차량번호 + @JsonProperty("VIN") private String vin; // 차대번호 + @JsonProperty("CNM") private String cnm; // 차명 + @JsonProperty("VHCLE_TOT_WT") private String vhcleTotWt; // 차량총중량 + @JsonProperty("CAAG_ENDDE") private String caagEndde; // 차령만료일자 + @JsonProperty("CHANGE_DE") private String changeDe; // 차번호변경시기 + @JsonProperty("VHCTY_ASORT_CODE") private String vhctyAsortCode; // 차종종별코드 + @JsonProperty("VHCTY_TY_CODE") private String vhctyTyCode; // 차종유형코드 + @JsonProperty("VHCTY_SE_CODE") private String vhctySeCode; // 차종분류코드 + @JsonProperty("MXMM_LDG") private String mxmmLdg; // 최대적재량 + @JsonProperty("VHCTY_ASORT_NM") private String vhctyAsortNm; // 차종종별명 + @JsonProperty("VHCTY_TY_NM") private String vhctyTyNm; // 차종유형명 + @JsonProperty("VHCTY_SE_NM") private String vhctySeNm; // 차종분류명 + @JsonProperty("FRST_REGIST_DE") private String frstRegistDe; // 최초등록일 + @JsonProperty("FOM_NM") private String fomNm; // 형식 + @JsonProperty("ACQS_DE") private String acqsDe; // 취득일자 + @JsonProperty("ACQS_END_DE") private String acqsEndDe; // 취득종료일자 + @JsonProperty("YBL_MD") private String yblMd; // 제작연월(추정) + @JsonProperty("TRANSR_REGIST_DE") private String transrRegistDe; // 이전등록일(양수일) + @JsonProperty("SPCF_REGIST_STTUS_CODE") private String spcfRegistSttusCode; // 제원등록상태코드 + @JsonProperty("COLOR_NM") private String colorNm; // 색상명 + @JsonProperty("MRTG_CO") private String mrtgCo; // 저당수 + @JsonProperty("SEIZR_CO") private String seizrCo; // 압류건수 + @JsonProperty("STMD_CO") private String stmdCo; // 기타 설정/처분 건수(추정) + @JsonProperty("NMPL_CSDY_AT") private String nmplCsdyAt; // 번호판영치여부 + @JsonProperty("NMPL_CSDY_REMNR_DE") private String nmplCsdyRemnrDe; // 번호판영치최고일 + @JsonProperty("ORIGIN_SE_CODE") private String originSeCode; // 출처구분코드 + @JsonProperty("NMPL_STNDRD_CODE") private String nmplStndrdCode; // 번호판규격코드 + @JsonProperty("ACQS_AMOUNT") private String acqsAmount; // 취득금액 + @JsonProperty("INSPT_VALID_PD_BGNDE") private String insptValidPdBgnde; // 검사유효기간시작일 + @JsonProperty("INSPT_VALID_PD_ENDDE") private String insptValidPdEndde; // 검사유효기간종료일 + @JsonProperty("USE_STRNGHLD_GRC_CODE") private String useStrnghldGrcCode; // 사용본거지관청코드 + @JsonProperty("TKCAR_PSCAP_CO") private String tkcarPscapCo; // 승차정원수 + @JsonProperty("SPMNNO") private String spmnno; // 제원관리번호 + @JsonProperty("TRVL_DSTNC") private String trvlDstnc; // 주행거리 + @JsonProperty("FRST_REGIST_RQRCNO") private String frstRegistRqrcno; // 최초등록접수번호 + @JsonProperty("VLNT_ERSR_PRVNTC_NTICE_DE") private String vlntErsrPrvntcNticeDe; // 예고통지일 + @JsonProperty("REGIST_INSTT_NM") private String registInsttNm; // 등록기관명 + @JsonProperty("PROCESS_IMPRTY_RESN_CODE") private String processImprtyResnCode; // 처리불가사유코드 + @JsonProperty("PROCESS_IMPRTY_RESN_DTLS") private String processImprtyResnDtls; // 처리불가사유명세 + @JsonProperty("CBD_LT") private String cbdLt; // 차체길이 + @JsonProperty("CBD_BT") private String cbdBt; // 차체너비 + @JsonProperty("CBD_HG") private String cbdHg; // 차체높이 + @JsonProperty("FRST_MXMM_LDG") private String frstMxmmLdg; // 최초최대적재량 + @JsonProperty("FUEL_CNSMP_RT") private String fuelCnsmpRt; // 연료소비율 + @JsonProperty("ELCTY_CMPND_FUEL_CNSMP_RT") private String elctyCmpndFuelCnsmpRt; // 전기복합연료소비율 + + } +} diff --git a/src/main/java/go/kr/project/api/model/response/VmisCarBassMatterInqireVO.java b/src/main/java/go/kr/project/api/model/response/VmisCarBassMatterInqireVO.java index bc4aaee..49f764c 100644 --- a/src/main/java/go/kr/project/api/model/response/VmisCarBassMatterInqireVO.java +++ b/src/main/java/go/kr/project/api/model/response/VmisCarBassMatterInqireVO.java @@ -1,14 +1,16 @@ package go.kr.project.api.model.response; import go.kr.project.api.config.ApiConstant; +import go.kr.project.api.model.ApiExchangeEnvelope; import go.kr.project.api.model.Envelope; -import go.kr.project.api.model.request.BasicRequest; +import go.kr.project.api.model.request.OldBasicRequest; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; import lombok.NoArgsConstructor; import java.time.LocalDateTime; +import java.util.List; /** * 자동차 기본 사항 조회 엔티티, DB 저장용 @@ -21,133 +23,15 @@ import java.time.LocalDateTime; @NoArgsConstructor @AllArgsConstructor public class VmisCarBassMatterInqireVO { - - // ==== Static factory/mapping methods (moved from Service) ==== - public static VmisCarBassMatterInqireVO fromRequest(BasicRequest request) { - return VmisCarBassMatterInqireVO.builder() - .infoSysId(request.getInfoSysId()) - .infoSysIp(request.getInfoSysIp()) - .sigunguCode(request.getSigunguCode()) - .cntcInfoCode(request.getCntcInfoCode()) - .chargerId(request.getChargerId()) - .chargerIp(request.getChargerIp()) - .chargerNm(request.getChargerNm()) - .dmndLevyStdde(request.getLevyStdde()) - .dmndInqireSeCode(request.getInqireSeCode()) - .dmndVhrno(request.getVhrno()) - .dmndVin(request.getVin()) - .rgtr(ApiConstant.DEFAULT_REGISTRANT) - .build(); - } - - public static VmisCarBassMatterInqireVO fromResponse(String id, Envelope envelope) { - if (envelope == null || envelope.getData() == null || envelope.getData().isEmpty()) return null; - BasicResponse response = envelope.getData().get(0); - VmisCarBassMatterInqireVO.VmisCarBassMatterInqireVOBuilder builder = VmisCarBassMatterInqireVO.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(VmisCarBassMatterInqireVO.VmisCarBassMatterInqireVOBuilder 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; + // 신규 응답용 txId + private String txId; + // ===== 요청 정보 ===== /** * 정보 시스템 ID @@ -157,32 +41,32 @@ public class VmisCarBassMatterInqireVO { /** * 정보 시스템 IP */ - private String infoSysIp; + private String infoSysIpAddr; /** * 시군구 코드 */ - private String sigunguCode; + private String sggCd; /** * 연계 정보 코드 */ - private String cntcInfoCode; + private String linkInfoCd; /** * 담당자 ID */ - private String chargerId; + private String picId; /** * 담당자 IP */ - private String chargerIp; + private String picIpAddr; /** * 담당자명 */ - private String chargerNm; + private String picNm; /** * 요청 부과 기준일 @@ -206,14 +90,14 @@ public class VmisCarBassMatterInqireVO { // ===== 응답 정보 (결과 수신 시 UPDATE) ===== /** - * 연계 결과 코드 + * 연계 결과 코드 - LINK_RSLT_CD */ - private String cntcResultCode; + private String linkRsltCd; /** - * 연계 결과 상세 + * 연계 결과 상세 - LINK_RSLT_DTL */ - private String cntcResultDtls; + private String linkRsltDtl; /** * 연식 @@ -630,6 +514,11 @@ public class VmisCarBassMatterInqireVO { */ private String elctyCmpndFuelCnsmpRt; + /** + * 자동차 과태료 대상 ID + */ + private String carFfnlgTrgtId; + /** * 등록 일시 */ @@ -644,4 +533,169 @@ public class VmisCarBassMatterInqireVO { * 대표소유자 성명 */ private String mberNm; + + /** + * OldBasicRequest에서 VO로 변환 (최초 요청 로그 저장용) + * + * @param request OldBasicRequest 요청 객체 + * @return 초기 요청 정보가 담긴 VO + */ + public static VmisCarBassMatterInqireVO fromOldRequest(OldBasicRequest request) { + if (request == null) { + return null; + } + + // record 배열에서 첫 번째 요청 데이터 추출 + OldBasicRequest.Record record = null; + if (request.getRecord() != null && !request.getRecord().isEmpty()) { + record = request.getRecord().get(0); + } + + VmisCarBassMatterInqireVO.VmisCarBassMatterInqireVOBuilder builder = VmisCarBassMatterInqireVO.builder() + // 헤더 정보 (request 외부 클래스에서) + .infoSysId(request.getInfoSysId()) // INFO_SYS_ID → infoSysId + .infoSysIpAddr(request.getInfoSysIp()) // INFO_SYS_IP → infoSysIpAddr + .sggCd(request.getSigunguCode()) // SIGUNGU_CODE → sggCd + .linkInfoCd(request.getCntcInfoCode()) // CNTC_INFO_CODE → linkInfoCd + .picId(request.getChargerId()) // CHARGER_ID → picId + .picIpAddr(request.getChargerIp()) // CHARGER_IP → picIpAddr + .picNm(request.getChargerNm()); // CHARGER_NM → picNm + + // 요청 본문 정보 (request.record[0]에서) + if (record != null) { + builder + .dmndLevyStdde(record.getLevyStdde()) // LEVY_STDDE → dmndLevyStdde + .dmndInqireSeCode(record.getInqireSeCode()) // INQIRE_SE_CODE → dmndInqireSeCode + .dmndVhrno(record.getVhrno()) // VHRNO → dmndVhrno + .dmndVin(record.getVin()); // VIN → dmndVin + } + + return builder.build(); + } + + /** + * ApiExchangeEnvelope에서 VO로 변환 (응답 업데이트용) + * + * @param generatedId 생성된 PK ID + * @param envelope API 응답 Envelope + * @return 응답 정보가 담긴 VO + */ + public static VmisCarBassMatterInqireVO fromOldExchange( + String generatedId, + ApiExchangeEnvelope envelope) { + + if (envelope == null || envelope.getResponse() == null) { + return null; + } + + Envelope response = envelope.getResponse(); + List data = response.getData(); + + if (data == null || data.isEmpty()) { + return null; + } + + OldBasicResponse firstData = data.get(0); + List records = firstData.getRecord(); + + // 응답 정보 업데이트용 VO 빌드 + VmisCarBassMatterInqireVO.VmisCarBassMatterInqireVOBuilder builder = VmisCarBassMatterInqireVO.builder() + .carBassMatterInqireId(generatedId) + .txId(envelope.getTxId()) + .linkRsltCd(firstData.getCntcResultCode()) + .linkRsltDtl(firstData.getCntcResultDtls()); + + // record가 있는 경우 첫 번째 record의 상세 정보 매핑 + if (records != null && !records.isEmpty()) { + OldBasicResponse.Record record = records.get(0); + + 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()) + .mberNm(record.getMberNm()) + .mberSeNo(record.getMberSeNo()) + .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()); + } + + return builder.build(); + } } diff --git a/src/main/java/go/kr/project/api/model/response/VmisCarLedgerFrmbkDtlVO.java b/src/main/java/go/kr/project/api/model/response/VmisCarLedgerFrmbkDtlVO.java index a4aeae5..bd23d5f 100644 --- a/src/main/java/go/kr/project/api/model/response/VmisCarLedgerFrmbkDtlVO.java +++ b/src/main/java/go/kr/project/api/model/response/VmisCarLedgerFrmbkDtlVO.java @@ -1,6 +1,9 @@ package go.kr.project.api.model.response; import go.kr.project.api.config.ApiConstant; +import go.kr.project.api.model.ApiExchangeEnvelope; +import go.kr.project.api.model.Envelope; +import go.kr.project.api.model.request.NewLedgerRequest; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -8,6 +11,7 @@ import lombok.NoArgsConstructor; import java.util.ArrayList; import java.util.List; +import java.util.stream.Collectors; /** * 자동차 등록 원부(갑) 상세 엔티티 VO, DB 저장용 @@ -20,54 +24,116 @@ import java.util.List; @AllArgsConstructor public class VmisCarLedgerFrmbkDtlVO { - // ==== Static factory/mapping methods (moved from Service) ==== - public static List listFromResponse(LedgerResponse res, String masterId) { - List list = new ArrayList<>(); - if (res == null || res.getRecord() == null) return list; - for (LedgerResponse.Record r : res.getRecord()) { - VmisCarLedgerFrmbkDtlVO vo = VmisCarLedgerFrmbkDtlVO.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 carLedgerFrmbkId; // CAR_LEDGER_FRMBK_ID + + // 본문 - DB 컬럼명과 정확히 일치 + private String szrRmvDtlSn; // SZR_RMV_DTL_SN + private String chgTaskSeCd; // CHG_TASK_SE_CD + private String mainNo; // MAIN_NO + private String sno; // SNO + private String spcablMttr; // SPCABL_MTTR + private String hshldrNm; // HSHLDR_NM + private String hshldrIdecno; // HSHLDR_IDECNO + private String aplyRcptNo; // APLY_RCPT_NO + private String vhmno; // VHMNO + private String ledgerGroupNo; // LEDGER_GROUP_NO + private String ledgerIndivNo; // LEDGER_INDIV_NO + private String chgTaskSeNm; // CHG_TASK_SE_NM + private String chgYmd; // CHG_YMD + private String dtlSn; // DTL_SN + private String flag; // FLAG // 감사 - private String rgtr; + private String rgtr; // RGTR + + /** + * ApiExchangeEnvelope에서 상세 VO 리스트로 변환 + * + * @param envelope API 응답 Envelope + * @param generatedId 생성된 마스터 PK ID + * @return 상세 VO 리스트 + */ + public static List listNewFromExchange( + ApiExchangeEnvelope envelope, + String generatedId) { + + if (envelope == null || envelope.getResponse() == null) { + return new ArrayList<>(); + } + + Envelope response = envelope.getResponse(); + List data = response.getData(); + + if (data == null || data.isEmpty()) { + return new ArrayList<>(); + } + + NewLedgerResponse firstData = data.get(0); + List records = firstData.getRecord(); + + if (records == null || records.isEmpty()) { + return new ArrayList<>(); + } + + // Record 리스트를 VmisCarLedgerFrmbkDtlVO 리스트로 변환 + return records.stream() + .map(record -> VmisCarLedgerFrmbkDtlVO.builder() + .carLedgerFrmbkId(generatedId) + .szrRmvDtlSn(record.getSzrRmvDtlSn()) + .chgTaskSeCd(record.getChgTaskSeCd()) + .mainNo(record.getMainNo()) + .sno(record.getSno()) + .spcablMttr(record.getSpcablMttr()) + .hshldrNm(record.getHshldrNm()) + .hshldrIdecno(record.getHshldrIdecno()) + .aplyRcptNo(record.getAplyRcptNo()) + .vhmno(record.getVhmno()) + .ledgerGroupNo(record.getLedgerGroupNo()) + .ledgerIndivNo(record.getLedgerIndivNo()) + .chgTaskSeNm(record.getChgTaskSeNm()) + .chgYmd(record.getChgYmd()) + .dtlSn(record.getDtlSn()) + .flag(record.getFlag()) + .build()) + .collect(Collectors.toList()); + } + + /** + * NewLedgerResponse.Record에서 단일 상세 VO로 변환 + * + * @param record NewLedgerResponse.Record 객체 + * @param carLedgerFrmbkId 마스터 PK ID + * @return 상세 VO + */ + public static VmisCarLedgerFrmbkDtlVO fromRecord( + NewLedgerResponse.Record record, + String carLedgerFrmbkId) { + + if (record == null) { + return null; + } + + return VmisCarLedgerFrmbkDtlVO.builder() + .carLedgerFrmbkId(carLedgerFrmbkId) + .szrRmvDtlSn(record.getSzrRmvDtlSn()) + .chgTaskSeCd(record.getChgTaskSeCd()) + .mainNo(record.getMainNo()) + .sno(record.getSno()) + .spcablMttr(record.getSpcablMttr()) + .hshldrNm(record.getHshldrNm()) + .hshldrIdecno(record.getHshldrIdecno()) + .aplyRcptNo(record.getAplyRcptNo()) + .vhmno(record.getVhmno()) + .ledgerGroupNo(record.getLedgerGroupNo()) + .ledgerIndivNo(record.getLedgerIndivNo()) + .chgTaskSeNm(record.getChgTaskSeNm()) + .chgYmd(record.getChgYmd()) + .dtlSn(record.getDtlSn()) + .flag(record.getFlag()) + .build(); + } } diff --git a/src/main/java/go/kr/project/api/model/response/VmisCarLedgerFrmbkVO.java b/src/main/java/go/kr/project/api/model/response/VmisCarLedgerFrmbkVO.java index ed742c7..1a85bda 100644 --- a/src/main/java/go/kr/project/api/model/response/VmisCarLedgerFrmbkVO.java +++ b/src/main/java/go/kr/project/api/model/response/VmisCarLedgerFrmbkVO.java @@ -1,6 +1,7 @@ package go.kr.project.api.model.response; import go.kr.project.api.config.ApiConstant; +import go.kr.project.api.model.request.NewLedgerRequest; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -16,177 +17,224 @@ import lombok.NoArgsConstructor; @NoArgsConstructor @AllArgsConstructor public class VmisCarLedgerFrmbkVO { + // PK + private String carLedgerFrmbkId; + + // 신규 응답용 txId + private String txId; + + // 요청(헤더/본문) 정보 - DB 컬럼명과 동일하게 + private String infoSysId; // INFO_SYS_ID + private String infoSysIpAddr; // INFO_SYS_IP_ADDR + private String sggCd; // SGG_CD + private String linkInfoCd; // LINK_INFO_CD + private String picId; // PIC_ID + private String picIpAddr; // PIC_IP_ADDR + private String picNm; // PIC_NM + + // 요청 본문 - DB 컬럼명과 동일하게 + private String dmndVhrno; // DMND_VHRNO + private String dmndPrvcRls; // DMND_PRVC_RLS + private String dmndCvlprNm; // DMND_CVLPR_NM + private String dmndCvlprIdecno; // DMND_CVLPR_IDECNO + private String dmndCvlprStdgCd; // DMND_CVLPR_STDG_CD + private String dmndPathSeCd; // DMND_PATH_SE_CD + private String dmndDsctnIndct; // DMND_DSCTN_INDCT + private String dmndInqSeCd; // DMND_INQ_SE_CD + + // 응답 요약 정보 - DB 컬럼명과 동일하게 + private String linkRsltCd; // LINK_RSLT_CD + private String linkRsltDtl; // LINK_RSLT_DTL + + // 응답 본문(마스터) - DB 컬럼명과 정확히 일치 + private String ledgerGroupNo; // LEDGER_GROUP_NO + private String ledgerIndivNo; // LEDGER_INDIV_NO + private String vhmno; // VHMNO + private String vhrno; // VHRNO + private String vin; // VIN + private String carmdlAsortCd; // CARMDL_ASORT_CD + private String carmdlAsortNm; // CARMDL_ASORT_NM + private String atmbNm; // ATMB_NM + private String colorCd; // COLOR_CD + private String colorNm; // COLOR_NM + private String nopltSpcfctCd; // NOPLT_SPCFCT_CD + private String nopltSpcfctNm; // NOPLT_SPCFCT_NM + private String usgSeCd; // USG_SE_CD + private String usgSeNm; // USG_SE_NM + private String mtrsFomNm; // MTRS_FOM_NM + private String fomNm; // FOM_NM + private String acqsAmt; // ACQS_AMT + private String regDtlCd; // REG_DTL_CD + private String regDtlNm; // REG_DTL_NM + private String frstRegYmd; // FRST_REG_YMD + private String veagEndYmd; // VEAG_END_YMD + private String yridnw; // YRIDNW + private String spmnno1; // SPMNNO_1 + private String spmnno2; // SPMNNO_2 + private String fbctnYmd; // FBCTN_YMD + private String drvngDstnc; // DRVNG_DSTNC + private String inspVldPdBgngYmd; // INSP_VLD_PD_BGNG_YMD + private String inspVldPdEndYmd; // INSP_VLD_PD_END_YMD + private String chckVldPdBgngYmd; // CHCK_VLD_PD_BGNG_YMD + private String chckVldPdEndYmd; // CHCK_VLD_PD_END_YMD + private String regAplySeNm; // REG_APLY_SE_NM + private String frstRegAplyRcptNo; // FRST_REG_APLY_RCPT_NO + private String nopltCsdyAvtsmtYmd; // NOPLT_CSDY_AVTSMT_YMD + private String nopltCsdyYn; // NOPLT_CSDY_YN + private String bssUsePdYmd; // BSS_USE_PD_YMD + private String octhtErsrPrvntcAvtsmtYmd;// OCTHT_ERSR_PRVNTC_AVTSMT_YMD + private String ersrRegYmd; // ERSR_REG_YMD + private String ersrRegSeCd; // ERSR_REG_SE_CD + private String ersrRegSeNm; // ERSR_REG_SE_NM + private String mrtgCnt; // MRTG_CNT + private String szrCnt; // SZR_CNT + private String strctChgCnt; // STRCT_CHG_CNT + private String usgsrhldAddr1; // USGSRHLD_ADDR_1 + private String usgsrhldAddrDtl1; // USGSRHLD_ADDR_DTL_1 + private String ownrAddr; // OWNR_ADDR + private String ownrAddrDtl; // OWNR_ADDR_DTL + private String indvdlBzmnYn; // INDVDL_BZMN_YN + private String rprsOwnrTelno; // RPRS_OWNR_TELNO + private String rprsOwnrNm; // RPRS_OWNR_NM + private String rprsOwnrMbrSeCd; // RPRS_OWNR_MBR_SE_CD + private String rprsvOwnrIdecno; // RPRSV_OWNR_IDECNO + private String taxxmptTrprSeCd; // TAXXMPT_TRPR_SE_CD + private String taxxmptAplcnSeCd; // TAXXMPT_APLCN_SE_CD + private String spcablMttrCnt; // SPCABL_MTTR_CNT + private String usgsrhldDongNm; // USGSRHLD_DONG_NM + private String prvntcCnt; // PRVNTC_CNT + private String xportFlflYnDclrYmd; // XPORT_FLFL_YN_DCLR_YMD + private String issuNo; // ISSU_NO + private String frstTrnsfrYmd; // FRST_TRNSFR_YMD + private String drivSrgbtryIdntfNo; // DRIV_SRGBTRY_IDNTF_NO + private String prcsImprtyRsnCd; // PRCS_IMPRTY_RSN_CD + private String prcsImprtyRsnDtls; // PRCS_IMPRTY_RSN_DTLS + private String carFfnlgTrgtId; // CAR_FFNLG_TRGT_ID + + // 감사 + private String rgtr; + + /** + * NewLedgerRequest에서 VO로 변환 (최초 요청 로그 저장용) + * + * @param request NewLedgerRequest 요청 객체 + * @return 초기 요청 정보가 담긴 VO + */ + public static VmisCarLedgerFrmbkVO fromNewRequest(NewLedgerRequest request) { + if (request == null) { + return null; + } - // ==== Static factory/mapping methods (moved from Service) ==== - public static VmisCarLedgerFrmbkVO fromRequest(go.kr.project.api.model.request.LedgerRequest request) { return VmisCarLedgerFrmbkVO.builder() .infoSysId(request.getInfoSysId()) - .infoSysIp(request.getInfoSysIp()) - .sigunguCode(request.getSigunguCode()) - .cntcInfoCode(request.getCntcInfoCode()) - .chargerId(request.getChargerId()) - .chargerIp(request.getChargerIp()) - .chargerNm(request.getChargerNm()) + .infoSysIpAddr(request.getInfoSysIpAddr()) + .sggCd(request.getSggCd()) + .linkInfoCd(request.getLinkInfoCd()) + .picId(request.getPicId()) + .picIpAddr(request.getPicIpAddr()) + .picNm(request.getPicNm()) .dmndVhrno(request.getVhrno()) - .rgtr(ApiConstant.DEFAULT_REGISTRANT) + .dmndPrvcRls(request.getPrvcRls()) + .dmndCvlprNm(request.getCvlprNm()) + .dmndCvlprIdecno(request.getCvlprIdecno()) + .dmndCvlprStdgCd(request.getCvlprStdgCd()) + .dmndPathSeCd(request.getPathSeCd()) + .dmndDsctnIndct(request.getDsctnIndct()) + .dmndInqSeCd(request.getInqSeCd()) .build(); } - public static VmisCarLedgerFrmbkVO fromResponseMaster(String id, go.kr.project.api.model.response.LedgerResponse res) { + /** + * NewLedgerResponse에서 VO로 변환 (응답 마스터 정보 업데이트용) + * + * @param generatedId 생성된 PK ID + * @param response NewLedgerResponse 응답 객체 + * @return 응답 마스터 정보가 담긴 VO + */ + public static VmisCarLedgerFrmbkVO fromNewResponseMaster( + String generatedId, + NewLedgerResponse response) { + + if (response == null) { + return null; + } + return VmisCarLedgerFrmbkVO.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()) // 협력업체 접수번호 + .carLedgerFrmbkId(generatedId) + .linkRsltCd(response.getLinkRsltCd()) + .linkRsltDtl(response.getLinkRsltDtl()) + .ledgerGroupNo(response.getLedgerGroupNo()) + .ledgerIndivNo(response.getLedgerIndivNo()) + .vhmno(response.getVhmno()) + .vhrno(response.getVhrno()) + .vin(response.getVin()) + .carmdlAsortCd(response.getCarmdlAsortCd()) + .carmdlAsortNm(response.getCarmdlAsortNm()) + .atmbNm(response.getAtmbNm()) + .colorCd(response.getColorCd()) + .colorNm(response.getColorNm()) + .nopltSpcfctCd(response.getNopltSpcfctCd()) + .nopltSpcfctNm(response.getNopltSpcfctNm()) + .usgSeCd(response.getUsgSeCd()) + .usgSeNm(response.getUsgSeNm()) + .mtrsFomNm(response.getMtrsFomNm()) + .fomNm(response.getFomNm()) + .acqsAmt(response.getAcqsAmt()) + .regDtlCd(response.getRegDtlCd()) + .regDtlNm(response.getRegDtlNm()) + .frstRegYmd(response.getFrstRegYmd()) + .veagEndYmd(response.getVeagEndYmd()) + .yridnw(response.getYridnw()) + .spmnno1(response.getSpmnno1()) + .spmnno2(response.getSpmnno2()) + .fbctnYmd(response.getFbctnYmd()) + .drvngDstnc(response.getDrvngDstnc()) + .inspVldPdBgngYmd(response.getInspVldPdBgngYmd()) + .inspVldPdEndYmd(response.getInspVldPdEndYmd()) + .chckVldPdBgngYmd(response.getChckVldPdBgngYmd()) + .chckVldPdEndYmd(response.getChckVldPdEndYmd()) + .regAplySeNm(response.getRegAplySeNm()) + .frstRegAplyRcptNo(response.getFrstRegAplyRcptNo()) + .nopltCsdyAvtsmtYmd(response.getNopltCsdyAvtsmtYmd()) + .nopltCsdyYn(response.getNopltCsdyYn()) + .bssUsePdYmd(response.getBssUsePdYmd()) + .octhtErsrPrvntcAvtsmtYmd(response.getOcthtErsrPrvntcAvtsmtYmd()) + .ersrRegYmd(response.getErsrRegYmd()) + .ersrRegSeCd(response.getErsrRegSeCd()) + .ersrRegSeNm(response.getErsrRegSeNm()) + .mrtgCnt(response.getMrtgCnt()) + .szrCnt(response.getSzrCnt()) + .strctChgCnt(response.getStrctChgCnt()) + .usgsrhldAddr1(response.getUsgsrhldAddr1()) + .usgsrhldAddrDtl1(response.getUsgsrhldAddrDtl1()) + .ownrAddr(response.getOwnrAddr()) + .ownrAddrDtl(response.getOwnrAddrDtl()) + .indvdlBzmnYn(response.getIndvdlBzmnYn()) + .rprsOwnrTelno(response.getRprsOwnrTelno()) + .rprsOwnrNm(response.getRprsOwnrNm()) + .rprsOwnrMbrSeCd(response.getRprsOwnrMbrSeCd()) + .rprsvOwnrIdecno(response.getRprsvOwnrIdecno()) + .taxxmptTrprSeCd(response.getTaxxmptTrprSeCd()) + .taxxmptAplcnSeCd(response.getTaxxmptAplcnSeCd()) + .spcablMttrCnt(response.getSpcablMttrCnt()) + .usgsrhldDongNm(response.getUsgsrhldDongNm()) + .prvntcCnt(response.getPrvntcCnt()) + .xportFlflYnDclrYmd(response.getXportFlflYnDclrYmd()) + .issuNo(response.getIssuNo()) + .frstTrnsfrYmd(response.getFrstTrnsfrYmd()) + .drivSrgbtryIdntfNo(response.getDrivSrgbtryIdntfNo()) + .prcsImprtyRsnCd(response.getProcessImprtyResnCode()) + .prcsImprtyRsnDtls(response.getProcessImprtyResnDtls()) .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; + /** + * NewLedgerRequest에서 필수 조회 항목 추출 (DB 조회용) + * + * @param request NewLedgerRequest 요청 객체 + * @return 차량번호 + */ + public static String extractVhrno(NewLedgerRequest request) { + return request != null ? request.getVhrno() : null; + } } diff --git a/src/main/java/go/kr/project/api/service/ExternalVehicleApiService.java b/src/main/java/go/kr/project/api/service/ExternalVehicleApiService.java index b35e802..8640f5c 100644 --- a/src/main/java/go/kr/project/api/service/ExternalVehicleApiService.java +++ b/src/main/java/go/kr/project/api/service/ExternalVehicleApiService.java @@ -1,9 +1,9 @@ package go.kr.project.api.service; -import go.kr.project.api.model.request.BasicRequest; -import go.kr.project.api.model.request.LedgerRequest; -import go.kr.project.api.model.response.BasicResponse; -import go.kr.project.api.model.response.LedgerResponse; +import go.kr.project.api.model.request.OldBasicRequest; +import go.kr.project.api.model.request.NewLedgerRequest; +import go.kr.project.api.model.response.OldBasicResponse; +import go.kr.project.api.model.response.NewLedgerResponse; /** * 외부 VMIS-interface API 호출 서비스 인터페이스 @@ -12,14 +12,17 @@ import go.kr.project.api.model.response.LedgerResponse; public interface ExternalVehicleApiService { /** - * 차량 기본정보만 조회 (외부 REST 호출) - * 중요: 기본정보 조회는 차량번호 외에 부과기준일, 조회구분 등 필수 파라미터 필요 + * 구 기본정보 조회 (old-basic) */ - BasicResponse getBasicInfo(BasicRequest request); + OldBasicResponse getOldBasicInfo(OldBasicRequest request); /** - * 자동차 등록원부(갑)만 조회 (외부 REST 호출) - * 중요: 등록원부 조회는 차량번호 외에 소유자정보 등 필수 파라미터 필요 + * 신 기본정보 조회 (new-basic) */ - LedgerResponse getLedgerInfo(LedgerRequest request); + OldBasicResponse getNewBasicInfo(OldBasicRequest request); + + /** + * 신 등록원부(갑) 조회 (new-ledger) + */ + NewLedgerResponse getNewLedgerInfo(NewLedgerRequest request); } diff --git a/src/main/java/go/kr/project/api/service/impl/ExternalVehicleApiServiceImpl.java b/src/main/java/go/kr/project/api/service/impl/ExternalVehicleApiServiceImpl.java index 262d3db..6723f68 100644 --- a/src/main/java/go/kr/project/api/service/impl/ExternalVehicleApiServiceImpl.java +++ b/src/main/java/go/kr/project/api/service/impl/ExternalVehicleApiServiceImpl.java @@ -5,10 +5,10 @@ import go.kr.project.api.config.ApiConstant; import go.kr.project.api.config.properties.VmisProperties; import go.kr.project.api.service.ExternalVehicleApiService; import go.kr.project.api.util.ExceptionDetailUtil; +import go.kr.project.api.model.ApiExchangeEnvelope; import go.kr.project.api.model.Envelope; -import go.kr.project.api.model.VehicleApiResponseVO; -import go.kr.project.api.model.request.BasicRequest; -import go.kr.project.api.model.request.LedgerRequest; +import go.kr.project.api.model.request.OldBasicRequest; +import go.kr.project.api.model.request.NewLedgerRequest; import go.kr.project.api.model.response.*; import go.kr.project.api.service.VmisCarBassMatterInqireLogService; import go.kr.project.api.service.VmisCarLedgerFrmbkLogService; @@ -36,123 +36,119 @@ public class ExternalVehicleApiServiceImpl extends EgovAbstractServiceImpl imple private final VmisCarBassMatterInqireLogService bassMatterLogService; // 기본사항 조회 로그 서비스 private final VmisCarLedgerFrmbkLogService ledgerLogService; // 등록원부 로그 서비스 + /** - * 차량 기본정보 조회 API 호출 - * 중요 로직: 기본정보 조회는 BasicRequest 전체를 받아서 외부 API에 전달 - * (차량번호, 부과기준일, 조회구분, 차대번호 등 필수 파라미터 포함) - * - * @param request 기본정보 조회 요청 (차량번호, 부과기준일, 조회구분 등 포함) - * @return 차량 기본정보 + * 구 기본정보 조회 (old-basic) + * 중요: 외부 시스템도 동일한 신규 포맷(ApiExchangeEnvelope)으로 응답한다고 가정 */ @Override - public BasicResponse getBasicInfo(BasicRequest request) { - log.debug("차량 기본정보 조회 API 호출 - 차량번호: {}", request.getVhrno()); + public OldBasicResponse getOldBasicInfo(OldBasicRequest request) { + log.debug("[OLD-BASIC] 자동차 기본정보 조회 API 호출 - 차량번호: {}", request.getVhrno()); String generatedId = null; try { - // 1) 최초 요청 로그 저장 (별도 트랜잭션) - VmisCarBassMatterInqireVO logEntity = VmisCarBassMatterInqireVO.fromRequest(request); + VmisCarBassMatterInqireVO logEntity = VmisCarBassMatterInqireVO.fromOldRequest(request); generatedId = bassMatterLogService.createInitialRequestNewTx(logEntity); - // Envelope로 감싸기 (요청 객체는 이미 모든 필수 파라미터를 포함) - Envelope requestEnvelope = new Envelope<>(request); - - // HTTP 헤더 설정 + Envelope requestEnvelope = new Envelope<>(request); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); + HttpEntity> requestEntity = new HttpEntity<>(requestEnvelope, headers); - HttpEntity> requestEntity = new HttpEntity<>(requestEnvelope, headers); - - // 2) API 호출 - ResponseEntity> responseEntity = restTemplate.exchange( - vmisProperties.getExternal().getApi().getUrl().buildBasicUrl(), + ResponseEntity> responseEntity = restTemplate.exchange( + vmisProperties.getExternal().getApi().getUrl().buildOldBasicUrl(), HttpMethod.POST, requestEntity, - new ParameterizedTypeReference>() {} + new ParameterizedTypeReference>() {} ); - // 3) 응답 로그 업데이트 (별도 트랜잭션) if (responseEntity.getStatusCode() == HttpStatus.OK && responseEntity.getBody() != null) { - List data = responseEntity.getBody().getData(); + ApiExchangeEnvelope body = responseEntity.getBody(); + List data = (body.getResponse() != null) ? body.getResponse().getData() : null; if (data != null && !data.isEmpty()) { - VmisCarBassMatterInqireVO update = VmisCarBassMatterInqireVO.fromResponse(generatedId, responseEntity.getBody()); - if (update != null) { - bassMatterLogService.updateResponseNewTx(update); - } + VmisCarBassMatterInqireVO update = VmisCarBassMatterInqireVO.fromOldExchange(generatedId, body); + if (update != null) bassMatterLogService.updateResponseNewTx(update); + log.debug("[OLD-BASIC] txId: {}", body.getTxId()); return data.get(0); } } - log.warn("차량 기본정보 조회 응답이 비어있음 - 차량번호: {}", request.getVhrno()); + log.warn("[OLD-BASIC] 응답이 비어있음 - 차량번호: {}", request.getVhrno()); return null; - } catch (Exception e) { - // 4) 오류 로그 업데이트 (별도 트랜잭션) if (generatedId != null) { try { String detail = ExceptionDetailUtil.buildForLog(e); VmisCarBassMatterInqireVO errorLog = VmisCarBassMatterInqireVO.builder() .carBassMatterInqireId(generatedId) - .cntcResultCode(ApiConstant.CNTC_RESULT_CODE_ERROR) - .cntcResultDtls(detail) + .linkRsltCd(ApiConstant.CNTC_RESULT_CODE_ERROR) + .linkRsltDtl(detail) .build(); bassMatterLogService.updateResponseNewTx(errorLog); - log.error("[EXTERNAL-BASIC-ERR-LOG] API 호출 에러 정보 저장 완료(별도TX) - ID: {}, detail: {}", generatedId, detail, e); + log.error("[EXTERNAL-OLD-BASIC-ERR-LOG] 저장 완료 - ID: {}, detail: {}", generatedId, detail, e); } catch (Exception ignore) { - log.error("[EXTERNAL-BASIC-ERR-LOG] 에러 로그 저장 실패 - ID: {}", generatedId, ignore); + log.error("[EXTERNAL-OLD-BASIC-ERR-LOG] 에러 로그 저장 실패 - ID: {}", generatedId, ignore); } } - log.error("차량 기본정보 조회 API 호출 실패 - 차량번호: {}", request.getVhrno(), e); - throw new MessageException("차량 기본정보 조회 실패: " + e.getMessage(), e); + throw new MessageException("[OLD-BASIC] 차량 기본정보 조회 실패: " + e.getMessage(), e); } } /** - * 자동차 등록원부(갑) 조회 API 호출 - * 중요 로직: 등록원부 조회는 차량번호 외에 소유자정보, 조회구분 등 필수 파라미터를 받아서 호출 - * - * @param request 등록원부 조회 요청 (차량번호, 소유자정보, 조회구분 등 포함) - * @return 등록원부 정보 + * 신 기본정보 조회 (new-basic) */ @Override - public LedgerResponse getLedgerInfo(LedgerRequest request) { + public OldBasicResponse getNewBasicInfo(OldBasicRequest request) { + return null; + } + + + /** + * 신 등록원부(갑) 조회 (new-ledger) + */ + @Override + public NewLedgerResponse getNewLedgerInfo(NewLedgerRequest request) { + log.debug("자동차 등록원부 조회 API 호출 - 차량번호: {}", request.getVhrno()); String generatedId = null; try { // 1) 최초 요청 로그 저장 (별도 트랜잭션) - VmisCarLedgerFrmbkVO init = VmisCarLedgerFrmbkVO.fromRequest(request); + VmisCarLedgerFrmbkVO init = VmisCarLedgerFrmbkVO.fromNewRequest(request); generatedId = ledgerLogService.createInitialRequestNewTx(init); // Envelope로 감싸기 (요청 객체는 이미 모든 필수 파라미터를 포함) - Envelope requestEnvelope = new Envelope<>(request); + Envelope requestEnvelope = new Envelope<>(request); // HTTP 헤더 설정 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); - HttpEntity> requestEntity = new HttpEntity<>(requestEnvelope, headers); + HttpEntity> requestEntity = new HttpEntity<>(requestEnvelope, headers); - // 2) API 호출 - ResponseEntity> responseEntity = restTemplate.exchange( - vmisProperties.getExternal().getApi().getUrl().buildLedgerUrl(), + // 2) API 호출 (신규 포맷) - 현재 요구사항상 신규 원부만 사용 + ResponseEntity> responseEntity = restTemplate.exchange( + vmisProperties.getExternal().getApi().getUrl().buildNewLedgerUrl(), HttpMethod.POST, requestEntity, - new ParameterizedTypeReference>() {} + new ParameterizedTypeReference>() {} ); // 3) 응답 로그 업데이트 (마스터 + 상세, 별도 트랜잭션) if (responseEntity.getStatusCode() == HttpStatus.OK && responseEntity.getBody() != null) { - List data = responseEntity.getBody().getData(); + ApiExchangeEnvelope env = responseEntity.getBody(); + List data = (env.getResponse() != null) ? env.getResponse().getData() : null; if (data != null && !data.isEmpty()) { - LedgerResponse body = data.get(0); - VmisCarLedgerFrmbkVO masterUpdate = VmisCarLedgerFrmbkVO.fromResponseMaster(generatedId, body); + NewLedgerResponse body = data.get(0); + VmisCarLedgerFrmbkVO masterUpdate = VmisCarLedgerFrmbkVO.fromNewResponseMaster(generatedId, body); + masterUpdate.setTxId(env.getTxId()); ledgerLogService.updateResponseNewTx(masterUpdate); - List details = VmisCarLedgerFrmbkDtlVO.listFromResponse(body, generatedId); + List details = VmisCarLedgerFrmbkDtlVO.listNewFromExchange(env, generatedId); if (details != null && !details.isEmpty()) { ledgerLogService.saveDetailsNewTx(generatedId, details); } + log.debug("[LEDGER] txId: {}", env.getTxId()); return body; } } @@ -167,8 +163,8 @@ public class ExternalVehicleApiServiceImpl extends EgovAbstractServiceImpl imple String detail = ExceptionDetailUtil.buildForLog(e); VmisCarLedgerFrmbkVO errorLog = VmisCarLedgerFrmbkVO.builder() .carLedgerFrmbkId(generatedId) - .cntcResultCode(ApiConstant.CNTC_RESULT_CODE_ERROR) - .cntcResultDtls(detail) + .linkRsltCd(ApiConstant.CNTC_RESULT_CODE_ERROR) + .linkRsltDtl(detail) .build(); ledgerLogService.updateResponseNewTx(errorLog); log.error("[EXTERNAL-LEDGER-ERR-LOG] API 호출 에러 정보 저장 완료(별도TX) - ID: {}, detail: {}", generatedId, detail, e); @@ -179,5 +175,6 @@ public class ExternalVehicleApiServiceImpl extends EgovAbstractServiceImpl imple log.error("자동차 등록원부 조회 API 호출 실패 - 차량번호: {}", request.getVhrno(), e); throw new MessageException("자동차 등록원부 조회 실패: " + e.getMessage(), e); } + } } diff --git a/src/main/java/go/kr/project/api/service/impl/VmisCarBassMatterInqireLogServiceImpl.java b/src/main/java/go/kr/project/api/service/impl/VmisCarBassMatterInqireLogServiceImpl.java index b6c8250..6ec2dbe 100644 --- a/src/main/java/go/kr/project/api/service/impl/VmisCarBassMatterInqireLogServiceImpl.java +++ b/src/main/java/go/kr/project/api/service/impl/VmisCarBassMatterInqireLogServiceImpl.java @@ -59,6 +59,6 @@ public class VmisCarBassMatterInqireLogServiceImpl extends EgovAbstractServiceIm if (result != 1) { throw new RuntimeException("자동차 기본 사항 조회 정보 업데이트 실패 - ID: " + response.getCarBassMatterInqireId()); } - log.info("[BASIC-RES-LOG] 응답/에러 정보 저장 완료(별도TX) - ID: {}, 결과코드: {}", response.getCarBassMatterInqireId(), response.getCntcResultCode()); + log.info("[BASIC-RES-LOG] 응답/에러 정보 저장 완료(별도TX) - ID: {}, 결과코드: {}", response.getCarBassMatterInqireId(), response.getLinkRsltCd()); } } diff --git a/src/main/java/go/kr/project/api/service/impl/VmisCarLedgerFrmbkLogServiceImpl.java b/src/main/java/go/kr/project/api/service/impl/VmisCarLedgerFrmbkLogServiceImpl.java index c331fa1..53f3d5e 100644 --- a/src/main/java/go/kr/project/api/service/impl/VmisCarLedgerFrmbkLogServiceImpl.java +++ b/src/main/java/go/kr/project/api/service/impl/VmisCarLedgerFrmbkLogServiceImpl.java @@ -52,7 +52,7 @@ public class VmisCarLedgerFrmbkLogServiceImpl extends EgovAbstractServiceImpl im throw new RuntimeException("자동차 등록 원부(갑) 정보 업데이트 실패 - ID: " + response.getCarLedgerFrmbkId()); } log.info("[LEDGER-RES-LOG] 마스터 응답 업데이트(별도TX) - ID: {}, 결과코드: {}", - response.getCarLedgerFrmbkId(), response.getCntcResultCode()); + response.getCarLedgerFrmbkId(), response.getLinkRsltCd()); } @Override diff --git a/src/main/java/go/kr/project/carInspectionPenalty/callApi/controller/VehicleInquiryController.java b/src/main/java/go/kr/project/carInspectionPenalty/callApi/controller/VehicleInquiryController.java index b73026c..e6b6b2b 100644 --- a/src/main/java/go/kr/project/carInspectionPenalty/callApi/controller/VehicleInquiryController.java +++ b/src/main/java/go/kr/project/carInspectionPenalty/callApi/controller/VehicleInquiryController.java @@ -2,10 +2,10 @@ package go.kr.project.carInspectionPenalty.callApi.controller; import egovframework.constant.TilesConstants; import egovframework.util.ApiResponseUtil; -import go.kr.project.api.model.request.BasicRequest; -import go.kr.project.api.model.request.LedgerRequest; -import go.kr.project.api.model.response.BasicResponse; -import go.kr.project.api.model.response.LedgerResponse; +import go.kr.project.api.model.request.OldBasicRequest; +import go.kr.project.api.model.request.NewLedgerRequest; +import go.kr.project.api.model.response.OldBasicResponse; +import go.kr.project.api.model.response.NewLedgerResponse; import go.kr.project.api.service.ExternalVehicleApiService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; @@ -48,7 +48,7 @@ public class VehicleInquiryController { @PostMapping("/getBasicInfo.do") @ResponseBody @Operation(summary = "자동차 기본사항 조회", description = "차량 기본정보만 조회합니다.") - public ResponseEntity getBasicInfo(@RequestBody BasicRequest request) { + public ResponseEntity getBasicInfo(@RequestBody OldBasicRequest request) { log.info("========== 자동차 기본사항 조회 시작 =========="); log.info("요청 차량번호: {}", request.getVhrno()); log.info("부과기준일: {}", request.getLevyStdde()); @@ -68,7 +68,7 @@ public class VehicleInquiryController { } // 차량 기본정보 조회 - BasicResponse response = service.getBasicInfo(request); + OldBasicResponse response = service.getBasicInfo(request); log.info("자동차 기본사항 조회 성공 - 차량번호: {}, 차대번호: {}", request.getVhrno(), request.getVin()); log.info("========== 자동차 기본사항 조회 완료 =========="); @@ -85,7 +85,7 @@ public class VehicleInquiryController { @PostMapping("/getLedgerInfo.do") @ResponseBody @Operation(summary = "자동차 등록원부(갑) 조회", description = "차량 등록원부 정보만 조회합니다.") - public ResponseEntity getLedgerInfo(@RequestBody LedgerRequest request) { + public ResponseEntity getLedgerInfo(@RequestBody NewLedgerRequest request) { log.info("========== 자동차 등록원부(갑) 조회 시작 =========="); log.info("요청 차량번호: {}", request.getVhrno()); log.info("조회구분코드: {}", request.getInqireSeCode()); @@ -111,7 +111,7 @@ public class VehicleInquiryController { } // 차량 등록원부 조회 - LedgerResponse response = service.getLedgerInfo(request); + NewLedgerResponse response = service.getLedgerInfo(request); log.info("자동차 등록원부(갑) 조회 성공 - 차량번호: {}", request.getVhrno()); log.info("========== 자동차 등록원부(갑) 조회 완료 =========="); diff --git a/src/main/java/go/kr/project/carInspectionPenalty/registration/service/impl/ComparisonServiceImpl.java b/src/main/java/go/kr/project/carInspectionPenalty/registration/service/impl/ComparisonServiceImpl.java index e5e136b..f689d59 100644 --- a/src/main/java/go/kr/project/carInspectionPenalty/registration/service/impl/ComparisonServiceImpl.java +++ b/src/main/java/go/kr/project/carInspectionPenalty/registration/service/impl/ComparisonServiceImpl.java @@ -3,7 +3,7 @@ package go.kr.project.carInspectionPenalty.registration.service.impl; import egovframework.constant.TaskPrcsSttsConstants; import egovframework.exception.MessageException; import go.kr.project.api.model.VehicleApiResponseVO; -import go.kr.project.api.model.response.BasicResponse; +import go.kr.project.api.model.response.OldBasicResponse; import go.kr.project.carInspectionPenalty.registration.mapper.CarFfnlgTrgtMapper; import go.kr.project.carInspectionPenalty.registration.model.CarFfnlgTrgtVO; import go.kr.project.carInspectionPenalty.registration.service.ComparisonService; @@ -43,7 +43,7 @@ public class ComparisonServiceImpl extends EgovAbstractServiceImpl implements Co String vhclno = existingData.getVhclno(); log.info("========== 비교 로직 시작: {} ==========", vhclno); - BasicResponse.Record basicInfo = apiResponse.getBasicInfo().getRecord().get(0); + OldBasicResponse.Record basicInfo = apiResponse.getBasicInfo().getRecord().get(0); // ========== 1. 상품용 체크 ========== String productUseResult = checkProductUse(existingData, basicInfo); @@ -82,7 +82,7 @@ public class ComparisonServiceImpl extends EgovAbstractServiceImpl implements Co * * @return 02 (적용됨) 또는 null (미적용) */ - private String checkProductUse(CarFfnlgTrgtVO existingData, BasicResponse.Record basicInfo) { + private String checkProductUse(CarFfnlgTrgtVO existingData, OldBasicResponse.Record basicInfo) { String vhclno = existingData.getVhclno(); String mberNm = basicInfo.getMberNm(); // 대표소유자성명 @@ -117,7 +117,7 @@ public class ComparisonServiceImpl extends EgovAbstractServiceImpl implements Co * * @return 03 (적용됨) 또는 null (미적용) */ - private String checkTransfer(CarFfnlgTrgtVO existingData, BasicResponse.Record basicInfo, String userId) { + private String checkTransfer(CarFfnlgTrgtVO existingData, OldBasicResponse.Record basicInfo, String userId) { String vhclno = existingData.getVhclno(); // ========== 이첩 조건들 (OR 로직: 하나라도 만족하면 이첩) ========== @@ -141,7 +141,7 @@ public class ComparisonServiceImpl extends EgovAbstractServiceImpl implements Co * 이첩 조건1: 법정동코드 불일치 * 사용본거지법정동코드 앞 4자리 != 사용자 조직코드 앞 4자리 */ - private boolean checkTransferCondition1_LegalDongMismatch(BasicResponse.Record basicInfo, String userId, String vhclno) { + private boolean checkTransferCondition1_LegalDongMismatch(OldBasicResponse.Record basicInfo, String userId, String vhclno) { String useStrnghldLegaldongCode = basicInfo.getUseStrnghldLegaldongCode(); // 법정동코드 유효성 검사 @@ -176,7 +176,7 @@ public class ComparisonServiceImpl extends EgovAbstractServiceImpl implements Co /** * 이첩 처리 (공통 로직) */ - private String processTransfer(CarFfnlgTrgtVO existingData, BasicResponse.Record basicInfo, + private String processTransfer(CarFfnlgTrgtVO existingData, OldBasicResponse.Record basicInfo, String vhclno, String reason) { log.info("[이첩] 조건 충족! 차량번호: {}, 사유: {}", vhclno, reason); @@ -217,7 +217,7 @@ public class ComparisonServiceImpl extends EgovAbstractServiceImpl implements Co * @return 04 (적용됨) 또는 null (미적용) */ @SuppressWarnings("unused") - private String checkInvestigationClosed(CarFfnlgTrgtVO existingData, BasicResponse.Record basicInfo) { + private String checkInvestigationClosed(CarFfnlgTrgtVO existingData, OldBasicResponse.Record basicInfo) { String vhclno = existingData.getVhclno(); String ersrRegistSeCode = basicInfo.getErsrRegistSeCode(); // 말소등록구분코드 diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index f3d4bbe..53f992e 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -168,6 +168,12 @@ vmis: external: api: url: - base: "http://localhost:8081/api/v1/vehicles" # VMIS-interface 서버 URL (개발) - basic: "/basic" # 자동차기본정보 - ledger: "/ledger" # 자동차등록원부 \ No newline at end of file + base: "http://localhost:18080/api/v1/vehicles" # VMIS-interface 서버 URL (운영) + basic: + old-or-new: "old" # 과거 신규 API 선택 + old-url: "/old-basic" # 자동차기본정보 + new-url: "/new-basic" # 자동차기본정보 + ledger: + old-or-new: "new" # 과거 신규 API 선택, 자동차등록원부(갑)은 연계서버에 old 구현안됨. + old-url: "/old-ledger" # 자동차등록원부(갑) - 구현안됨. + new-url: "/new-ledger" # 자동차등록원부(갑) \ No newline at end of file diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml index f63609a..28b300a 100644 --- a/src/main/resources/application-local.yml +++ b/src/main/resources/application-local.yml @@ -175,6 +175,12 @@ vmis: external: api: url: - base: "http://localhost:8081/api/v1/vehicles" # VMIS-interface 서버 URL (로컬) - basic: "/basic" # 자동차기본정보 - ledger: "/ledger" # 자동차등록원부 \ No newline at end of file + base: "http://localhost:18080/api/v1/vehicles" # VMIS-interface 서버 URL (운영) + basic: + old-or-new: "old" # 과거 신규 API 선택 + old-url: "/old-basic" # 자동차기본정보 + new-url: "/new-basic" # 자동차기본정보 + ledger: + old-or-new: "new" # 과거 신규 API 선택, 자동차등록원부(갑)은 연계서버에 old 구현안됨. + old-url: "/old-ledger" # 자동차등록원부(갑) + new-url: "/new-ledger" # 자동차등록원부(갑) \ No newline at end of file diff --git a/src/main/resources/application-prd.yml b/src/main/resources/application-prd.yml index 856d567..256d64c 100644 --- a/src/main/resources/application-prd.yml +++ b/src/main/resources/application-prd.yml @@ -171,5 +171,11 @@ vmis: api: url: base: "http://localhost:18080/api/v1/vehicles" # VMIS-interface 서버 URL (운영) - basic: "/basic" # 자동차기본정보 - ledger: "/ledger" # 자동차등록원부 \ No newline at end of file + basic: + old-or-new: "old" # 과거 신규 API 선택 + old-url: "/old-basic" # 자동차기본정보 + new-url: "/new-basic" # 자동차기본정보 + ledger: + old-or-new: "new" # 과거 신규 API 선택, 자동차등록원부(갑)은 연계서버에 old 구현안됨. + old-url: "/old-ledger" # 자동차등록원부(갑) + new-url: "/new-ledger" # 자동차등록원부(갑) \ No newline at end of file diff --git a/src/main/resources/mybatis/mapper/api/CarBassMatterInqireMapper_maria.xml b/src/main/resources/mybatis/mapper/api/CarBassMatterInqireMapper_maria.xml index bc83a04..7422398 100644 --- a/src/main/resources/mybatis/mapper/api/CarBassMatterInqireMapper_maria.xml +++ b/src/main/resources/mybatis/mapper/api/CarBassMatterInqireMapper_maria.xml @@ -14,31 +14,33 @@ INSERT INTO tb_car_bass_matter_inqire ( CAR_BASS_MATTER_INQIRE_ID, INFO_SYS_ID, - INFO_SYS_IP, - SIGUNGU_CODE, - CNTC_INFO_CODE, - CHARGER_ID, - CHARGER_IP, - CHARGER_NM, - DMND_LEVY_STDDE, - DMND_INQIRE_SE_CODE, + INFO_SYS_IP_ADDR, + SGG_CD, + LINK_INFO_CD, + PIC_ID, + PIC_IP_ADDR, + PIC_NM, + DMND_LEVY_CRTR_YMD, + DMND_INQ_SE_CD, DMND_VHRNO, DMND_VIN, + LINK_RSLT_CD, REG_DT, RGTR ) VALUES ( #{carBassMatterInqireId}, #{infoSysId}, - #{infoSysIp}, - #{sigunguCode}, - #{cntcInfoCode}, - #{chargerId}, - #{chargerIp}, - #{chargerNm}, + #{infoSysIpAddr}, + #{sggCd}, + #{linkInfoCd}, + #{picId}, + #{picIpAddr}, + #{picNm}, #{dmndLevyStdde}, #{dmndInqireSeCode}, #{dmndVhrno}, #{dmndVin}, + #{linkRsltCd}, NOW(), #{rgtr} ) @@ -48,92 +50,94 @@ UPDATE tb_car_bass_matter_inqire - CNTC_RESULT_CODE = #{cntcResultCode}, - CNTC_RESULT_DTLS = #{cntcResultDtls}, - PRYE = #{prye}, - REGIST_DE = #{registDe}, - ERSR_REGIST_SE_CODE = #{ersrRegistSeCode}, - ERSR_REGIST_SE_NM = #{ersrRegistSeNm}, - ERSR_REGIST_DE = #{ersrRegistDe}, - REGIST_DETAIL_CODE = #{registDetailCode}, + TX_ID = #{txId}, + LINK_RSLT_CD = #{linkRsltCd}, + LINK_RSLT_DTL = #{linkRsltDtl}, + YRIDNW = #{prye}, + REG_YMD = #{registDe}, + ERSR_REG_SE_CD = #{ersrRegistSeCode}, + ERSR_REG_SE_NM = #{ersrRegistSeNm}, + ERSR_REG_YMD = #{ersrRegistDe}, + REG_DTL_CD = #{registDetailCode}, DSPLVL = #{dsplvl}, - USE_STRNGHLD_LEGALDONG_CODE = #{useStrnghldLegaldongCode}, - USE_STRNGHLD_ADSTRD_CODE = #{useStrnghldAdstrdCode}, - USE_STRNGHLD_MNTN = #{useStrnghldMntn}, - USE_STRNGHLD_LNBR = #{useStrnghldLnbr}, - USE_STRNGHLD_HO = #{useStrnghldHo}, - USE_STRNGHLD_ADRES_NM = #{useStrnghldAdresNm}, - USE_STRNGHLD_ROAD_NM_CODE = #{useStrnghldRoadNmCode}, - USGSRHLD_UNDGRND_BULD_SE_CODE = #{usgsrhldUndgrndBuldSeCode}, - USE_STRNGHLD_BULD_MAIN_NO = #{useStrnghldBuldMainNo}, - USE_STRNGHLD_BULD_SUB_NO = #{useStrnghldBuldSubNo}, - USGSRHLD_ADRES_FULL = #{usgsrhldAdresFull}, - MBER_SE_CODE = #{mberSeCode}, - MBER_SE_NO = #{mberSeNo}, - TELNO = #{telno}, - OWNER_LEGALDONG_CODE = #{ownerLegaldongCode}, - OWNER_ADSTRD_CODE = #{ownerAdstrdCode}, - OWNER_MNTN = #{ownerMntn}, - OWNER_LNBR = #{ownerLnbr}, - OWNER_HO = #{ownerHo}, - OWNER_ADRES_NM = #{ownerAdresNm}, - OWNER_ROAD_NM_CODE = #{ownerRoadNmCode}, - OWNER_UNDGRND_BULD_SE_CODE = #{ownerUndgrndBuldSeCode}, - OWNER_BULD_MAIN_NO = #{ownerBuldMainNo}, - OWNER_BULD_SUB_NO = #{ownerBuldSubNo}, - OWNR_WHOLADDR = #{ownrWholaddr}, - AFTR_VHRNO = #{aftrVhrno}, - USE_FUEL_CODE = #{useFuelCode}, - PRPOS_SE_CODE = #{prposSeCode}, + USGSRHLD_STDG_CD = #{useStrnghldLegaldongCode}, + USGSRHLD_DONG_CD = #{useStrnghldAdstrdCode}, + USGSRHLD_MTN_YN = #{useStrnghldMntn}, + USGSRHLD_LNBR = #{useStrnghldLnbr}, + USGSRHLD_HO = #{useStrnghldHo}, + USGSRHLD_ADDR_NM = #{useStrnghldAdresNm}, + USGSRHLD_ROAD_NM_CD = #{useStrnghldRoadNmCode}, + USGSRHLD_UDGD_BLDG_SE_CD = #{usgsrhldUndgrndBuldSeCode}, + USGSRHLD_BMNO = #{useStrnghldBuldMainNo}, + USGSRHLD_BSNO = #{useStrnghldBuldSubNo}, + USGSRHLD_WHOL_ADDR = #{usgsrhldAdresFull}, + RPRS_OWNR_MBR_SE_CD = #{mberSeCode}, + RPRSV_OWNR_IDECNO = #{mberSeNo}, + RPRS_OWNR_TELNO = #{telno}, + OWNR_STDG_CD = #{ownerLegaldongCode}, + OWNR_DONG_CD = #{ownerAdstrdCode}, + OWNR_MTN_YN = #{ownerMntn}, + OWNR_LNBR = #{ownerLnbr}, + OWNR_HO = #{ownerHo}, + OWNR_ADDR_NM = #{ownerAdresNm}, + OWNR_ROAD_NM_CD = #{ownerRoadNmCode}, + OWNR_UDGD_BLDG_SE_CD = #{ownerUndgrndBuldSeCode}, + OWNR_BMNO = #{ownerBuldMainNo}, + OWNR_BSNO = #{ownerBuldSubNo}, + OWNR_WHOL_ADDR = #{ownrWholaddr}, + REAR_VHRNO = #{aftrVhrno}, + USE_FUEL_CD = #{useFuelCode}, + USG_SE_CD = #{prposSeCode}, MTRS_FOM_NM = #{mtrsFomNm}, - FRNT_VHRNO = #{frntVhrno}, + BFR_VHRNO = #{frntVhrno}, VHRNO = #{vhrno}, VIN = #{vin}, - CNM = #{cnm}, - VHCLE_TOT_WT = #{vhcleTotWt}, - CAAG_ENDDE = #{caagEndde}, - CHANGE_DE = #{changeDe}, - VHCTY_ASORT_CODE = #{vhctyAsortCode}, - VHCTY_TY_CODE = #{vhctyTyCode}, - VHCTY_SE_CODE = #{vhctySeCode}, + ATMB_NM = #{cnm}, + VHCL_TOTL_WT = #{vhcleTotWt}, + VEAG_END_YMD = #{caagEndde}, + CHG_YMD = #{changeDe}, + CARMDL_ASORT_CD = #{vhctyAsortCode}, + CARMDL_TYPE_CD = #{vhctyTyCode}, + CARMDL_SE_CD = #{vhctySeCode}, MXMM_LDG = #{mxmmLdg}, - VHCTY_ASORT_NM = #{vhctyAsortNm}, - VHCTY_TY_NM = #{vhctyTyNm}, - VHCTY_SE_NM = #{vhctySeNm}, - FRST_REGIST_DE = #{frstRegistDe}, + CARMDL_ASORT_NM = #{vhctyAsortNm}, + CARMDL_TYPE_NM = #{vhctyTyNm}, + CARMDL_CLSF_NM = #{vhctySeNm}, + FRST_REG_YMD = #{frstRegistDe}, FOM_NM = #{fomNm}, - ACQS_DE = #{acqsDe}, - ACQS_END_DE = #{acqsEndDe}, - YBL_MD = #{yblMd}, - TRANSR_REGIST_DE = #{transrRegistDe}, - SPCF_REGIST_STTUS_CODE = #{spcfRegistSttusCode}, + ACQS_YMD = #{acqsDe}, + ACQS_END_YMD = #{acqsEndDe}, + FBCTN_YMD = #{yblMd}, + TRANSR_REG_YMD = #{transrRegistDe}, + SPCF_REG_STTS_CD = #{spcfRegistSttusCode}, COLOR_NM = #{colorNm}, - MRTG_CO = #{mrtgCo}, - SEIZR_CO = #{seizrCo}, - STMD_CO = #{stmdCo}, - NMPL_CSDY_AT = #{nmplCsdyAt}, - NMPL_CSDY_REMNR_DE = #{nmplCsdyRemnrDe}, - ORIGIN_SE_CODE = #{originSeCode}, - NMPL_STNDRD_CODE = #{nmplStndrdCode}, - ACQS_AMOUNT = #{acqsAmount}, - INSPT_VALID_PD_BGNDE = #{insptValidPdBgnde}, - INSPT_VALID_PD_ENDDE = #{insptValidPdEndde}, - USE_STRNGHLD_GRC_CODE = #{useStrnghldGrcCode}, - TKCAR_PSCAP_CO = #{tkcarPscapCo}, + MRTG_CNT = #{mrtgCo}, + SZR_CNT = #{seizrCo}, + STRCT_CHG_CNT = #{stmdCo}, + NOPLT_CSDY_YN = #{nmplCsdyAt}, + NOPLT_CSDY_AVTSMT_YMD = #{nmplCsdyRemnrDe}, + SRC_SE_CD = #{originSeCode}, + NOPLT_SPCFCT_CD = #{nmplStndrdCode}, + ACQS_AMT = #{acqsAmount}, + INSP_VLD_PD_BGNG_YMD = #{insptValidPdBgnde}, + INSP_VLD_PD_END_YMD = #{insptValidPdEndde}, + USGSRHLD_GRC_CD = #{useStrnghldGrcCode}, + RDCPCT_CNT = #{tkcarPscapCo}, SPMNNO = #{spmnno}, - TRVL_DSTNC = #{trvlDstnc}, - FRST_REGIST_RQRCNO = #{frstRegistRqrcno}, - VLNT_ERSR_PRVNTC_NTICE_DE = #{vlntErsrPrvntcNticeDe}, - REGIST_INSTT_NM = #{registInsttNm}, - PROCESS_IMPRTY_RESN_CODE = #{processImprtyResnCode}, - PROCESS_IMPRTY_RESN_DTLS = #{processImprtyResnDtls}, + DRVNG_DSTNC = #{trvlDstnc}, + FRST_REG_APLY_RCPT_NO = #{frstRegistRqrcno}, + VLNT_ERSR_PRVNTC_AVTSMT_YMD = #{vlntErsrPrvntcNticeDe}, + OGNZ_NM = #{registInsttNm}, + PRCS_IMPRTY_RSN_CD = #{processImprtyResnCode}, + PRCS_IMPRTY_RSN_DTLS = #{processImprtyResnDtls}, CBD_LT = #{cbdLt}, CBD_BT = #{cbdBt}, CBD_HG = #{cbdHg}, FRST_MXMM_LDG = #{frstMxmmLdg}, - FUEL_CNSMP_RT = #{fuelCnsmpRt}, - ELCTY_CMPND_FUEL_CNSMP_RT = #{elctyCmpndFuelCnsmpRt}, - MBER_NM = #{mberNm}, + FUEL_CNSMPRT = #{fuelCnsmpRt}, + ELCTY_CMPND_FUEL_CNSMPRT = #{elctyCmpndFuelCnsmpRt}, + RPRS_OWNR_NM = #{mberNm}, + CAR_FFNLG_TRGT_ID = #{carFfnlgTrgtId} WHERE CAR_BASS_MATTER_INQIRE_ID = #{carBassMatterInqireId} diff --git a/src/main/resources/mybatis/mapper/api/CarLedgerFrmbkMapper_maria.xml b/src/main/resources/mybatis/mapper/api/CarLedgerFrmbkMapper_maria.xml index cd3a4e1..0cfdaf0 100644 --- a/src/main/resources/mybatis/mapper/api/CarLedgerFrmbkMapper_maria.xml +++ b/src/main/resources/mybatis/mapper/api/CarLedgerFrmbkMapper_maria.xml @@ -18,39 +18,41 @@ INSERT INTO tb_car_ledger_frmbk ( CAR_LEDGER_FRMBK_ID, INFO_SYS_ID, - INFO_SYS_IP, - SIGUNGU_CODE, - CNTC_INFO_CODE, - CHARGER_ID, - CHARGER_IP, - CHARGER_NM, + INFO_SYS_IP_ADDR, + SGG_CD, + LINK_INFO_CD, + PIC_ID, + PIC_IP_ADDR, + PIC_NM, DMND_VHRNO, - DMND_ONES_INFORMATION_OPEN, - DMND_CPTTR_NM, - DMND_CPTTR_IHIDNUM, - DMND_CPTTR_LEGALDONG_CODE, - DMND_ROUTE_SE_CODE, - DMND_DETAIL_EXPRESSION, - DMND_INQIRE_SE_CODE, + DMND_PRVC_RLS, + DMND_CVLPR_NM, + DMND_CVLPR_IDECNO, + DMND_CVLPR_STDG_CD, + DMND_PATH_SE_CD, + DMND_DSCTN_INDCT, + DMND_INQ_SE_CD, + LINK_RSLT_CD, REG_DT, RGTR ) VALUES ( #{carLedgerFrmbkId}, #{infoSysId}, - #{infoSysIp}, - #{sigunguCode}, - #{cntcInfoCode}, - #{chargerId}, - #{chargerIp}, - #{chargerNm}, + #{infoSysIpAddr}, + #{sggCd}, + #{linkInfoCd}, + #{picId}, + #{picIpAddr}, + #{picNm}, #{dmndVhrno}, - #{dmndOnesInformationOpen}, - #{dmndCpttrNm}, - #{dmndCpttrIhidnum}, - #{dmndCpttrLegaldongCode}, - #{dmndRouteSeCode}, - #{dmndDetailExpression}, - #{dmndInqireSeCode}, + #{dmndPrvcRls}, + #{dmndCvlprNm}, + #{dmndCvlprIdecno}, + #{dmndCvlprStdgCd}, + #{dmndPathSeCd}, + #{dmndDsctnIndct}, + #{dmndInqSeCd}, + #{linkRsltCd}, NOW(), #{rgtr} ) @@ -60,69 +62,72 @@ UPDATE tb_car_ledger_frmbk - CNTC_RESULT_CODE = #{cntcResultCode}, - CNTC_RESULT_DTLS = #{cntcResultDtls}, + TX_ID = #{txId}, + LINK_RSLT_CD = #{linkRsltCd}, + LINK_RSLT_DTL = #{linkRsltDtl}, LEDGER_GROUP_NO = #{ledgerGroupNo}, - LEDGER_INDVDLZ_NO = #{ledgerIndvdlzNo}, + LEDGER_INDIV_NO = #{ledgerIndivNo}, VHMNO = #{vhmno}, VHRNO = #{vhrno}, VIN = #{vin}, - VHCTY_ASORT_CODE = #{vhctyAsortCode}, - VHCTY_ASORT_NM = #{vhctyAsortNm}, - CNM = #{cnm}, - COLOR_CODE = #{colorCode}, + CARMDL_ASORT_CD = #{carmdlAsortCd}, + CARMDL_ASORT_NM = #{carmdlAsortNm}, + ATMB_NM = #{atmbNm}, + COLOR_CD = #{colorCd}, COLOR_NM = #{colorNm}, - NMPL_STNDRD_CODE = #{nmplStndrdCode}, - NMPL_STNDRD_NM = #{nmplStndrdNm}, - PRPOS_SE_CODE = #{prposSeCode}, - PRPOS_SE_NM = #{prposSeNm}, + NOPLT_SPCFCT_CD = #{nopltSpcfctCd}, + NOPLT_SPCFCT_NM = #{nopltSpcfctNm}, + USG_SE_CD = #{usgSeCd}, + USG_SE_NM = #{usgSeNm}, MTRS_FOM_NM = #{mtrsFomNm}, FOM_NM = #{fomNm}, - ACQS_AMOUNT = #{acqsAmount}, - REGIST_DETAIL_CODE = #{registDetailCode}, - REGIST_DETAIL_NM = #{registDetailNm}, - FRST_REGIST_DE = #{frstRegistDe}, - CAAG_ENDDE = #{caagEndde}, - PRYE = #{prye}, - SPMNNO1 = #{spmnno1}, - SPMNNO2 = #{spmnno2}, - YBL_MD = #{yblMd}, - TRVL_DSTNC = #{trvlDstnc}, - INSPT_VALID_PD_BGNDE = #{insptValidPdBgnde}, - INSPT_VALID_PD_ENDDE = #{insptValidPdEndde}, - CHCK_VALID_PD_BGNDE = #{chckValidPdBgnde}, - CHCK_VALID_PD_ENDDE = #{chckValidPdEndde}, - REGIST_REQST_SE_NM = #{registReqstSeNm}, - FRST_REGIST_RQRCNO = #{frstRegistRqrcno}, - NMPL_CSDY_REMNR_DE = #{nmplCsdyRemnrDe}, - NMPL_CSDY_AT = #{nmplCsdyAt}, - BSS_USE_PD = #{bssUsePd}, - OCTHT_ERSR_PRVNTC_NTICE_DE = #{octhtErsrPrvntcNticeDe}, - ERSR_REGIST_DE = #{ersrRegistDe}, - ERSR_REGIST_SE_CODE = #{ersrRegistSeCode}, - ERSR_REGIST_SE_NM = #{ersrRegistSeNm}, - MRTGCNT = #{mrtgcnt}, - VHCLECNT = #{vhclecnt}, - STMDCNT = #{stmdcnt}, - ADRES1 = #{adres1}, - ADRES_NM1 = #{adresNm1}, - ADRES = #{adres}, - ADRES_NM = #{adresNm}, - INDVDL_BSNM_AT = #{indvdlBsnmAt}, - TELNO = #{telno}, - MBER_NM = #{mberNm}, - MBER_SE_CODE = #{mberSeCode}, - MBER_SE_NO = #{mberSeNo}, - TAXXMPT_TRGTER_SE_CODE = #{taxxmptTrgterSeCode}, - TAXXMPT_TRGTER_SE_CODE_NM = #{taxxmptTrgterSeCodeNm}, - CNT_MATTER = #{cntMatter}, - EMD_NM = #{emdNm}, - PRVNTCCNT = #{prvntccnt}, - XPORT_FLFL_AT_STTEMNT_DE = #{xportFlflAtSttemntDe}, - PARTN_RQRCNO = #{partnRqrcno}, - FRST_TRNSFR_DE = #{frstTrnsfrDe}, - PROCESS_IMPRTY_RESN_CODE = #{processImprtyResnCode}, - PROCESS_IMPRTY_RESN_DTLS = #{processImprtyResnDtls}, + ACQS_AMT = #{acqsAmt}, + REG_DTL_CD = #{regDtlCd}, + REG_DTL_NM = #{regDtlNm}, + FRST_REG_YMD = #{frstRegYmd}, + VEAG_END_YMD = #{veagEndYmd}, + YRIDNW = #{yridnw}, + SPMNNO_1 = #{spmnno1}, + SPMNNO_2 = #{spmnno2}, + FBCTN_YMD = #{fbctnYmd}, + DRVNG_DSTNC = #{drvngDstnc}, + INSP_VLD_PD_BGNG_YMD = #{inspVldPdBgngYmd}, + INSP_VLD_PD_END_YMD = #{inspVldPdEndYmd}, + CHCK_VLD_PD_BGNG_YMD = #{chckVldPdBgngYmd}, + CHCK_VLD_PD_END_YMD = #{chckVldPdEndYmd}, + REG_APLY_SE_NM = #{regAplySeNm}, + FRST_REG_APLY_RCPT_NO = #{frstRegAplyRcptNo}, + NOPLT_CSDY_AVTSMT_YMD = #{nopltCsdyAvtsmtYmd}, + NOPLT_CSDY_YN = #{nopltCsdyYn}, + BSS_USE_PD_YMD = #{bssUsePdYmd}, + OCTHT_ERSR_PRVNTC_AVTSMT_YMD = #{octhtErsrPrvntcAvtsmtYmd}, + ERSR_REG_YMD = #{ersrRegYmd}, + ERSR_REG_SE_CD = #{ersrRegSeCd}, + ERSR_REG_SE_NM = #{ersrRegSeNm}, + MRTG_CNT = #{mrtgCnt}, + SZR_CNT = #{szrCnt}, + STRCT_CHG_CNT = #{strctChgCnt}, + USGSRHLD_ADDR_1 = #{usgsrhldAddr1}, + USGSRHLD_ADDR_DTL_1 = #{usgsrhldAddrDtl1}, + OWNR_ADDR = #{ownrAddr}, + OWNR_ADDR_DTL = #{ownrAddrDtl}, + INDVDL_BZMN_YN = #{indvdlBzmnYn}, + RPRS_OWNR_TELNO = #{rprsOwnrTelno}, + RPRS_OWNR_NM = #{rprsOwnrNm}, + RPRS_OWNR_MBR_SE_CD = #{rprsOwnrMbrSeCd}, + RPRSV_OWNR_IDECNO = #{rprsvOwnrIdecno}, + TAXXMPT_TRPR_SE_CD = #{taxxmptTrprSeCd}, + TAXXMPT_APLCN_SE_CD = #{taxxmptAplcnSeCd}, + SPCABL_MTTR_CNT = #{spcablMttrCnt}, + USGSRHLD_DONG_NM = #{usgsrhldDongNm}, + PRVNTC_CNT = #{prvntcCnt}, + XPORT_FLFL_YN_DCLR_YMD = #{xportFlflYnDclrYmd}, + ISSU_NO = #{issuNo}, + FRST_TRNSFR_YMD = #{frstTrnsfrYmd}, + DRIV_SRGBTRY_IDNTF_NO = #{drivSrgbtryIdntfNo}, + PRCS_IMPRTY_RSN_CD = #{prcsImprtyRsnCd}, + PRCS_IMPRTY_RSN_DTLS = #{prcsImprtyRsnDtls}, + CAR_FFNLG_TRGT_ID = #{carFfnlgTrgtId} WHERE CAR_LEDGER_FRMBK_ID = #{carLedgerFrmbkId} @@ -132,36 +137,40 @@ INSERT INTO tb_car_ledger_frmbk_dtl ( CAR_LEDGER_FRMBK_DTL_ID, CAR_LEDGER_FRMBK_ID, - MAINCHK, - CHANGE_JOB_SE_CODE, - MAINNO, - SUBNO, - DTLS, - RQRCNO, + SZR_RMV_DTL_SN, + CHG_TASK_SE_CD, + MAIN_NO, + SNO, + SPCABL_MTTR, + HSHLDR_NM, + HSHLDR_IDECNO, + APLY_RCPT_NO, VHMNO, LEDGER_GROUP_NO, - LEDGER_INDVDLZ_NO, - GUBUN_NM, - CHANGE_DE, - DETAIL_SN, + LEDGER_INDIV_NO, + CHG_TASK_SE_NM, + CHG_YMD, + DTL_SN, FLAG, REG_DT, RGTR ) VALUES ( #{carLedgerFrmbkDtlId}, #{carLedgerFrmbkId}, - #{mainchk}, - #{changeJobSeCode}, - #{mainno}, - #{subno}, - #{dtls}, - #{rqrcno}, + #{szrRmvDtlSn}, + #{chgTaskSeCd}, + #{mainNo}, + #{sno}, + #{spcablMttr}, + #{hshldrNm}, + #{hshldrIdecno}, + #{aplyRcptNo}, #{vhmno}, #{ledgerGroupNo}, - #{ledgerIndvdlzNo}, - #{gubunNm}, - #{changeDe}, - #{detailSn}, + #{ledgerIndivNo}, + #{chgTaskSeNm}, + #{chgYmd}, + #{dtlSn}, #{flag}, NOW(), #{rgtr}