From b16a7ecc07f5cc677cc8b9a25223001b59e94a82 Mon Sep 17 00:00:00 2001 From: daekuk Date: Wed, 28 Jan 2026 10:49:08 +0900 Subject: [PATCH] =?UTF-8?q?-=20=EC=96=B4=EB=8C=91=ED=84=B0=20=ED=94=84?= =?UTF-8?q?=EB=9D=BC=ED=8D=BC=ED=8B=B0=20"API=5FPATH"=20=EC=9D=98=20?= =?UTF-8?q?=EA=B0=92=20=EB=B3=80=EA=B2=BD=EC=8B=9C=20HS04=20Table=EC=9D=98?= =?UTF-8?q?=20"APIFULLPATH"=20=EB=8F=84=20=EC=97=85=EB=8D=B0=EC=9D=B4?= =?UTF-8?q?=ED=8A=B8=20=EB=90=98=EB=8F=84=EB=A1=9D=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../onl/adapter/AdapterGroupService.java | 4 + .../StandardMessageInfoService.java | 14 ++ .../adapter/adapter/AdapterManService.java | 160 +++++++++++++++++- 3 files changed, 174 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/eactive/eai/rms/data/entity/onl/adapter/AdapterGroupService.java b/src/main/java/com/eactive/eai/rms/data/entity/onl/adapter/AdapterGroupService.java index 9d0ab0e..1ec9d3c 100644 --- a/src/main/java/com/eactive/eai/rms/data/entity/onl/adapter/AdapterGroupService.java +++ b/src/main/java/com/eactive/eai/rms/data/entity/onl/adapter/AdapterGroupService.java @@ -245,4 +245,8 @@ public class AdapterGroupService extends AbstractDataService findByBzwksvckeynameStartingWith(String adapterName) { + QStandardMessageInfo qStandardMessageInfo = QStandardMessageInfo.standardMessageInfo; + + return getJPAQueryFactory() + .selectFrom(qStandardMessageInfo) + .where(qStandardMessageInfo.bzwksvckeyname.startsWith(adapterName)) + .fetch(); + } + + public StandardMessageInfo saveAndFlush(StandardMessageInfo stdMsgInfo) { + return repository.saveAndFlush(stdMsgInfo); + } } diff --git a/src/main/java/com/eactive/eai/rms/onl/manage/adapter/adapter/AdapterManService.java b/src/main/java/com/eactive/eai/rms/onl/manage/adapter/adapter/AdapterManService.java index 75c4f22..9b782ce 100644 --- a/src/main/java/com/eactive/eai/rms/onl/manage/adapter/adapter/AdapterManService.java +++ b/src/main/java/com/eactive/eai/rms/onl/manage/adapter/adapter/AdapterManService.java @@ -23,10 +23,15 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; +import com.eactive.eai.agent.command.Command; import com.eactive.eai.agent.command.CommonCommand; +import com.eactive.eai.common.stdmessage.STDMessageManager; import com.eactive.eai.data.entity.onl.adapter.Adapter; import com.eactive.eai.data.entity.onl.adapter.AdapterGroup; +import com.eactive.eai.data.entity.onl.adapter.AdapterProp; import com.eactive.eai.data.entity.onl.adapter.AdapterPropGroup; +import com.eactive.eai.data.entity.onl.stdmessage.StandardMessageInfo; +import com.eactive.eai.data.jpa.BaseRepository; import com.eactive.eai.rms.common.acl.monitoringCode.MonitoringCodeManService; import com.eactive.eai.rms.common.base.OnlBaseService; import com.eactive.eai.rms.common.comDomain.CommonDomainManService; @@ -42,6 +47,7 @@ import com.eactive.eai.rms.data.entity.onl.adapter.AdapterTypePropertyService; import com.eactive.eai.rms.data.entity.onl.adapter.CommonDomain; import com.eactive.eai.rms.data.entity.onl.code.CodeService; import com.eactive.eai.rms.data.entity.onl.server.EAIServerService; +import com.eactive.eai.rms.data.entity.onl.stdmessage.StandardMessageInfoService; import com.eactive.eai.rms.onl.common.exception.BizException; import com.eactive.eai.rms.onl.common.service.AdapterChangeThreadPool; import com.eactive.eai.rms.onl.manage.adapter.adapter.mapper.AdapterGroupUIMapper; @@ -52,6 +58,7 @@ import com.eactive.eai.rms.onl.manage.adapter.adapter.ui.AdapterGroupUIMixIn; import com.eactive.eai.rms.onl.manage.adapter.adapter.ui.AdapterGroupUISearch; import com.eactive.eai.rms.onl.manage.adapter.adapter.ui.AdapterPropUI; import com.eactive.eai.rms.onl.manage.adapter.adapter.ui.AdapterUI; +import com.ext.eai.agent.stdmessage.ReloadSTDMessageCommand; import com.fasterxml.jackson.annotation.JsonInclude; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectWriter; @@ -106,7 +113,10 @@ public class AdapterManService extends OnlBaseService { @Autowired private EAIServerService eaiServerService; - + + @Autowired + private StandardMessageInfoService standardmessageinfoService; + public Page selectList(Pageable pageable, AdapterGroupUISearch adapterGroupUISearch) { Page page = adapterGroupService.findPage(pageable, adapterGroupUISearch); return page.map(adapterGroupUIMapper::toVoWithoutChildrenMapping); @@ -234,11 +244,153 @@ public class AdapterManService extends OnlBaseService { public void update(AdapterGroupUI adapterGroupUI) { - AdapterGroup adapterGroup = adapterGroupService.getById(adapterGroupUI.getAdptrbzwkgroupname()); - adapterGroupUIMapper.updateEntity(adapterGroupUI, adapterGroup); + AdapterGroup adapterGroup = adapterGroupService.getById(adapterGroupUI.getAdptrbzwkgroupname()); + + Map oldApiPathMap = extractApiPaths(adapterGroup); + + adapterGroupUIMapper.updateEntity(adapterGroupUI, adapterGroup); + + // NonUniqueObjectException 대응 + adapterGroupService.saveAndFlush(adapterGroup); - adapterGroupService.save(adapterGroup); + + // HS04 - API_FULL_PATH 동기화 + syncIfApiPathChanged(adapterGroup, oldApiPathMap); } + + private Map extractApiPaths(AdapterGroup adapterGroup) { + + Map pathMap = new HashMap<>(); + + if (adapterGroup == null || adapterGroup.getAdapters() == null) { + return pathMap; + } + for (Adapter adapter : adapterGroup.getAdapters()) { + + if (adapter.getAdapterPropGroup() == null + || adapter.getAdapterPropGroup().getAdapterProps() == null) { + continue; + } + + for (AdapterProp prop : adapter.getAdapterPropGroup().getAdapterProps()) { + String propName = prop.getId().getPrptyname(); + + if ("API_PATH".equals(propName)) { + String adapterName = adapter.getId().getAdptrbzwkgroupname(); + + String apiPathValue = prop.getPrpty2val(); + + pathMap.put(adapterName, apiPathValue); + + break; + + } + + } + } + + + return pathMap; + + } + + private void syncIfApiPathChanged(AdapterGroup newGroup, Map oldPathMap) { + + if (newGroup.getAdapters() == null) return; + + for (Adapter newAdapter : newGroup.getAdapters()) { // adapterData 분리 + String adapterName = newAdapter.getId().getAdptrbzwkgroupname(); // 업데이트할때 들어온 어댑터 이름 + String newPath = findApiPathValue(newAdapter); + + String oldPath = oldPathMap.get(adapterName); + + if (StringUtils.isNotBlank(oldPath) + && StringUtils.isNotBlank(newPath) + && !StringUtils.equals(oldPath, newPath)) { + + updateStdMessageInfoApiFullPath(adapterName, oldPath, newPath); + } + } + + + } + + private String findApiPathValue(Adapter adapter) { + if (adapter.getAdapterPropGroup() == null + || adapter.getAdapterPropGroup().getAdapterProps() == null) { + return null; + } + + return adapter.getAdapterPropGroup().getAdapterProps().stream() + .filter(prop -> prop.getId() != null && "API_PATH".equals(prop.getId().getPrptyname())) + .findFirst() + .map(AdapterProp::getPrpty2val) + .orElse(null); + } + + private void updateStdMessageInfoApiFullPath(String adapterName, String oldPath, String newPath) { + + List stdMsgInfoList = standardmessageinfoService.findByBzwksvckeynameStartingWith(adapterName); + + // 변경 사항이 있었는지 체크해서 HS04 Reload 함. + boolean isUpdated = false; + + for (StandardMessageInfo stdMsgInfo : stdMsgInfoList) { + String fullPath = stdMsgInfo.getApifullpath(); + + // 기존 경로(oldPath)를 포함하고 있을 때만 교체 + if (StringUtils.isNotBlank(fullPath) && fullPath.contains(oldPath)) { + + int pipeIndex = fullPath.indexOf("|"); + + if (pipeIndex != -1) { + String methodPart = fullPath.substring(0, pipeIndex + 1); + String uriPart = fullPath.substring(pipeIndex + 1); + + if (uriPart.startsWith(oldPath)) { + String newUriPart = newPath + uriPart.substring(oldPath.length()); + String updatedFullPath = methodPart + newUriPart; + + stdMsgInfo.setApifullpath(updatedFullPath); + + + try { + // DB에 즉시 반영 + standardmessageinfoService.saveAndFlush(stdMsgInfo); + + isUpdated = true; + + } catch (Exception e) { + + log.error("StandardMessageInfo APIFULLPATH SAVE FAIL key = {}", stdMsgInfo.getBzwksvckeyname()); + } + + } + } else { + // 파이프가 없는 경우 로그 생성 + log.warn("[StandardMessageInfo APIFULLPATH Sync Skip] Abnormal data format found. Adapter: {}, FullPath: {}", adapterName, fullPath); + } + + } + } + + if (isUpdated) { + + try { + + Command command = new ReloadSTDMessageCommand(); + command.setArgs("ALL"); + + agentUtilService.broadcast(command); + + log.debug("API 경로 변경 감지 -> 전체 표준 전문 리로드 명령 전송 완료 (ALL)"); + + } catch (Exception e) { + log.debug("브로드캐스트 전송 실패", e); + } + } + + } public void delete(AdapterGroupUI adapterGroupUI) { adapterGroupService.deleteById(adapterGroupUI.getAdptrbzwkgroupname());