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 7c81777..d3bdc59 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 @@ -3,10 +3,13 @@ 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.internal.util.ExceptionDetailUtil; import go.kr.project.api.model.request.BasicRequest; import go.kr.project.api.model.request.LedgerRequest; import go.kr.project.api.model.*; import go.kr.project.api.model.response.*; +import go.kr.project.api.service.VmisCarBassMatterInqireLogService; +import go.kr.project.api.service.VmisCarLedgerFrmbkLogService; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.core.ParameterizedTypeReference; @@ -29,6 +32,8 @@ public class ExternalVehicleApiServiceImpl implements ExternalVehicleApiService private final RestTemplate restTemplate; private final VmisProperties vmisProperties; // 프로퍼티 주입 (외부 API URL 구성에 사용) + private final VmisCarBassMatterInqireLogService bassMatterLogService; // 기본사항 조회 로그 서비스 + private final VmisCarLedgerFrmbkLogService ledgerLogService; // 등록원부 로그 서비스 @Override public List getVehiclesInfo(List vehicleNumbers) { @@ -141,17 +146,22 @@ public class ExternalVehicleApiServiceImpl implements ExternalVehicleApiService public BasicResponse getBasicInfo(BasicRequest request) { log.debug("차량 기본정보 조회 API 호출 - 차량번호: {}", request.getVhrno()); - // Envelope로 감싸기 (요청 객체는 이미 모든 필수 파라미터를 포함) - Envelope requestEnvelope = new Envelope<>(request); + String generatedId = null; + try { + // 1) 최초 요청 로그 저장 (별도 트랜잭션) + VmisCarBassMatterInqireVO logEntity = VmisCarBassMatterInqireVO.fromRequest(request); + generatedId = bassMatterLogService.createInitialRequestNewTx(logEntity); - // HTTP 헤더 설정 - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); + // Envelope로 감싸기 (요청 객체는 이미 모든 필수 파라미터를 포함) + Envelope requestEnvelope = new Envelope<>(request); - HttpEntity> requestEntity = new HttpEntity<>(requestEnvelope, headers); + // HTTP 헤더 설정 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); - try { - // API 호출 + HttpEntity> requestEntity = new HttpEntity<>(requestEnvelope, headers); + + // 2) API 호출 ResponseEntity> responseEntity = restTemplate.exchange( vmisProperties.getExternal().getApi().getUrl().buildBasicUrl(), HttpMethod.POST, @@ -159,9 +169,14 @@ public class ExternalVehicleApiServiceImpl implements ExternalVehicleApiService new ParameterizedTypeReference>() {} ); + // 3) 응답 로그 업데이트 (별도 트랜잭션) if (responseEntity.getStatusCode() == HttpStatus.OK && responseEntity.getBody() != null) { List data = responseEntity.getBody().getData(); if (data != null && !data.isEmpty()) { + VmisCarBassMatterInqireVO update = VmisCarBassMatterInqireVO.fromResponse(generatedId, responseEntity.getBody()); + if (update != null) { + bassMatterLogService.updateResponseNewTx(update); + } return data.get(0); } } @@ -170,6 +185,21 @@ public class ExternalVehicleApiServiceImpl implements ExternalVehicleApiService 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) + .build(); + bassMatterLogService.updateResponseNewTx(errorLog); + log.error("[EXTERNAL-BASIC-ERR-LOG] API 호출 에러 정보 저장 완료(별도TX) - ID: {}, detail: {}", generatedId, detail, e); + } catch (Exception ignore) { + log.error("[EXTERNAL-BASIC-ERR-LOG] 에러 로그 저장 실패 - ID: {}", generatedId, ignore); + } + } log.error("차량 기본정보 조회 API 호출 실패 - 차량번호: {}", request.getVhrno(), e); throw new MessageException("차량 기본정보 조회 실패: " + e.getMessage(), e); } @@ -186,17 +216,22 @@ public class ExternalVehicleApiServiceImpl implements ExternalVehicleApiService public LedgerResponse getLedgerInfo(LedgerRequest request) { log.debug("자동차 등록원부 조회 API 호출 - 차량번호: {}", request.getVhrno()); - // Envelope로 감싸기 (요청 객체는 이미 모든 필수 파라미터를 포함) - Envelope requestEnvelope = new Envelope<>(request); + String generatedId = null; + try { + // 1) 최초 요청 로그 저장 (별도 트랜잭션) + VmisCarLedgerFrmbkVO init = VmisCarLedgerFrmbkVO.fromRequest(request); + generatedId = ledgerLogService.createInitialRequestNewTx(init); - // HTTP 헤더 설정 - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); + // Envelope로 감싸기 (요청 객체는 이미 모든 필수 파라미터를 포함) + Envelope requestEnvelope = new Envelope<>(request); - HttpEntity> requestEntity = new HttpEntity<>(requestEnvelope, headers); + // HTTP 헤더 설정 + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_JSON); - try { - // API 호출 + HttpEntity> requestEntity = new HttpEntity<>(requestEnvelope, headers); + + // 2) API 호출 ResponseEntity> responseEntity = restTemplate.exchange( vmisProperties.getExternal().getApi().getUrl().buildLedgerUrl(), HttpMethod.POST, @@ -204,10 +239,19 @@ public class ExternalVehicleApiServiceImpl implements ExternalVehicleApiService new ParameterizedTypeReference>() {} ); + // 3) 응답 로그 업데이트 (마스터 + 상세, 별도 트랜잭션) if (responseEntity.getStatusCode() == HttpStatus.OK && responseEntity.getBody() != null) { List data = responseEntity.getBody().getData(); if (data != null && !data.isEmpty()) { - return data.get(0); + LedgerResponse body = data.get(0); + VmisCarLedgerFrmbkVO masterUpdate = VmisCarLedgerFrmbkVO.fromResponseMaster(generatedId, body); + ledgerLogService.updateResponseNewTx(masterUpdate); + + List details = VmisCarLedgerFrmbkDtlVO.listFromResponse(body, generatedId); + if (details != null && !details.isEmpty()) { + ledgerLogService.saveDetailsNewTx(generatedId, details); + } + return body; } } @@ -215,6 +259,21 @@ public class ExternalVehicleApiServiceImpl implements ExternalVehicleApiService return null; } catch (Exception e) { + // 4) 오류 로그 업데이트 (별도 트랜잭션) + if (generatedId != null) { + try { + String detail = ExceptionDetailUtil.buildForLog(e); + VmisCarLedgerFrmbkVO errorLog = VmisCarLedgerFrmbkVO.builder() + .carLedgerFrmbkId(generatedId) + .cntcResultCode(ApiConstant.CNTC_RESULT_CODE_ERROR) + .cntcResultDtls(detail) + .build(); + ledgerLogService.updateResponseNewTx(errorLog); + log.error("[EXTERNAL-LEDGER-ERR-LOG] API 호출 에러 정보 저장 완료(별도TX) - ID: {}, detail: {}", generatedId, detail, e); + } catch (Exception ignore) { + log.error("[EXTERNAL-LEDGER-ERR-LOG] 에러 로그 저장 실패 - ID: {}", generatedId, ignore); + } + } log.error("자동차 등록원부 조회 API 호출 실패 - 차량번호: {}", request.getVhrno(), e); throw new MessageException("자동차 등록원부 조회 실패: " + e.getMessage(), e); } diff --git a/src/main/java/go/kr/project/api/internal/service/impl/VmisCarBassMatterInqireServiceImpl.java b/src/main/java/go/kr/project/api/internal/service/impl/VmisCarBassMatterInqireServiceImpl.java index 0b82e79..f364e9b 100644 --- a/src/main/java/go/kr/project/api/internal/service/impl/VmisCarBassMatterInqireServiceImpl.java +++ b/src/main/java/go/kr/project/api/internal/service/impl/VmisCarBassMatterInqireServiceImpl.java @@ -2,7 +2,7 @@ package go.kr.project.api.internal.service.impl; import go.kr.project.api.internal.client.GovernmentApi; import go.kr.project.api.config.ApiConstant; -import go.kr.project.api.internal.service.VmisCarBassMatterInqireLogService; +import go.kr.project.api.service.VmisCarBassMatterInqireLogService; import go.kr.project.api.internal.service.VmisCarBassMatterInqireService; import go.kr.project.api.internal.service.VmisRequestEnricher; import go.kr.project.api.internal.util.ExceptionDetailUtil; diff --git a/src/main/java/go/kr/project/api/internal/service/impl/VmisCarLedgerFrmbkServiceImpl.java b/src/main/java/go/kr/project/api/internal/service/impl/VmisCarLedgerFrmbkServiceImpl.java index 6052736..2ccba3b 100644 --- a/src/main/java/go/kr/project/api/internal/service/impl/VmisCarLedgerFrmbkServiceImpl.java +++ b/src/main/java/go/kr/project/api/internal/service/impl/VmisCarLedgerFrmbkServiceImpl.java @@ -2,7 +2,7 @@ package go.kr.project.api.internal.service.impl; import go.kr.project.api.internal.client.GovernmentApi; import go.kr.project.api.config.ApiConstant; -import go.kr.project.api.internal.service.VmisCarLedgerFrmbkLogService; +import go.kr.project.api.service.VmisCarLedgerFrmbkLogService; import go.kr.project.api.internal.service.VmisCarLedgerFrmbkService; import go.kr.project.api.internal.service.VmisRequestEnricher; import go.kr.project.api.model.Envelope; diff --git a/src/main/java/go/kr/project/api/internal/service/VmisCarBassMatterInqireLogService.java b/src/main/java/go/kr/project/api/service/VmisCarBassMatterInqireLogService.java similarity index 94% rename from src/main/java/go/kr/project/api/internal/service/VmisCarBassMatterInqireLogService.java rename to src/main/java/go/kr/project/api/service/VmisCarBassMatterInqireLogService.java index 2ed94c3..9e3b22d 100644 --- a/src/main/java/go/kr/project/api/internal/service/VmisCarBassMatterInqireLogService.java +++ b/src/main/java/go/kr/project/api/service/VmisCarBassMatterInqireLogService.java @@ -1,4 +1,4 @@ -package go.kr.project.api.internal.service; +package go.kr.project.api.service; import go.kr.project.api.model.response.VmisCarBassMatterInqireVO; diff --git a/src/main/java/go/kr/project/api/internal/service/VmisCarLedgerFrmbkLogService.java b/src/main/java/go/kr/project/api/service/VmisCarLedgerFrmbkLogService.java similarity index 95% rename from src/main/java/go/kr/project/api/internal/service/VmisCarLedgerFrmbkLogService.java rename to src/main/java/go/kr/project/api/service/VmisCarLedgerFrmbkLogService.java index 841d193..52223f8 100644 --- a/src/main/java/go/kr/project/api/internal/service/VmisCarLedgerFrmbkLogService.java +++ b/src/main/java/go/kr/project/api/service/VmisCarLedgerFrmbkLogService.java @@ -1,4 +1,4 @@ -package go.kr.project.api.internal.service; +package go.kr.project.api.service; import go.kr.project.api.model.response.VmisCarLedgerFrmbkDtlVO; import go.kr.project.api.model.response.VmisCarLedgerFrmbkVO; diff --git a/src/main/java/go/kr/project/api/internal/service/impl/VmisCarBassMatterInqireLogServiceImpl.java b/src/main/java/go/kr/project/api/service/impl/VmisCarBassMatterInqireLogServiceImpl.java similarity index 95% rename from src/main/java/go/kr/project/api/internal/service/impl/VmisCarBassMatterInqireLogServiceImpl.java rename to src/main/java/go/kr/project/api/service/impl/VmisCarBassMatterInqireLogServiceImpl.java index 7632d37..71f21f5 100644 --- a/src/main/java/go/kr/project/api/internal/service/impl/VmisCarBassMatterInqireLogServiceImpl.java +++ b/src/main/java/go/kr/project/api/service/impl/VmisCarBassMatterInqireLogServiceImpl.java @@ -1,7 +1,7 @@ -package go.kr.project.api.internal.service.impl; +package go.kr.project.api.service.impl; import go.kr.project.api.internal.mapper.VmisCarBassMatterInqireMapper; -import go.kr.project.api.internal.service.VmisCarBassMatterInqireLogService; +import go.kr.project.api.service.VmisCarBassMatterInqireLogService; import go.kr.project.api.model.response.VmisCarBassMatterInqireVO; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; diff --git a/src/main/java/go/kr/project/api/internal/service/impl/VmisCarLedgerFrmbkLogServiceImpl.java b/src/main/java/go/kr/project/api/service/impl/VmisCarLedgerFrmbkLogServiceImpl.java similarity index 95% rename from src/main/java/go/kr/project/api/internal/service/impl/VmisCarLedgerFrmbkLogServiceImpl.java rename to src/main/java/go/kr/project/api/service/impl/VmisCarLedgerFrmbkLogServiceImpl.java index 7ee1b65..3f66bd0 100644 --- a/src/main/java/go/kr/project/api/internal/service/impl/VmisCarLedgerFrmbkLogServiceImpl.java +++ b/src/main/java/go/kr/project/api/service/impl/VmisCarLedgerFrmbkLogServiceImpl.java @@ -1,7 +1,7 @@ -package go.kr.project.api.internal.service.impl; +package go.kr.project.api.service.impl; import go.kr.project.api.internal.mapper.VmisCarLedgerFrmbkMapper; -import go.kr.project.api.internal.service.VmisCarLedgerFrmbkLogService; +import go.kr.project.api.service.VmisCarLedgerFrmbkLogService; import go.kr.project.api.model.response.VmisCarLedgerFrmbkDtlVO; import go.kr.project.api.model.response.VmisCarLedgerFrmbkVO; import lombok.RequiredArgsConstructor;