external api 호출시에도 log 저장

internalApi
박성영 1 month ago
parent 9b8df93144
commit 06830112b1

@ -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<VehicleApiResponseVO> getVehiclesInfo(List<String> vehicleNumbers) {
@ -141,17 +146,22 @@ public class ExternalVehicleApiServiceImpl implements ExternalVehicleApiService
public BasicResponse getBasicInfo(BasicRequest request) {
log.debug("차량 기본정보 조회 API 호출 - 차량번호: {}", request.getVhrno());
// Envelope로 감싸기 (요청 객체는 이미 모든 필수 파라미터를 포함)
Envelope<BasicRequest> 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<BasicRequest> requestEnvelope = new Envelope<>(request);
HttpEntity<Envelope<BasicRequest>> requestEntity = new HttpEntity<>(requestEnvelope, headers);
// HTTP 헤더 설정
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
try {
// API 호출
HttpEntity<Envelope<BasicRequest>> requestEntity = new HttpEntity<>(requestEnvelope, headers);
// 2) API 호출
ResponseEntity<Envelope<BasicResponse>> responseEntity = restTemplate.exchange(
vmisProperties.getExternal().getApi().getUrl().buildBasicUrl(),
HttpMethod.POST,
@ -159,9 +169,14 @@ public class ExternalVehicleApiServiceImpl implements ExternalVehicleApiService
new ParameterizedTypeReference<Envelope<BasicResponse>>() {}
);
// 3) 응답 로그 업데이트 (별도 트랜잭션)
if (responseEntity.getStatusCode() == HttpStatus.OK && responseEntity.getBody() != null) {
List<BasicResponse> 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<LedgerRequest> 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<LedgerRequest> requestEnvelope = new Envelope<>(request);
HttpEntity<Envelope<LedgerRequest>> requestEntity = new HttpEntity<>(requestEnvelope, headers);
// HTTP 헤더 설정
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
try {
// API 호출
HttpEntity<Envelope<LedgerRequest>> requestEntity = new HttpEntity<>(requestEnvelope, headers);
// 2) API 호출
ResponseEntity<Envelope<LedgerResponse>> responseEntity = restTemplate.exchange(
vmisProperties.getExternal().getApi().getUrl().buildLedgerUrl(),
HttpMethod.POST,
@ -204,10 +239,19 @@ public class ExternalVehicleApiServiceImpl implements ExternalVehicleApiService
new ParameterizedTypeReference<Envelope<LedgerResponse>>() {}
);
// 3) 응답 로그 업데이트 (마스터 + 상세, 별도 트랜잭션)
if (responseEntity.getStatusCode() == HttpStatus.OK && responseEntity.getBody() != null) {
List<LedgerResponse> 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<VmisCarLedgerFrmbkDtlVO> 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);
}

@ -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;

@ -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;

@ -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;

@ -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;

@ -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;

@ -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;
Loading…
Cancel
Save