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 egovframework.exception.MessageException;
import go.kr.project.api.config.ApiConstant; import go.kr.project.api.config.ApiConstant;
import go.kr.project.api.external.service.ExternalVehicleApiService; 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.BasicRequest;
import go.kr.project.api.model.request.LedgerRequest; import go.kr.project.api.model.request.LedgerRequest;
import go.kr.project.api.model.*; import go.kr.project.api.model.*;
import go.kr.project.api.model.response.*; 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.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.core.ParameterizedTypeReference; import org.springframework.core.ParameterizedTypeReference;
@ -29,6 +32,8 @@ public class ExternalVehicleApiServiceImpl implements ExternalVehicleApiService
private final RestTemplate restTemplate; private final RestTemplate restTemplate;
private final VmisProperties vmisProperties; // 프로퍼티 주입 (외부 API URL 구성에 사용) private final VmisProperties vmisProperties; // 프로퍼티 주입 (외부 API URL 구성에 사용)
private final VmisCarBassMatterInqireLogService bassMatterLogService; // 기본사항 조회 로그 서비스
private final VmisCarLedgerFrmbkLogService ledgerLogService; // 등록원부 로그 서비스
@Override @Override
public List<VehicleApiResponseVO> getVehiclesInfo(List<String> vehicleNumbers) { public List<VehicleApiResponseVO> getVehiclesInfo(List<String> vehicleNumbers) {
@ -141,17 +146,22 @@ public class ExternalVehicleApiServiceImpl implements ExternalVehicleApiService
public BasicResponse getBasicInfo(BasicRequest request) { public BasicResponse getBasicInfo(BasicRequest request) {
log.debug("차량 기본정보 조회 API 호출 - 차량번호: {}", request.getVhrno()); log.debug("차량 기본정보 조회 API 호출 - 차량번호: {}", request.getVhrno());
// Envelope로 감싸기 (요청 객체는 이미 모든 필수 파라미터를 포함) String generatedId = null;
Envelope<BasicRequest> requestEnvelope = new Envelope<>(request); try {
// 1) 최초 요청 로그 저장 (별도 트랜잭션)
VmisCarBassMatterInqireVO logEntity = VmisCarBassMatterInqireVO.fromRequest(request);
generatedId = bassMatterLogService.createInitialRequestNewTx(logEntity);
// HTTP 헤더 설정 // Envelope로 감싸기 (요청 객체는 이미 모든 필수 파라미터를 포함)
HttpHeaders headers = new HttpHeaders(); Envelope<BasicRequest> requestEnvelope = new Envelope<>(request);
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<Envelope<BasicRequest>> requestEntity = new HttpEntity<>(requestEnvelope, headers); // HTTP 헤더 설정
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
try { HttpEntity<Envelope<BasicRequest>> requestEntity = new HttpEntity<>(requestEnvelope, headers);
// API 호출
// 2) API 호출
ResponseEntity<Envelope<BasicResponse>> responseEntity = restTemplate.exchange( ResponseEntity<Envelope<BasicResponse>> responseEntity = restTemplate.exchange(
vmisProperties.getExternal().getApi().getUrl().buildBasicUrl(), vmisProperties.getExternal().getApi().getUrl().buildBasicUrl(),
HttpMethod.POST, HttpMethod.POST,
@ -159,9 +169,14 @@ public class ExternalVehicleApiServiceImpl implements ExternalVehicleApiService
new ParameterizedTypeReference<Envelope<BasicResponse>>() {} new ParameterizedTypeReference<Envelope<BasicResponse>>() {}
); );
// 3) 응답 로그 업데이트 (별도 트랜잭션)
if (responseEntity.getStatusCode() == HttpStatus.OK && responseEntity.getBody() != null) { if (responseEntity.getStatusCode() == HttpStatus.OK && responseEntity.getBody() != null) {
List<BasicResponse> data = responseEntity.getBody().getData(); List<BasicResponse> data = responseEntity.getBody().getData();
if (data != null && !data.isEmpty()) { if (data != null && !data.isEmpty()) {
VmisCarBassMatterInqireVO update = VmisCarBassMatterInqireVO.fromResponse(generatedId, responseEntity.getBody());
if (update != null) {
bassMatterLogService.updateResponseNewTx(update);
}
return data.get(0); return data.get(0);
} }
} }
@ -170,6 +185,21 @@ public class ExternalVehicleApiServiceImpl implements ExternalVehicleApiService
return null; return null;
} catch (Exception e) { } 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); log.error("차량 기본정보 조회 API 호출 실패 - 차량번호: {}", request.getVhrno(), e);
throw new MessageException("차량 기본정보 조회 실패: " + e.getMessage(), e); throw new MessageException("차량 기본정보 조회 실패: " + e.getMessage(), e);
} }
@ -186,17 +216,22 @@ public class ExternalVehicleApiServiceImpl implements ExternalVehicleApiService
public LedgerResponse getLedgerInfo(LedgerRequest request) { public LedgerResponse getLedgerInfo(LedgerRequest request) {
log.debug("자동차 등록원부 조회 API 호출 - 차량번호: {}", request.getVhrno()); log.debug("자동차 등록원부 조회 API 호출 - 차량번호: {}", request.getVhrno());
// Envelope로 감싸기 (요청 객체는 이미 모든 필수 파라미터를 포함) String generatedId = null;
Envelope<LedgerRequest> requestEnvelope = new Envelope<>(request); try {
// 1) 최초 요청 로그 저장 (별도 트랜잭션)
VmisCarLedgerFrmbkVO init = VmisCarLedgerFrmbkVO.fromRequest(request);
generatedId = ledgerLogService.createInitialRequestNewTx(init);
// HTTP 헤더 설정 // Envelope로 감싸기 (요청 객체는 이미 모든 필수 파라미터를 포함)
HttpHeaders headers = new HttpHeaders(); Envelope<LedgerRequest> requestEnvelope = new Envelope<>(request);
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<Envelope<LedgerRequest>> requestEntity = new HttpEntity<>(requestEnvelope, headers); // HTTP 헤더 설정
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
try { HttpEntity<Envelope<LedgerRequest>> requestEntity = new HttpEntity<>(requestEnvelope, headers);
// API 호출
// 2) API 호출
ResponseEntity<Envelope<LedgerResponse>> responseEntity = restTemplate.exchange( ResponseEntity<Envelope<LedgerResponse>> responseEntity = restTemplate.exchange(
vmisProperties.getExternal().getApi().getUrl().buildLedgerUrl(), vmisProperties.getExternal().getApi().getUrl().buildLedgerUrl(),
HttpMethod.POST, HttpMethod.POST,
@ -204,10 +239,19 @@ public class ExternalVehicleApiServiceImpl implements ExternalVehicleApiService
new ParameterizedTypeReference<Envelope<LedgerResponse>>() {} new ParameterizedTypeReference<Envelope<LedgerResponse>>() {}
); );
// 3) 응답 로그 업데이트 (마스터 + 상세, 별도 트랜잭션)
if (responseEntity.getStatusCode() == HttpStatus.OK && responseEntity.getBody() != null) { if (responseEntity.getStatusCode() == HttpStatus.OK && responseEntity.getBody() != null) {
List<LedgerResponse> data = responseEntity.getBody().getData(); List<LedgerResponse> data = responseEntity.getBody().getData();
if (data != null && !data.isEmpty()) { 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; return null;
} catch (Exception e) { } 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); log.error("자동차 등록원부 조회 API 호출 실패 - 차량번호: {}", request.getVhrno(), e);
throw new MessageException("자동차 등록원부 조회 실패: " + e.getMessage(), 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.internal.client.GovernmentApi;
import go.kr.project.api.config.ApiConstant; 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.VmisCarBassMatterInqireService;
import go.kr.project.api.internal.service.VmisRequestEnricher; import go.kr.project.api.internal.service.VmisRequestEnricher;
import go.kr.project.api.internal.util.ExceptionDetailUtil; 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.internal.client.GovernmentApi;
import go.kr.project.api.config.ApiConstant; 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.VmisCarLedgerFrmbkService;
import go.kr.project.api.internal.service.VmisRequestEnricher; import go.kr.project.api.internal.service.VmisRequestEnricher;
import go.kr.project.api.model.Envelope; 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; 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.VmisCarLedgerFrmbkDtlVO;
import go.kr.project.api.model.response.VmisCarLedgerFrmbkVO; 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.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 go.kr.project.api.model.response.VmisCarBassMatterInqireVO;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; 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.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.VmisCarLedgerFrmbkDtlVO;
import go.kr.project.api.model.response.VmisCarLedgerFrmbkVO; import go.kr.project.api.model.response.VmisCarLedgerFrmbkVO;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
Loading…
Cancel
Save