You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
9.4 KiB
9.4 KiB
VMIS 통합 완료 및 사용 가이드
📋 작업 완료 요약
VMIS-interface 프로젝트의 모든 코드를 VIPS 내부로 통합하고, YAML 설정을 통해 내부/외부 모드를 자유롭게 전환할 수 있는 기능을 구현했습니다.
✅ 완료된 작업
1단계: 코드 마이그레이션 (완료)
- ✅ VMIS-interface 전체 코드 이식 (33개 Java 파일, 2개 XML)
- ✅ 패키지 변경:
com.vmis.interfaceapp→go.kr.project.vmis - ✅ Spring Boot 3 → 2 호환:
jakarta→javax - ✅ Java 17 → 8 호환: Text Blocks, List.of() 제거
- ✅ HttpClient 5 → 4 변환
- ✅ GPKI 라이브러리 추가
- ✅ application.yml에 VMIS 설정 통합
2단계: Strategy Pattern 구현 (완료)
- ✅ VehicleInfoService 인터페이스 생성
- ✅ InternalVehicleInfoServiceImpl: 내부 VMIS 모듈 직접 호출
- ✅ ExternalVehicleInfoServiceImpl: 외부 REST API 호출
- ✅ VmisIntegrationConfig: 모드 모니터링 및 로깅
- ✅ VehicleResponseMapper: 모델 변환 유틸리티
3단계: Bean 충돌 해결 (완료)
- ✅
restTemplate→vmisRestTemplate으로 변경 - ✅ @Qualifier 어노테이션 추가
- ✅ 빌드 성공 확인
🎯 주요 기능
1. 모드 전환 (YAML 설정)
Internal Mode: 내부 VMIS 모듈 직접 호출
# application.yml
vmis:
integration:
mode: internal # 내부 모듈 사용
External Mode: 외부 REST API 호출
# application.yml
vmis:
integration:
mode: external # 외부 API 사용
external:
api:
url: http://localhost:8081/api/v1/vehicles
2. 자동 Bean 선택
Spring Boot의 @ConditionalOnProperty 어노테이션을 사용하여 설정에 따라 자동으로 적절한 구현체를 선택합니다:
- mode: internal →
InternalVehicleInfoServiceImpl활성화 - mode: external →
ExternalVehicleInfoServiceImpl활성화 (기본값)
3. 통합 인터페이스
@Autowired
private VehicleInfoService vehicleInfoService;
// 단일 차량 조회
VehicleApiResponseVO response = vehicleInfoService.getVehicleInfo("12가3456");
// 여러 차량 일괄 조회
List<VehicleApiResponseVO> responses = vehicleInfoService.getVehiclesInfo(
Arrays.asList("12가3456", "34나5678")
);
📁 생성/수정된 파일
새로 생성된 파일
-
공통 인터페이스
src/main/java/go/kr/project/common/service/VehicleInfoService.java
-
Strategy Pattern 구현체
src/main/java/go/kr/project/vmis/service/InternalVehicleInfoServiceImpl.javasrc/main/java/go/kr/project/externalApi/service/ExternalVehicleInfoServiceImpl.java
-
설정 및 유틸리티
src/main/java/go/kr/project/vmis/config/VmisIntegrationConfig.javasrc/main/java/go/kr/project/vmis/util/VehicleResponseMapper.java
수정된 파일
-
src/main/java/go/kr/project/vmis/config/HttpClientConfig.java- Bean 이름 변경:
restTemplate→vmisRestTemplate
- Bean 이름 변경:
-
src/main/java/go/kr/project/vmis/client/GovernmentApiClient.java- @Qualifier 추가:
@Qualifier("vmisRestTemplate")
- @Qualifier 추가:
-
src/main/java/go/kr/project/vmis/config/properties/VmisProperties.java- IntegrationProps, ExternalProps 추가
🔧 설정 상세
application.yml 전체 구조
vmis:
# ===== 모드 선택 =====
integration:
mode: internal # internal 또는 external
# ===== Internal Mode 설정 =====
system:
infoSysId: "41-345"
infoSysIp: "${SERVER_IP:105.19.10.135}"
regionCode: "41460"
departmentCode: ""
chargerId: ""
chargerIp: ""
chargerNm: ""
gpki:
enabled: "N" # Y: 암호화 사용, N: 암호화 미사용
useSign: true
charset: "UTF-8"
certServerId: "SVR5640020001"
targetServerId: "SVR1500000015"
# ... (기타 GPKI 설정)
gov:
scheme: "http"
host: "10.188.225.94:29001"
basePath: "/piss/api/molit"
connectTimeoutMillis: 5000
readTimeoutMillis: 10000
services:
basic:
path: "/SignguCarBassMatterInqireService"
cntcInfoCode: "AC1_FD11_01"
apiKey: "${GOV_API_KEY_BASIC:...}"
cvmisApikey: "${GOV_CVMIS_API_KEY_BASIC:...}"
ledger:
path: "/SignguCarLedgerFrmbkService"
cntcInfoCode: "AC1_FD11_02"
apiKey: "${GOV_API_KEY_LEDGER:...}"
cvmisApikey: "${GOV_CVMIS_API_KEY_LEDGER:...}"
# ===== External Mode 설정 =====
external:
api:
url: "http://localhost:8081/api/v1/vehicles"
connectTimeoutMillis: 5000
readTimeoutMillis: 10000
📊 모드별 특징
Internal Mode (내부 모듈 직접 호출)
장점:
- ✅ 네트워크 오버헤드 없음 (더 빠른 성능)
- ✅ 외부 서버 불필요
- ✅ 단일 애플리케이션 배포
- ✅ 직접 정부 시스템과 통신
요구사항:
- 정부 API 접근 권한 필요
- GPKI 인증서 설정 (운영 환경)
- 방화벽 정책 설정
사용 시나리오:
- 운영 환경 배포
- 단일 서버 구성
- 높은 성능이 요구되는 경우
External Mode (외부 REST API 호출)
장점:
- ✅ 마이크로서비스 아키텍처 지원
- ✅ VMIS 모듈 독립 배포 가능
- ✅ 여러 시스템에서 공유 가능
- ✅ 부하 분산 가능
요구사항:
- VMIS-interface 서버가 실행 중이어야 함
- 네트워크 연결 필요
사용 시나리오:
- 개발 환경 (VMIS-interface 서버 별도 실행)
- 마이크로서비스 구조
- 여러 클라이언트가 VMIS 기능을 공유하는 경우
🚀 시작 로그 예시
Internal Mode 시작 시
========================================
VMIS Integration Mode: internal
Active Implementation: InternalVehicleInfoServiceImpl
========================================
[Internal Mode] 내부 VMIS 모듈을 직접 사용합니다
- 정부 API 호스트: http://10.188.225.94:29001
- 기본사항 조회 경로: /SignguCarBassMatterInqireService
- 등록원부 조회 경로: /SignguCarLedgerFrmbkService
- GPKI 암호화: N
- 연결 타임아웃: 5000ms
- 읽기 타임아웃: 10000ms
- GPKI 암호화가 비활성화되어 있습니다. 개발 환경에서만 사용하세요.
External Mode 시작 시
========================================
VMIS Integration Mode: external
Active Implementation: ExternalVehicleInfoServiceImpl
========================================
[External Mode] 외부 REST API를 사용합니다
- 외부 API URL: http://localhost:8081/api/v1/vehicles
- 연결 타임아웃: 5000ms
- 읽기 타임아웃: 10000ms
- 외부 VMIS-interface 서버가 실행 중이어야 합니다.
- 기본사항 조회: POST http://localhost:8081/api/v1/vehicles/basic
- 등록원부 조회: POST http://localhost:8081/api/v1/vehicles/ledger
🧪 테스트 방법
1. Internal Mode 테스트
# application.yml
vmis:
integration:
mode: internal
# 애플리케이션 시작
./gradlew bootRun
# 로그에서 "VMIS Integration Mode: internal" 확인
2. External Mode 테스트
# application.yml
vmis:
integration:
mode: external
# 1. VMIS-interface 서버 시작 (별도 터미널)
cd D:\workspace\git\VMIS-interface
./gradlew bootRun
# 2. VIPS 애플리케이션 시작
cd D:\workspace\git\VIPS
./gradlew bootRun
# 로그에서 "VMIS Integration Mode: external" 확인
🔍 코드 사용 예시
기존 코드 수정 불필요
기존에 ExternalVehicleApiService를 사용하던 코드는 수정 없이 VehicleInfoService로 변경하면 됩니다:
변경 전:
@Autowired
private ExternalVehicleApiService externalVehicleApiService;
VehicleApiResponseVO response = externalVehicleApiService.getVehicleInfo("12가3456");
변경 후:
@Autowired
private VehicleInfoService vehicleInfoService;
VehicleApiResponseVO response = vehicleInfoService.getVehicleInfo("12가3456");
설정 파일만 변경하면 자동으로 내부/외부 모드가 전환됩니다!
📝 커밋 내역
1차 커밋: 기본 통합
feat: VMIS-interface 통합 (Spring Boot 2.7 호환)
- VMIS-interface 전체 코드 이식 (33개 Java 파일, 2개 XML)
- 패키지 변경, Spring Boot 호환, Java 호환
- 빌드 성공 확인 ✅
2차 커밋: Strategy Pattern
feat: VMIS 통합 모드 전환 기능 구현 (Strategy Pattern)
- VehicleInfoService 인터페이스 및 구현체
- Bean 충돌 해결
- 설정 확장 및 모니터링
- 빌드 성공 확인 ✅
⚠️ 주의사항
Bean 이름 변경
- 기존
restTemplate→ 새로 추가된vmisRestTemplate - 기존 RestTemplateConfig의 restTemplate은 그대로 유지
- VMIS 내부 모듈은 vmisRestTemplate 사용
기본 모드
- 설정이 없거나
mode가 지정되지 않으면 external 모드가 기본값 - Internal 모드를 사용하려면 명시적으로
mode: internal설정 필요
GPKI 인증서
- 운영 환경에서는 반드시
gpki.enabled: Y설정 - 개발 환경에서는
gpki.enabled: N사용 가능
🎉 완료!
모든 작업이 성공적으로 완료되었습니다. YAML 설정만으로 내부/외부 모드를 자유롭게 전환할 수 있습니다.
질문이나 문제가 있으면 다음 문서를 참조하세요:
VMIS_INTERFACE_INTEGRATION_ANALYSIS.md: 통합 분석 문서VMIS_INTERFACE_MIGRATION_PLAN.md: 마이그레이션 계획VMIS_INTEGRATION_STRATEGY_DESIGN.md: Strategy Pattern 설계