-
+
- 조회 구분 +
- + + +
- * 차량번호 +
- + + +
- 부과기준일 +
- + + +
- 조회구분 +
- + + +
- 차대번호 +
- + + + + + + +
-
+
+
+
-
+
- 조회 결과 +
- + + +
diff --git a/src/main/java/go/kr/project/api/external/service/impl/ExternalVehicleApiServiceImpl.java b/src/main/java/go/kr/project/api/external/service/impl/ExternalVehicleApiServiceImpl.java index 99079a6..7c81777 100644 --- a/src/main/java/go/kr/project/api/external/service/impl/ExternalVehicleApiServiceImpl.java +++ b/src/main/java/go/kr/project/api/external/service/impl/ExternalVehicleApiServiceImpl.java @@ -1,5 +1,6 @@ package go.kr.project.api.external.service.impl; +import egovframework.exception.MessageException; import go.kr.project.api.config.ApiConstant; import go.kr.project.api.external.service.ExternalVehicleApiService; import go.kr.project.api.model.request.BasicRequest; @@ -170,7 +171,7 @@ public class ExternalVehicleApiServiceImpl implements ExternalVehicleApiService } catch (Exception e) { log.error("차량 기본정보 조회 API 호출 실패 - 차량번호: {}", request.getVhrno(), e); - throw new RuntimeException("차량 기본정보 조회 실패: " + e.getMessage(), e); + throw new MessageException("차량 기본정보 조회 실패: " + e.getMessage(), e); } } @@ -215,7 +216,7 @@ public class ExternalVehicleApiServiceImpl implements ExternalVehicleApiService } catch (Exception e) { log.error("자동차 등록원부 조회 API 호출 실패 - 차량번호: {}", request.getVhrno(), e); - throw new RuntimeException("자동차 등록원부 조회 실패: " + e.getMessage(), e); + throw new MessageException("자동차 등록원부 조회 실패: " + e.getMessage(), e); } } } 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 new file mode 100644 index 0000000..f2b3db3 --- /dev/null +++ b/src/main/java/go/kr/project/carInspectionPenalty/callApi/controller/VehicleInquiryController.java @@ -0,0 +1,137 @@ +package go.kr.project.carInspectionPenalty.callApi.controller; + +import egovframework.constant.TilesConstants; +import egovframework.util.ApiResponseUtil; +import go.kr.project.api.model.VehicleApiResponseVO; +import go.kr.project.api.model.request.BasicRequest; +import go.kr.project.api.model.request.LedgerRequest; +import go.kr.project.api.model.response.BasicResponse; +import go.kr.project.api.model.response.LedgerResponse; +import go.kr.project.api.service.VehicleInfoService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.*; + +/** + * 차량 정보 조회 컨트롤러 + * 자동차 기본정보, 등록원부, 통합 조회 기능을 제공합니다. + */ +@Controller +@RequestMapping("/carInspectionPenalty/callApi") +@RequiredArgsConstructor +@Slf4j +@Tag(name = "차량 정보 조회", description = "차량 정보 조회 API") +public class VehicleInquiryController { + + private final VehicleInfoService vehicleInfoService; + + /** + * 차량 정보 조회 화면 + */ + @GetMapping("/inquiry.do") + public String inquiryPage(Model model) { + log.debug("차량 정보 조회 화면 진입"); + return "carInspectionPenalty/callApi/inquiry" + TilesConstants.BASE; + } + + /** + * 자동차 통합 조회 (기본정보 + 등록원부) + * + * @param request 기본정보 조회 요청 + * @return 차량 통합 정보 조회 결과 + */ + @PostMapping("/getIntegratedInfo.do") + @ResponseBody + @Operation(summary = "자동차 통합 조회", description = "차량 기본정보와 등록원부 정보를 함께 조회합니다.") + public ResponseEntity> getIntegratedInfo(@RequestBody BasicRequest request) { + log.info("========== 자동차 통합 조회 시작 =========="); + log.info("요청 차량번호: {}", request.getVhrno()); + log.info("부과기준일: {}", request.getLevyStdde()); + log.info("조회구분코드: {}", request.getInqireSeCode()); + log.info("차대번호: {}", request.getVin()); + + // 입력값 검증 + if (!StringUtils.hasText(request.getVhrno())) { + log.warn("차량번호가 입력되지 않았습니다."); + return ApiResponseUtil.error("차량번호를 입력해주세요."); + } + + // 차량 정보 조회 + VehicleApiResponseVO response = vehicleInfoService.getVehicleInfo(request); + if(!response.isSuccess()) { + log.warn("자동차 통합 조회 실패 - 차량번호: {}, 메시지: {}", request.getVhrno(), response.getMessage()); + log.warn("========== 자동차 통합 조회 실패 =========="); + return ApiResponseUtil.error(response.getMessage()); + } + + log.info("자동차 통합 조회 성공 - 차량번호: {}", request.getVhrno()); + log.info("========== 자동차 통합 조회 완료 =========="); + return ApiResponseUtil.success(response, "자동차 통합 조회가 완료되었습니다."); + } + + /** + * 자동차 기본사항 조회 (단독) + * + * @param request 기본정보 조회 요청 + * @return 차량 기본정보 조회 결과 + */ + @PostMapping("/getBasicInfo.do") + @ResponseBody + @Operation(summary = "자동차 기본사항 조회", description = "차량 기본정보만 조회합니다.") + public ResponseEntity> getBasicInfo(@RequestBody BasicRequest request) { + log.info("========== 자동차 기본사항 조회 시작 =========="); + log.info("요청 차량번호: {}", request.getVhrno()); + log.info("부과기준일: {}", request.getLevyStdde()); + log.info("조회구분코드: {}", request.getInqireSeCode()); + log.info("차대번호: {}", request.getVin()); + + // 입력값 검증 + if (!StringUtils.hasText(request.getVhrno())) { + log.warn("차량번호가 입력되지 않았습니다."); + return ApiResponseUtil.error("차량번호를 입력해주세요."); + } + + // 차량 기본정보 조회 + BasicResponse response = vehicleInfoService.getBasicInfo(request); + + log.info("자동차 기본사항 조회 성공 - 차량번호: {}", request.getVhrno()); + log.info("========== 자동차 기본사항 조회 완료 =========="); + return ApiResponseUtil.success(response, "자동차 기본사항 조회가 완료되었습니다."); + + } + + /** + * 자동차 등록원부(갑) 조회 (단독) + * + * @param request 등록원부 조회 요청 + * @return 차량 등록원부 조회 결과 + */ + @PostMapping("/getLedgerInfo.do") + @ResponseBody + @Operation(summary = "자동차 등록원부(갑) 조회", description = "차량 등록원부 정보만 조회합니다.") + public ResponseEntity> getLedgerInfo(@RequestBody LedgerRequest request) { + log.info("========== 자동차 등록원부(갑) 조회 시작 =========="); + log.info("요청 차량번호: {}", request.getVhrno()); + log.info("조회구분코드: {}", request.getInqireSeCode()); + log.info("민원인성명: {}", request.getCpttrNm()); + + // 입력값 검증 + if (!StringUtils.hasText(request.getVhrno())) { + log.warn("차량번호가 입력되지 않았습니다."); + return ApiResponseUtil.error("차량번호를 입력해주세요."); + } + + // 차량 등록원부 조회 + LedgerResponse response = vehicleInfoService.getLedgerInfo(request); + + log.info("자동차 등록원부(갑) 조회 성공 - 차량번호: {}", request.getVhrno()); + log.info("========== 자동차 등록원부(갑) 조회 완료 =========="); + return ApiResponseUtil.success(response, "자동차 등록원부(갑) 조회가 완료되었습니다."); + } +} diff --git a/src/main/java/go/kr/project/carInspectionPenalty/search/Controller/CarInspectionPenaltyController.java b/src/main/java/go/kr/project/carInspectionPenalty/search/controller/CarInspectionPenaltyController.java similarity index 97% rename from src/main/java/go/kr/project/carInspectionPenalty/search/Controller/CarInspectionPenaltyController.java rename to src/main/java/go/kr/project/carInspectionPenalty/search/controller/CarInspectionPenaltyController.java index 9fc31e9..b3a6db1 100644 --- a/src/main/java/go/kr/project/carInspectionPenalty/search/Controller/CarInspectionPenaltyController.java +++ b/src/main/java/go/kr/project/carInspectionPenalty/search/controller/CarInspectionPenaltyController.java @@ -1,4 +1,4 @@ -package go.kr.project.carInspectionPenalty.search.Controller; +package go.kr.project.carInspectionPenalty.search.controller; import egovframework.constant.TilesConstants; import egovframework.util.ApiResponseUtil; diff --git a/src/main/resources/application-dev.yml b/src/main/resources/application-dev.yml index 8710502..dc7177a 100644 --- a/src/main/resources/application-dev.yml +++ b/src/main/resources/application-dev.yml @@ -192,20 +192,20 @@ vmis: # GPKI 암호화 설정 (개발 환경: 비활성화) gpki: - enabled: "N" # 개발 환경에서는 암호화 미사용 - useSign: true - charset: "UTF-8" - certServerId: "SVR5640020001" - targetServerId: "SVR1500000015" - ldap: true - gpkiLicPath: "src/GPKI/conf" - certFilePath: "src/GPKI/certs" - envCertFilePathName: "src/GPKI/certs/SVR5640020001_env.cer" - envPrivateKeyFilePathName: "src/GPKI/certs/SVR5640020001_env.key" - envPrivateKeyPasswd: "*sbm204221" - sigCertFilePathName: "src/GPKI/certs/SVR5640020001_sig.cer" - sigPrivateKeyFilePathName: "src/GPKI/certs/SVR5640020001_sig.key" - sigPrivateKeyPasswd: "*sbm204221" + enabled: "N" # GPKI 사용 여부 (개발환경에서는 비활성화) + useSign: true # 서명 사용 여부 + charset: "UTF-8" # 문자셋 인코딩 + certServerId: "SVR5640020001" # 인증서 서버 ID (요청 시스템) + targetServerId: "SVR1611000006" # 대상 서버 ID (차세대교통안전공단) + ldap: true # LDAP 사용 여부 + gpkiLicPath: "C:\\GPKI\\Lic" # GPKI 라이선스 파일 경로 + certFilePath: "c:\\GPKI\\Certificate\\class1" # 인증서 파일 디렉토리 경로 + envCertFilePathName: "c:\\GPKI\\Certificate\\class1\\SVR5640020001_env.cer" # 암호화용 인증서 파일 경로 + envPrivateKeyFilePathName: "c:\\GPKI\\Certificate\\class1\\SVR5640020001_env.key" # 암호화용 개인키 파일 경로 + envPrivateKeyPasswd: "*sbm204221" # 암호화용 개인키 비밀번호 + sigCertFilePathName: "c:\\GPKI\\Certificate\\class1\\SVR5640020001_sig.cer" # 서명용 인증서 파일 경로 + sigPrivateKeyFilePathName: "c:\\GPKI\\Certificate\\class1\\SVR5640020001_sig.key" # 서명용 개인키 파일 경로 + sigPrivateKeyPasswd: "*sbm204221" # 서명용 개인키 비밀번호 # 정부 API 연동 설정 (개발 행정망) # 타임아웃 설정은 공통 rest-template 설정 사용 diff --git a/src/main/resources/application-local.yml b/src/main/resources/application-local.yml index 33a03e8..6113c9f 100644 --- a/src/main/resources/application-local.yml +++ b/src/main/resources/application-local.yml @@ -160,7 +160,7 @@ juso: key: "devU01TX0FVVEgyMDI1MDkyMjEyMTM1NzExNjI0NzE=" url: "https://business.juso.go.kr/addrlink/addrLinkApiJsonp.do" -# ===== VMIS 통합 설정 (Local 환경) ===== +# ===== VMIS 통합 설정 (Dev 환경) ===== vmis: integration: mode: external # internal: 내부 VMIS 모듈 직접 호출, external: 외부 REST API 호출 @@ -192,29 +192,29 @@ vmis: # Internal Mode 설정 (내부 VMIS 모듈 사용 시) system: infoSysId: "41-345" # 정보시스템 ID - infoSysIp: "${SERVER_IP:105.19.10.135}" # 시스템 IP + infoSysIp: "105.19.10.135" # 시스템 IP sigunguCode: "41460" # 시군구 코드 departmentCode: "" # 부서 코드 chargerId: "" # 담당자 ID chargerIp: "" # 담당자 IP chargerNm: "" # 담당자명 - # GPKI 암호화 설정 (로컬 환경: 비활성화) + # GPKI 암호화 설정 (개발 환경: 비활성화) gpki: - enabled: "N" # 로컬 환경에서는 암호화 미사용 - useSign: true - charset: "UTF-8" - certServerId: "SVR5640020001" - targetServerId: "SVR1500000015" - ldap: true - gpkiLicPath: "src/GPKI/conf" - certFilePath: "src/GPKI/certs" - envCertFilePathName: "src/GPKI/certs/SVR5640020001_env.cer" - envPrivateKeyFilePathName: "src/GPKI/certs/SVR5640020001_env.key" - envPrivateKeyPasswd: "${GPKI_ENV_PASSWORD:*sbm204221}" - sigCertFilePathName: "src/GPKI/certs/SVR5640020001_sig.cer" - sigPrivateKeyFilePathName: "src/GPKI/certs/SVR5640020001_sig.key" - sigPrivateKeyPasswd: "${GPKI_SIG_PASSWORD:*sbm204221}" + enabled: "N" # GPKI 사용 여부 (개발환경에서는 비활성화) + useSign: true # 서명 사용 여부 + charset: "UTF-8" # 문자셋 인코딩 + certServerId: "SVR5640020001" # 인증서 서버 ID (요청 시스템) + targetServerId: "SVR1611000006" # 대상 서버 ID (차세대교통안전공단) + ldap: true # LDAP 사용 여부 + gpkiLicPath: "C:\\GPKI\\Lic" # GPKI 라이선스 파일 경로 + certFilePath: "c:\\GPKI\\Certificate\\class1" # 인증서 파일 디렉토리 경로 + envCertFilePathName: "c:\\GPKI\\Certificate\\class1\\SVR5640020001_env.cer" # 암호화용 인증서 파일 경로 + envPrivateKeyFilePathName: "c:\\GPKI\\Certificate\\class1\\SVR5640020001_env.key" # 암호화용 개인키 파일 경로 + envPrivateKeyPasswd: "*sbm204221" # 암호화용 개인키 비밀번호 + sigCertFilePathName: "c:\\GPKI\\Certificate\\class1\\SVR5640020001_sig.cer" # 서명용 인증서 파일 경로 + sigPrivateKeyFilePathName: "c:\\GPKI\\Certificate\\class1\\SVR5640020001_sig.key" # 서명용 개인키 파일 경로 + sigPrivateKeyPasswd: "*sbm204221" # 서명용 개인키 비밀번호 # 정부 API 연동 설정 (개발 행정망) # 타임아웃 설정은 공통 rest-template 설정 사용 @@ -226,13 +226,13 @@ vmis: basic: # 시군구연계 자동차기본사항조회 path: "/SignguCarBassMatterInqireService" cntcInfoCode: "AC1_FD11_01" - apiKey: "${GOV_API_KEY_BASIC:05e8d748fb366a0831dce71a32424460746a72d591cf483ccc130534dd51e394}" - cvmisApikey: "${GOV_CVMIS_API_KEY_BASIC:014F9215-B6D9A3B6-4CED5225-68408C46}" + apiKey: "05e8d748fb366a0831dce71a32424460746a72d591cf483ccc130534dd51e394" + cvmisApikey: "014F9215-B6D9A3B6-4CED5225-68408C46" ledger: # 시군구연계 자동차등록원부(갑) path: "/SignguCarLedgerFrmbkService" cntcInfoCode: "AC1_FD11_02" - apiKey: "${GOV_API_KEY_LEDGER:1beeb01857c2e7e9b41c002b007ccb9754d9c272f66d4bb64fc45b302c69e529}" - cvmisApikey: "${GOV_CVMIS_API_KEY_LEDGER:63DF159B-7B9C64C5-86CCB15C-5F93E750}" + apiKey: "1beeb01857c2e7e9b41c002b007ccb9754d9c272f66d4bb64fc45b302c69e529" + cvmisApikey: "63DF159B-7B9C64C5-86CCB15C-5F93E750" # External Mode 설정 (외부 REST API 사용 시) # 타임아웃 설정은 공통 rest-template 설정 사용 diff --git a/src/main/resources/application-prd.yml b/src/main/resources/application-prd.yml index e5689c0..7d5e737 100644 --- a/src/main/resources/application-prd.yml +++ b/src/main/resources/application-prd.yml @@ -200,20 +200,20 @@ vmis: # GPKI 암호화 설정 (운영 환경: 활성화) gpki: - enabled: "Y" # 운영 환경에서는 암호화 사용 - useSign: true - charset: "UTF-8" - certServerId: "SVR5640020001" # 운영 인증서 ID로 교체 필요 - targetServerId: "SVR1500000015" - ldap: true - gpkiLicPath: "src/GPKI/conf" - certFilePath: "src/GPKI/certs" - envCertFilePathName: "src/GPKI/certs/SVR5640020001_env.cer" - envPrivateKeyFilePathName: "src/GPKI/certs/SVR5640020001_env.key" - envPrivateKeyPasswd: "*sbm204221" - sigCertFilePathName: "src/GPKI/certs/SVR5640020001_sig.cer" - sigPrivateKeyFilePathName: "src/GPKI/certs/SVR5640020001_sig.key" - sigPrivateKeyPasswd: "*sbm204221" + enabled: "Y" # GPKI 사용 여부 (운영환경에서는 활성화) + useSign: true # 서명 사용 여부 + charset: "UTF-8" # 문자셋 인코딩 + certServerId: "SVR5640020001" # 인증서 서버 ID (요청 시스템) + targetServerId: "SVR1611000006" # 대상 서버 ID (차세대교통안전공단) + ldap: true # LDAP 사용 여부 + gpkiLicPath: "C:\\GPKI\\Lic" # GPKI 라이선스 파일 경로 + certFilePath: "c:\\GPKI\\Certificate\\class1" # 인증서 파일 디렉토리 경로 + envCertFilePathName: "c:\\GPKI\\Certificate\\class1\\SVR5640020001_env.cer" # 암호화용 인증서 파일 경로 + envPrivateKeyFilePathName: "c:\\GPKI\\Certificate\\class1\\SVR5640020001_env.key" # 암호화용 개인키 파일 경로 + envPrivateKeyPasswd: "*sbm204221" # 암호화용 개인키 비밀번호 + sigCertFilePathName: "c:\\GPKI\\Certificate\\class1\\SVR5640020001_sig.cer" # 서명용 인증서 파일 경로 + sigPrivateKeyFilePathName: "c:\\GPKI\\Certificate\\class1\\SVR5640020001_sig.key" # 서명용 개인키 파일 경로 + sigPrivateKeyPasswd: "*sbm204221" # 서명용 개인키 비밀번호 # 정부 API 연동 설정 (운영 행정망) # 타임아웃 설정은 공통 rest-template 설정 사용 diff --git a/src/main/webapp/WEB-INF/views/carInspectionPenalty/callApi/inquiry.jsp b/src/main/webapp/WEB-INF/views/carInspectionPenalty/callApi/inquiry.jsp new file mode 100644 index 0000000..544bc5a --- /dev/null +++ b/src/main/webapp/WEB-INF/views/carInspectionPenalty/callApi/inquiry.jsp @@ -0,0 +1,576 @@ +<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> +<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> +<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> +<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %> +<%@ taglib prefix="dateUtil" uri="http://egovframework.go.kr/functions/date-util" %> + + +