리팩토링 진행...

일반적인 로그 외 에러로그도 남겨야할지는 고민중...
main
박성영 1 month ago
parent 7a95540634
commit 425dd2c44d

@ -0,0 +1,21 @@
package com.vmis.interfaceapp.client;
import com.vmis.interfaceapp.model.basic.BasicRequest;
import com.vmis.interfaceapp.model.basic.BasicResponse;
import com.vmis.interfaceapp.model.common.Envelope;
import com.vmis.interfaceapp.model.ledger.LedgerRequest;
import com.vmis.interfaceapp.model.ledger.LedgerResponse;
import org.springframework.http.ResponseEntity;
/**
* API .
*
* <p>
* .</p>
*/
public interface GovernmentApi {
ResponseEntity<Envelope<BasicResponse>> callBasic(Envelope<BasicRequest> envelope);
ResponseEntity<Envelope<LedgerResponse>> callLedger(Envelope<LedgerRequest> envelope);
}

@ -6,7 +6,6 @@ import com.vmis.interfaceapp.config.properties.VmisProperties;
import com.vmis.interfaceapp.gpki.GpkiService;
import com.vmis.interfaceapp.model.basic.BasicRequest;
import com.vmis.interfaceapp.model.basic.BasicResponse;
import com.vmis.interfaceapp.model.basic.CarBassMatterInqireVO;
import com.vmis.interfaceapp.model.common.Envelope;
import com.vmis.interfaceapp.model.ledger.LedgerRequest;
import com.vmis.interfaceapp.model.ledger.LedgerResponse;
@ -60,7 +59,7 @@ import java.nio.charset.StandardCharsets;
@Slf4j
@RequiredArgsConstructor
@Component
public class GovernmentApiClient {
public class GovernmentApiClient implements GovernmentApi {
/**
* Spring RestTemplate
@ -125,12 +124,6 @@ public class GovernmentApiClient {
*/
private final ObjectMapper objectMapper;
/**
*
*
* <p>API DB .</p>
*/
private final com.vmis.interfaceapp.service.CarBassMatterInqireService carBassMatterInqireService;
/**
*
@ -322,34 +315,8 @@ public class GovernmentApiClient {
* @return ResponseEntity&lt;Envelope&lt;BasicResponse&gt;&gt;
*/
public ResponseEntity<Envelope<BasicResponse>> callBasic(Envelope<BasicRequest> envelope) {
String generatedId = null;
try {
// 1. 요청 정보 DB 저장 (첫 번째 요청만 저장)
if (envelope.getData() != null && !envelope.getData().isEmpty()) {
com.vmis.interfaceapp.model.basic.BasicRequest request = envelope.getData().get(0);
generatedId = saveRequestLog(request);
log.info("[BASIC-REQ-LOG] 요청 정보 저장 완료 - ID: {}, 차량번호: {}", generatedId, request.getVhrno());
}
// 2. 정부 API 호출
ResponseEntity<Envelope<BasicResponse>> response = callModel(ServiceType.BASIC, envelope, new TypeReference<Envelope<BasicResponse>>(){});
// 3. 응답 정보 DB 업데이트
if (generatedId != null && response.getBody() != null) {
updateResponseLog(generatedId, response.getBody());
log.info("[BASIC-RES-LOG] 응답 정보 저장 완료 - ID: {}", generatedId);
}
return response;
} catch (Exception e) {
// 4. 에러 발생 시 에러 정보 DB 업데이트
if (generatedId != null) {
updateErrorLog(generatedId, e);
}
throw e;
}
// 순수한 전송 책임만 수행: DB 로깅은 서비스 레이어에서 처리
return callModel(ServiceType.BASIC, envelope, new TypeReference<Envelope<BasicResponse>>(){});
}
/**
@ -657,174 +624,4 @@ public class GovernmentApiClient {
}
}
/**
* DB
*
* @param request
* @return ID
*/
private String saveRequestLog(com.vmis.interfaceapp.model.basic.BasicRequest request) {
CarBassMatterInqireVO logEntity = CarBassMatterInqireVO.builder()
.infoSysId(request.getInfoSysId())
.infoSysIp(request.getInfoSysIp())
.sigunguCode(request.getSigunguCode())
.cntcInfoCode(request.getCntcInfoCode())
.chargerId(request.getChargerId())
.chargerIp(request.getChargerIp())
.chargerNm(request.getChargerNm())
.dmndLevyStdde(request.getLevyStdde())
.dmndInqireSeCode(request.getInqireSeCode())
.dmndVhrno(request.getVhrno())
.dmndVin(request.getVin())
.rgtr("SYSTEM")
.build();
return carBassMatterInqireService.createInitialRequest(logEntity);
}
/**
* DB
*
* @param id ID
* @param envelope
*/
private void updateResponseLog(String id, Envelope<com.vmis.interfaceapp.model.basic.BasicResponse> envelope) {
com.vmis.interfaceapp.model.basic.BasicResponse response = envelope.getData() != null && !envelope.getData().isEmpty()
? envelope.getData().get(0)
: null;
if (response == null) {
log.warn("[BASIC-RES-LOG] 응답 데이터가 없습니다 - ID: {}", id);
return;
}
// Builder 패턴으로 응답 정보 매핑
CarBassMatterInqireVO.CarBassMatterInqireVOBuilder builder = CarBassMatterInqireVO.builder()
.carBassMatterInqire(id)
.cntcResultCode(response.getCntcResultCode())
.cntcResultDtls(response.getCntcResultDtls());
// record가 있으면 첫 번째 record의 정보를 매핑
if (response.getRecord() != null && !response.getRecord().isEmpty()) {
com.vmis.interfaceapp.model.basic.BasicResponse.Record record = response.getRecord().get(0);
mapRecordToEntity(builder, record);
}
carBassMatterInqireService.updateResponse(builder.build());
}
/**
* Record Entity
*
* @param builder Entity Builder
* @param record Record
*/
private void mapRecordToEntity(CarBassMatterInqireVO.CarBassMatterInqireVOBuilder builder, com.vmis.interfaceapp.model.basic.BasicResponse.Record record) {
builder
.prye(record.getPrye())
.registDe(record.getRegistDe())
.ersrRegistSeCode(record.getErsrRegistSeCode())
.ersrRegistSeNm(record.getErsrRegistSeNm())
.ersrRegistDe(record.getErsrRegistDe())
.registDetailCode(record.getRegistDetailCode())
.dsplvl(record.getDsplvl())
.useStrnghldLegaldongCode(record.getUseStrnghldLegaldongCode())
.useStrnghldAdstrdCode(record.getUseStrnghldAdstrdCode())
.useStrnghldMntn(record.getUseStrnghldMntn())
.useStrnghldLnbr(record.getUseStrnghldLnbr())
.useStrnghldHo(record.getUseStrnghldHo())
.useStrnghldAdresNm(record.getUseStrnghldAdresNm())
.useStrnghldRoadNmCode(record.getUseStrnghldRoadNmCode())
.usgsrhldUndgrndBuldSeCode(record.getUsgsrhldUndgrndBuldSeCode())
.useStrnghldBuldMainNo(record.getUseStrnghldBuldMainNo())
.useStrnghldBuldSubNo(record.getUseStrnghldBuldSubNo())
.usgsrhldAdresFull(record.getUsgsrhldAdresFull())
.mberSeCode(record.getMberSeCode())
.mberSeNo(record.getMberSeNo())
.mberNm(record.getMberNm())
.telno(record.getTelno())
.ownerLegaldongCode(record.getOwnerLegaldongCode())
.ownerAdstrdCode(record.getOwnerAdstrdCode())
.ownerMntn(record.getOwnerMntn())
.ownerLnbr(record.getOwnerLnbr())
.ownerHo(record.getOwnerHo())
.ownerAdresNm(record.getOwnerAdresNm())
.ownerRoadNmCode(record.getOwnerRoadNmCode())
.ownerUndgrndBuldSeCode(record.getOwnerUndgrndBuldSeCode())
.ownerBuldMainNo(record.getOwnerBuldMainNo())
.ownerBuldSubNo(record.getOwnerBuldSubNo())
.ownrWholaddr(record.getOwnerAdresFull())
.aftrVhrno(record.getAftrVhrno())
.useFuelCode(record.getUseFuelCode())
.prposSeCode(record.getPrposSeCode())
.mtrsFomNm(record.getMtrsFomNm())
.frntVhrno(record.getFrntVhrno())
.vhclno(record.getVhrno())
.vin(record.getVin())
.cnm(record.getCnm())
.vhcleTotWt(record.getVhcleTotWt())
.caagEndde(record.getCaagEndde())
.changeDe(record.getChangeDe())
.vhctyAsortCode(record.getVhctyAsortCode())
.vhctyTyCode(record.getVhctyTyCode())
.vhctySeCode(record.getVhctySeCode())
.mxmmLdg(record.getMxmmLdg())
.vhctyAsortNm(record.getVhctyAsortNm())
.vhctyTyNm(record.getVhctyTyNm())
.vhctySeNm(record.getVhctySeNm())
.frstRegistDe(record.getFrstRegistDe())
.fomNm(record.getFomNm())
.acqsDe(record.getAcqsDe())
.acqsEndDe(record.getAcqsEndDe())
.yblMd(record.getYblMd())
.transrRegistDe(record.getTransrRegistDe())
.spcfRegistSttusCode(record.getSpcfRegistSttusCode())
.colorNm(record.getColorNm())
.mrtgCo(record.getMrtgCo())
.seizrCo(record.getSeizrCo())
.stmdCo(record.getStmdCo())
.nmplCsdyAt(record.getNmplCsdyAt())
.nmplCsdyRemnrDe(record.getNmplCsdyRemnrDe())
.originSeCode(record.getOriginSeCode())
.nmplStndrdCode(record.getNmplStndrdCode())
.acqsAmount(record.getAcqsAmount())
.insptValidPdBgnde(record.getInsptValidPdBgnde())
.insptValidPdEndde(record.getInsptValidPdEndde())
.useStrnghldGrcCode(record.getUseStrnghldGrcCode())
.tkcarPscapCo(record.getTkcarPscapCo())
.spmnno(record.getSpmnno())
.trvlDstnc(record.getTrvlDstnc())
.frstRegistRqrcno(record.getFrstRegistRqrcno())
.vlntErsrPrvntcNticeDe(record.getVlntErsrPrvntcNticeDe())
.registInsttNm(record.getRegistInsttNm())
.processImprtyResnCode(record.getProcessImprtyResnCode())
.processImprtyResnDtls(record.getProcessImprtyResnDtls())
.cbdLt(record.getCbdLt())
.cbdBt(record.getCbdBt())
.cbdHg(record.getCbdHg())
.frstMxmmLdg(record.getFrstMxmmLdg())
.fuelCnsmpRt(record.getFuelCnsmpRt())
.elctyCmpndFuelCnsmpRt(record.getElctyCmpndFuelCnsmpRt());
}
/**
* DB
*
* @param id ID
* @param exception
*/
private void updateErrorLog(String id, Exception exception) {
try {
CarBassMatterInqireVO errorLog = CarBassMatterInqireVO.builder()
.carBassMatterInqire(id)
.cntcResultCode("99")
.cntcResultDtls("오류: " + exception.getMessage())
.build();
carBassMatterInqireService.updateResponse(errorLog);
log.error("[BASIC-ERR-LOG] API 호출 에러 정보 저장 완료 - ID: {}", id, exception);
} catch (Exception e) {
log.error("[BASIC-ERR-LOG] 에러 로그 저장 실패 - ID: {}", id, e);
}
}
}

@ -1,12 +1,11 @@
package com.vmis.interfaceapp.controller;
import com.vmis.interfaceapp.client.GovernmentApiClient;
import com.vmis.interfaceapp.model.basic.BasicRequest;
import com.vmis.interfaceapp.model.basic.BasicResponse;
import com.vmis.interfaceapp.model.common.Envelope;
import com.vmis.interfaceapp.model.ledger.LedgerRequest;
import com.vmis.interfaceapp.model.ledger.LedgerResponse;
import com.vmis.interfaceapp.service.RequestEnricher;
import com.vmis.interfaceapp.service.VehicleInterfaceService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.media.ExampleObject;
@ -42,11 +41,10 @@ import org.springframework.web.bind.annotation.*;
* <h3> :</h3>
* <ul>
* <li> (Thin) </li>
* <li> {@link GovernmentApiClient} </li>
* <li> {@link com.vmis.interfaceapp.service.VehicleInterfaceService} </li>
* <li>Swagger/OpenAPI </li>
* </ul>
*
* @see GovernmentApiClient
* @see Envelope
*/
@RestController
@ -56,24 +54,8 @@ import org.springframework.web.bind.annotation.*;
@Tag(name = "Vehicle Interfaces", description = "시군구연계 자동차 정보 연계 API")
public class VehicleInterfaceController {
private final RequestEnricher enricher;
private final VehicleInterfaceService vehicleService;
/**
* API
*
* <p> .
* :</p>
* <ul>
* <li>HTTP / </li>
* <li>GPKI /</li>
* <li> </li>
* <li> </li>
* </ul>
*
* <p> (Constructor Injection) ,
* final .</p>
*/
private final GovernmentApiClient govClient;
/**
* API
@ -149,10 +131,8 @@ public class VehicleInterfaceController {
public ResponseEntity<Envelope<BasicResponse>> basic(
@org.springframework.web.bind.annotation.RequestBody Envelope<BasicRequest> envelope
) {
// YAML 설정값으로 공통 필드 자동 채움
enricher.enrichBasic(envelope);
// 실제 처리는 GovernmentApiClient에 위임
return govClient.callBasic(envelope);
// 서비스에서 요청 보강/로깅/호출을 모두 오케스트레이션
return vehicleService.basic(envelope);
}
/**
@ -247,9 +227,7 @@ public class VehicleInterfaceController {
public ResponseEntity<Envelope<LedgerResponse>> ledger(
@org.springframework.web.bind.annotation.RequestBody Envelope<LedgerRequest> envelope
) {
// YAML 설정값으로 공통 필드 자동 채움
enricher.enrichLedger(envelope);
// 실제 처리는 GovernmentApiClient에 위임
return govClient.callLedger(envelope);
// 서비스에서 요청 보강/호출을 오케스트레이션
return vehicleService.ledger(envelope);
}
}

@ -1,26 +0,0 @@
package com.vmis.interfaceapp.mapper;
import org.apache.ibatis.annotations.Mapper;
/**
* MyBatis Mapper
*
* <p> MyBatis .
* Mapper .</p>
*
* <p>@Mapper Spring .
* XML namespace .</p>
*/
@Mapper
public interface SampleMapper {
/**
*
*
* <p>
* .</p>
*
* @return
*/
String selectCurrentTime();
}

@ -0,0 +1,228 @@
package com.vmis.interfaceapp.service;
import com.fasterxml.jackson.core.type.TypeReference;
import com.vmis.interfaceapp.client.GovernmentApi;
import com.vmis.interfaceapp.model.basic.BasicRequest;
import com.vmis.interfaceapp.model.basic.BasicResponse;
import com.vmis.interfaceapp.model.basic.CarBassMatterInqireVO;
import com.vmis.interfaceapp.model.common.Envelope;
import com.vmis.interfaceapp.model.ledger.LedgerRequest;
import com.vmis.interfaceapp.model.ledger.LedgerResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* : - .
* - (RequestEnricher)
* - / DB (CarBassMatterInqire)
* - API (GovernmentApi)
*/
@Slf4j
@Service
@RequiredArgsConstructor
public class VehicleInterfaceService {
private final GovernmentApi governmentApi;
private final RequestEnricher enricher;
private final CarBassMatterInqireService carBassMatterInqireService;
/**
* : -> -> -> .
*/
@Transactional
public ResponseEntity<Envelope<BasicResponse>> basic(Envelope<BasicRequest> envelope) {
// 1) 요청 보강
enricher.enrichBasic(envelope);
String generatedId = null;
try {
// 2) 최초 요청 로그 저장 (첫 번째 데이터 기준)
if (envelope.getData() != null && !envelope.getData().isEmpty()) {
BasicRequest req = envelope.getData().get(0);
CarBassMatterInqireVO logEntity = mapInitialLog(req);
generatedId = carBassMatterInqireService.createInitialRequest(logEntity);
log.info("[BASIC-REQ-LOG] 요청 정보 저장 완료 - ID: {}, 차량번호: {}", generatedId, req.getVhrno());
}
// 3) 외부 API 호출
ResponseEntity<Envelope<BasicResponse>> response = governmentApi.callBasic(envelope);
// 4) 응답 로그 업데이트
// 원본 소스, 정상적인 호출, 리턴(에러 리턴포함) 일 경우에만 에러 로그 남김
if (generatedId != null && response.getBody() != null) {
CarBassMatterInqireVO update = mapResponseLog(generatedId, response.getBody());
if (update != null) {
carBassMatterInqireService.updateResponse(update);
log.info("[BASIC-RES-LOG] 응답 정보 저장 완료 - ID: {}", generatedId);
}
}
return response;
} catch (Exception e) {
// 5) 오류 로그 업데이트
if (generatedId != null) {
try {
String detail = buildExceptionDetail(e);
CarBassMatterInqireVO errorLog = CarBassMatterInqireVO.builder()
.carBassMatterInqire(generatedId)
.cntcResultCode("99")
.cntcResultDtls(detail)
.build();
carBassMatterInqireService.updateResponse(errorLog);
log.error("[BASIC-ERR-LOG] API 호출 에러 정보 저장 완료 - ID: {}, detail: {}", generatedId, detail, e);
} catch (Exception ignore) {
log.error("[BASIC-ERR-LOG] 에러 로그 저장 실패 - ID: {}", generatedId, ignore);
}
}
throw e;
}
}
/**
* () : -> . ( )
*/
public ResponseEntity<Envelope<LedgerResponse>> ledger(Envelope<LedgerRequest> envelope) {
enricher.enrichLedger(envelope);
return governmentApi.callLedger(envelope);
}
private CarBassMatterInqireVO mapInitialLog(BasicRequest request) {
return CarBassMatterInqireVO.builder()
.infoSysId(request.getInfoSysId())
.infoSysIp(request.getInfoSysIp())
.sigunguCode(request.getSigunguCode())
.cntcInfoCode(request.getCntcInfoCode())
.chargerId(request.getChargerId())
.chargerIp(request.getChargerIp())
.chargerNm(request.getChargerNm())
.dmndLevyStdde(request.getLevyStdde())
.dmndInqireSeCode(request.getInqireSeCode())
.dmndVhrno(request.getVhrno())
.dmndVin(request.getVin())
.rgtr("SYSTEM")
.build();
}
private CarBassMatterInqireVO mapResponseLog(String id, Envelope<BasicResponse> envelope) {
if (envelope.getData() == null || envelope.getData().isEmpty()) return null;
BasicResponse response = envelope.getData().get(0);
CarBassMatterInqireVO.CarBassMatterInqireVOBuilder builder = CarBassMatterInqireVO.builder()
.carBassMatterInqire(id)
.cntcResultCode(response.getCntcResultCode())
.cntcResultDtls(response.getCntcResultDtls());
if (response.getRecord() != null && !response.getRecord().isEmpty()) {
BasicResponse.Record record = response.getRecord().get(0);
mapRecordToEntity(builder, record);
}
return builder.build();
}
private void mapRecordToEntity(CarBassMatterInqireVO.CarBassMatterInqireVOBuilder builder, BasicResponse.Record record) {
builder
.prye(record.getPrye())
.registDe(record.getRegistDe())
.ersrRegistSeCode(record.getErsrRegistSeCode())
.ersrRegistSeNm(record.getErsrRegistSeNm())
.ersrRegistDe(record.getErsrRegistDe())
.registDetailCode(record.getRegistDetailCode())
.dsplvl(record.getDsplvl())
.useStrnghldLegaldongCode(record.getUseStrnghldLegaldongCode())
.useStrnghldAdstrdCode(record.getUseStrnghldAdstrdCode())
.useStrnghldMntn(record.getUseStrnghldMntn())
.useStrnghldLnbr(record.getUseStrnghldLnbr())
.useStrnghldHo(record.getUseStrnghldHo())
.useStrnghldAdresNm(record.getUseStrnghldAdresNm())
.useStrnghldRoadNmCode(record.getUseStrnghldRoadNmCode())
.usgsrhldUndgrndBuldSeCode(record.getUsgsrhldUndgrndBuldSeCode())
.useStrnghldBuldMainNo(record.getUseStrnghldBuldMainNo())
.useStrnghldBuldSubNo(record.getUseStrnghldBuldSubNo())
.usgsrhldAdresFull(record.getUsgsrhldAdresFull())
.mberSeCode(record.getMberSeCode())
.mberSeNo(record.getMberSeNo())
.mberNm(record.getMberNm())
.telno(record.getTelno())
.ownerLegaldongCode(record.getOwnerLegaldongCode())
.ownerAdstrdCode(record.getOwnerAdstrdCode())
.ownerMntn(record.getOwnerMntn())
.ownerLnbr(record.getOwnerLnbr())
.ownerHo(record.getOwnerHo())
.ownerAdresNm(record.getOwnerAdresNm())
.ownerRoadNmCode(record.getOwnerRoadNmCode())
.ownerUndgrndBuldSeCode(record.getOwnerUndgrndBuldSeCode())
.ownerBuldMainNo(record.getOwnerBuldMainNo())
.ownerBuldSubNo(record.getOwnerBuldSubNo())
.ownrWholaddr(record.getOwnerAdresFull())
.aftrVhrno(record.getAftrVhrno())
.useFuelCode(record.getUseFuelCode())
.prposSeCode(record.getPrposSeCode())
.mtrsFomNm(record.getMtrsFomNm())
.frntVhrno(record.getFrntVhrno())
.vhclno(record.getVhrno())
.vin(record.getVin())
.cnm(record.getCnm())
.vhcleTotWt(record.getVhcleTotWt())
.caagEndde(record.getCaagEndde())
.changeDe(record.getChangeDe())
.vhctyAsortCode(record.getVhctyAsortCode())
.vhctyTyCode(record.getVhctyTyCode())
.vhctySeCode(record.getVhctySeCode())
.mxmmLdg(record.getMxmmLdg())
.vhctyAsortNm(record.getVhctyAsortNm())
.vhctyTyNm(record.getVhctyTyNm())
.vhctySeNm(record.getVhctySeNm())
.frstRegistDe(record.getFrstRegistDe())
.fomNm(record.getFomNm())
.acqsDe(record.getAcqsDe())
.acqsEndDe(record.getAcqsEndDe())
.yblMd(record.getYblMd())
.transrRegistDe(record.getTransrRegistDe())
.spcfRegistSttusCode(record.getSpcfRegistSttusCode())
.colorNm(record.getColorNm())
.mrtgCo(record.getMrtgCo())
.seizrCo(record.getSeizrCo())
.stmdCo(record.getStmdCo())
.nmplCsdyAt(record.getNmplCsdyAt())
.nmplCsdyRemnrDe(record.getNmplCsdyRemnrDe())
.originSeCode(record.getOriginSeCode())
.nmplStndrdCode(record.getNmplStndrdCode())
.acqsAmount(record.getAcqsAmount())
.insptValidPdBgnde(record.getInsptValidPdBgnde())
.insptValidPdEndde(record.getInsptValidPdEndde())
.useStrnghldGrcCode(record.getUseStrnghldGrcCode())
.tkcarPscapCo(record.getTkcarPscapCo())
.spmnno(record.getSpmnno())
.trvlDstnc(record.getTrvlDstnc())
.frstRegistRqrcno(record.getFrstRegistRqrcno())
.vlntErsrPrvntcNticeDe(record.getVlntErsrPrvntcNticeDe())
.registInsttNm(record.getRegistInsttNm())
.processImprtyResnCode(record.getProcessImprtyResnCode())
.processImprtyResnDtls(record.getProcessImprtyResnDtls())
.cbdLt(record.getCbdLt())
.cbdBt(record.getCbdBt())
.cbdHg(record.getCbdHg())
.frstMxmmLdg(record.getFrstMxmmLdg())
.fuelCnsmpRt(record.getFuelCnsmpRt())
.elctyCmpndFuelCnsmpRt(record.getElctyCmpndFuelCnsmpRt());
}
private String buildExceptionDetail(Throwable t) {
if (t == null) return "오류: unknown";
Throwable root = t;
int guard = 0;
while (root.getCause() != null && root.getCause() != root && guard++ < 20) {
root = root.getCause();
}
String className = root.getClass().getName();
String message = root.getMessage();
String detail = (message != null && !message.isEmpty()) ? (className + ": " + message) : root.toString();
// DB 컬럼(CNTC_RESULT_DTLS) 길이: 200
if (detail.length() > 200) {
detail = detail.substring(0, 200);
}
return detail;
}
}

@ -1,44 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--
샘플 MyBatis Mapper XML 파일
실제 사용 시에는 테이블명과 컬럼명을 프로젝트에 맞게 수정하세요.
이 파일은 설정 테스트 및 예제 용도입니다.
-->
<mapper namespace="com.vmis.interfaceapp.mapper.SampleMapper">
<!-- 샘플 쿼리: 데이터베이스 연결 테스트 -->
<select id="selectCurrentTime" resultType="String">
SELECT NOW() AS current_time
</select>
<!--
추가 쿼리 예제:
<select id="selectById" parameterType="Long" resultType="com.vmis.interfaceapp.model.SampleEntity">
SELECT id, name, created_at
FROM sample_table
WHERE id = #{id}
</select>
<insert id="insert" parameterType="com.vmis.interfaceapp.model.SampleEntity">
INSERT INTO sample_table (name, created_at)
VALUES (#{name}, NOW())
</insert>
<update id="update" parameterType="com.vmis.interfaceapp.model.SampleEntity">
UPDATE sample_table
SET name = #{name}
WHERE id = #{id}
</update>
<delete id="delete" parameterType="Long">
DELETE FROM sample_table
WHERE id = #{id}
</delete>
-->
</mapper>
Loading…
Cancel
Save