diff --git a/axhub-common/build.gradle b/axhub-common/build.gradle new file mode 100644 index 0000000..e7d453d --- /dev/null +++ b/axhub-common/build.gradle @@ -0,0 +1,34 @@ +plugins { + id 'java-library' +} + +dependencies { + api 'org.springframework.boot:spring-boot-starter-web' + api 'org.springframework.boot:spring-boot-starter-data-redis' + + api 'io.github.resilience4j:resilience4j-spring-boot3:2.2.0' + api 'io.github.resilience4j:resilience4j-core:2.2.0' + api 'io.github.resilience4j:resilience4j-circuitbreaker:2.2.0' + api 'io.github.resilience4j:resilience4j-ratelimiter' + api 'io.github.resilience4j:resilience4j-retry:2.2.0' + api 'org.springframework.boot:spring-boot-starter-aop:3.3.0' + + api 'org.springframework.boot:spring-boot-starter-jdbc' + api 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.3' + api 'com.h2database:h2' + api 'p6spy:p6spy:3.9.1' + api 'io.lettuce:lettuce-core:6.6.0.RELEASE' + + api "org.mapstruct:mapstruct:1.5.5.Final" + + api 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.17.1' + api 'com.fasterxml.jackson.core:jackson-databind:2.17.1' + api 'com.networknt:json-schema-validator:1.4.0' + api 'org.springframework.kafka:spring-kafka:3.2.0' + api 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.5.0' +} + +dependencies { + compileOnly 'org.projectlombok:lombok:1.18.32' + annotationProcessor 'org.projectlombok:lombok:1.18.32' +} diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/dto/ErrorDetail.java b/axhub-common/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/dto/ErrorDetail.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/dto/ErrorDetail.java rename to axhub-common/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/dto/ErrorDetail.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/dto/JsonRpcRequest.java b/axhub-common/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/dto/JsonRpcRequest.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/dto/JsonRpcRequest.java rename to axhub-common/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/dto/JsonRpcRequest.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/dto/JsonRpcResponse.java b/axhub-common/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/dto/JsonRpcResponse.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/dto/JsonRpcResponse.java rename to axhub-common/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/dto/JsonRpcResponse.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/dto/Params.java b/axhub-common/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/dto/Params.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/dto/Params.java rename to axhub-common/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/dto/Params.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/dto/ToolMetadata.java b/axhub-common/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/dto/ToolMetadata.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/dto/ToolMetadata.java rename to axhub-common/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/dto/ToolMetadata.java diff --git a/src/main/java/io/shinhanlife/axhub/common/config/CorsConfig.java b/axhub-common/src/main/java/io/shinhanlife/axhub/common/config/CorsConfig.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/common/config/CorsConfig.java rename to axhub-common/src/main/java/io/shinhanlife/axhub/common/config/CorsConfig.java diff --git a/src/main/java/io/shinhanlife/axhub/common/config/MybatisConfig.java b/axhub-common/src/main/java/io/shinhanlife/axhub/common/config/MybatisConfig.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/common/config/MybatisConfig.java rename to axhub-common/src/main/java/io/shinhanlife/axhub/common/config/MybatisConfig.java diff --git a/src/main/java/io/shinhanlife/axhub/common/config/P6SpySqlFormatter.java b/axhub-common/src/main/java/io/shinhanlife/axhub/common/config/P6SpySqlFormatter.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/common/config/P6SpySqlFormatter.java rename to axhub-common/src/main/java/io/shinhanlife/axhub/common/config/P6SpySqlFormatter.java diff --git a/src/main/java/io/shinhanlife/axhub/common/mcp/config/CacheConfig.java b/axhub-common/src/main/java/io/shinhanlife/axhub/common/mcp/config/CacheConfig.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/common/mcp/config/CacheConfig.java rename to axhub-common/src/main/java/io/shinhanlife/axhub/common/mcp/config/CacheConfig.java diff --git a/src/main/java/io/shinhanlife/axhub/common/mcp/config/JacksonConfig.java b/axhub-common/src/main/java/io/shinhanlife/axhub/common/mcp/config/JacksonConfig.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/common/mcp/config/JacksonConfig.java rename to axhub-common/src/main/java/io/shinhanlife/axhub/common/mcp/config/JacksonConfig.java diff --git a/src/main/java/io/shinhanlife/axhub/common/mcp/config/KafkaLocalConfig.java b/axhub-common/src/main/java/io/shinhanlife/axhub/common/mcp/config/KafkaLocalConfig.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/common/mcp/config/KafkaLocalConfig.java rename to axhub-common/src/main/java/io/shinhanlife/axhub/common/mcp/config/KafkaLocalConfig.java diff --git a/src/main/java/io/shinhanlife/axhub/common/mcp/config/SwaggerConfig.java b/axhub-common/src/main/java/io/shinhanlife/axhub/common/mcp/config/SwaggerConfig.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/common/mcp/config/SwaggerConfig.java rename to axhub-common/src/main/java/io/shinhanlife/axhub/common/mcp/config/SwaggerConfig.java diff --git a/src/main/java/io/shinhanlife/axhub/common/mcp/config/WebConfig.java b/axhub-common/src/main/java/io/shinhanlife/axhub/common/mcp/config/WebConfig.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/common/mcp/config/WebConfig.java rename to axhub-common/src/main/java/io/shinhanlife/axhub/common/mcp/config/WebConfig.java diff --git a/src/main/java/io/shinhanlife/axhub/common/mcp/exception/GlobalExceptionHandler.java b/axhub-common/src/main/java/io/shinhanlife/axhub/common/mcp/exception/GlobalExceptionHandler.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/common/mcp/exception/GlobalExceptionHandler.java rename to axhub-common/src/main/java/io/shinhanlife/axhub/common/mcp/exception/GlobalExceptionHandler.java diff --git a/src/main/java/io/shinhanlife/axhub/common/mcp/filter/MdcLoggingFilter.java b/axhub-common/src/main/java/io/shinhanlife/axhub/common/mcp/filter/MdcLoggingFilter.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/common/mcp/filter/MdcLoggingFilter.java rename to axhub-common/src/main/java/io/shinhanlife/axhub/common/mcp/filter/MdcLoggingFilter.java diff --git a/src/main/java/io/shinhanlife/axhub/common/mcp/security/ApiKeyInterceptor.java b/axhub-common/src/main/java/io/shinhanlife/axhub/common/mcp/security/ApiKeyInterceptor.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/common/mcp/security/ApiKeyInterceptor.java rename to axhub-common/src/main/java/io/shinhanlife/axhub/common/mcp/security/ApiKeyInterceptor.java diff --git a/src/main/java/io/shinhanlife/axhub/common/mcp/security/SecurityProperties.java b/axhub-common/src/main/java/io/shinhanlife/axhub/common/mcp/security/SecurityProperties.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/common/mcp/security/SecurityProperties.java rename to axhub-common/src/main/java/io/shinhanlife/axhub/common/mcp/security/SecurityProperties.java diff --git a/src/main/java/io/shinhanlife/axhub/common/session/converter/ZtUsacConverter.java b/axhub-common/src/main/java/io/shinhanlife/axhub/common/session/converter/ZtUsacConverter.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/common/session/converter/ZtUsacConverter.java rename to axhub-common/src/main/java/io/shinhanlife/axhub/common/session/converter/ZtUsacConverter.java diff --git a/src/main/java/io/shinhanlife/axhub/common/session/domain/model/ZtUsacModel.java b/axhub-common/src/main/java/io/shinhanlife/axhub/common/session/domain/model/ZtUsacModel.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/common/session/domain/model/ZtUsacModel.java rename to axhub-common/src/main/java/io/shinhanlife/axhub/common/session/domain/model/ZtUsacModel.java diff --git a/src/main/java/io/shinhanlife/axhub/common/session/domain/repository/ZtUsacRepository.java b/axhub-common/src/main/java/io/shinhanlife/axhub/common/session/domain/repository/ZtUsacRepository.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/common/session/domain/repository/ZtUsacRepository.java rename to axhub-common/src/main/java/io/shinhanlife/axhub/common/session/domain/repository/ZtUsacRepository.java diff --git a/src/main/java/io/shinhanlife/axhub/common/session/domain/service/ZtUsacService.java b/axhub-common/src/main/java/io/shinhanlife/axhub/common/session/domain/service/ZtUsacService.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/common/session/domain/service/ZtUsacService.java rename to axhub-common/src/main/java/io/shinhanlife/axhub/common/session/domain/service/ZtUsacService.java diff --git a/src/main/java/io/shinhanlife/axhub/common/session/domain/service/impl/ZtUsacServiceImpl.java b/axhub-common/src/main/java/io/shinhanlife/axhub/common/session/domain/service/impl/ZtUsacServiceImpl.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/common/session/domain/service/impl/ZtUsacServiceImpl.java rename to axhub-common/src/main/java/io/shinhanlife/axhub/common/session/domain/service/impl/ZtUsacServiceImpl.java diff --git a/src/main/java/io/shinhanlife/axhub/common/session/dto/SessionDto.java b/axhub-common/src/main/java/io/shinhanlife/axhub/common/session/dto/SessionDto.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/common/session/dto/SessionDto.java rename to axhub-common/src/main/java/io/shinhanlife/axhub/common/session/dto/SessionDto.java diff --git a/src/main/java/io/shinhanlife/axhub/common/session/dto/ZtUsacInDto.java b/axhub-common/src/main/java/io/shinhanlife/axhub/common/session/dto/ZtUsacInDto.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/common/session/dto/ZtUsacInDto.java rename to axhub-common/src/main/java/io/shinhanlife/axhub/common/session/dto/ZtUsacInDto.java diff --git a/src/main/java/io/shinhanlife/axhub/common/session/dto/ZtUsacOutDto.java b/axhub-common/src/main/java/io/shinhanlife/axhub/common/session/dto/ZtUsacOutDto.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/common/session/dto/ZtUsacOutDto.java rename to axhub-common/src/main/java/io/shinhanlife/axhub/common/session/dto/ZtUsacOutDto.java diff --git a/src/main/java/io/shinhanlife/axhub/common/session/presentation/SsoRestController.java b/axhub-common/src/main/java/io/shinhanlife/axhub/common/session/presentation/SsoRestController.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/common/session/presentation/SsoRestController.java rename to axhub-common/src/main/java/io/shinhanlife/axhub/common/session/presentation/SsoRestController.java diff --git a/src/main/java/io/shinhanlife/axhub/common/session/presentation/io/SsoResponse.java b/axhub-common/src/main/java/io/shinhanlife/axhub/common/session/presentation/io/SsoResponse.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/common/session/presentation/io/SsoResponse.java rename to axhub-common/src/main/java/io/shinhanlife/axhub/common/session/presentation/io/SsoResponse.java diff --git a/src/main/java/io/shinhanlife/axhub/common/util/SessionUtil.java b/axhub-common/src/main/java/io/shinhanlife/axhub/common/util/SessionUtil.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/common/util/SessionUtil.java rename to axhub-common/src/main/java/io/shinhanlife/axhub/common/util/SessionUtil.java diff --git a/src/main/java/io/shinhanlife/glow/BaseException.java b/axhub-common/src/main/java/io/shinhanlife/glow/BaseException.java similarity index 100% rename from src/main/java/io/shinhanlife/glow/BaseException.java rename to axhub-common/src/main/java/io/shinhanlife/glow/BaseException.java diff --git a/src/main/java/io/shinhanlife/glow/BaseResponse.java b/axhub-common/src/main/java/io/shinhanlife/glow/BaseResponse.java similarity index 100% rename from src/main/java/io/shinhanlife/glow/BaseResponse.java rename to axhub-common/src/main/java/io/shinhanlife/glow/BaseResponse.java diff --git a/src/main/java/io/shinhanlife/glow/BizException.java b/axhub-common/src/main/java/io/shinhanlife/glow/BizException.java similarity index 100% rename from src/main/java/io/shinhanlife/glow/BizException.java rename to axhub-common/src/main/java/io/shinhanlife/glow/BizException.java diff --git a/src/main/java/io/shinhanlife/glow/GlowAppServiceId.java b/axhub-common/src/main/java/io/shinhanlife/glow/GlowAppServiceId.java similarity index 100% rename from src/main/java/io/shinhanlife/glow/GlowAppServiceId.java rename to axhub-common/src/main/java/io/shinhanlife/glow/GlowAppServiceId.java diff --git a/src/main/java/io/shinhanlife/glow/GlowControllerId.java b/axhub-common/src/main/java/io/shinhanlife/glow/GlowControllerId.java similarity index 100% rename from src/main/java/io/shinhanlife/glow/GlowControllerId.java rename to axhub-common/src/main/java/io/shinhanlife/glow/GlowControllerId.java diff --git a/src/main/java/io/shinhanlife/glow/GlowIndexPaging.java b/axhub-common/src/main/java/io/shinhanlife/glow/GlowIndexPaging.java similarity index 100% rename from src/main/java/io/shinhanlife/glow/GlowIndexPaging.java rename to axhub-common/src/main/java/io/shinhanlife/glow/GlowIndexPaging.java diff --git a/src/main/java/io/shinhanlife/glow/GlowLogTarget.java b/axhub-common/src/main/java/io/shinhanlife/glow/GlowLogTarget.java similarity index 100% rename from src/main/java/io/shinhanlife/glow/GlowLogTarget.java rename to axhub-common/src/main/java/io/shinhanlife/glow/GlowLogTarget.java diff --git a/src/main/java/io/shinhanlife/glow/GlowLogger.java b/axhub-common/src/main/java/io/shinhanlife/glow/GlowLogger.java similarity index 100% rename from src/main/java/io/shinhanlife/glow/GlowLogger.java rename to axhub-common/src/main/java/io/shinhanlife/glow/GlowLogger.java diff --git a/src/main/java/io/shinhanlife/glow/GlowMybatisMapper.java b/axhub-common/src/main/java/io/shinhanlife/glow/GlowMybatisMapper.java similarity index 100% rename from src/main/java/io/shinhanlife/glow/GlowMybatisMapper.java rename to axhub-common/src/main/java/io/shinhanlife/glow/GlowMybatisMapper.java diff --git a/src/main/java/io/shinhanlife/glow/GlowServiceGroupId.java b/axhub-common/src/main/java/io/shinhanlife/glow/GlowServiceGroupId.java similarity index 100% rename from src/main/java/io/shinhanlife/glow/GlowServiceGroupId.java rename to axhub-common/src/main/java/io/shinhanlife/glow/GlowServiceGroupId.java diff --git a/src/main/java/io/shinhanlife/glow/GlowTrgmField.java b/axhub-common/src/main/java/io/shinhanlife/glow/GlowTrgmField.java similarity index 100% rename from src/main/java/io/shinhanlife/glow/GlowTrgmField.java rename to axhub-common/src/main/java/io/shinhanlife/glow/GlowTrgmField.java diff --git a/src/main/java/io/shinhanlife/glow/PageInfo.java b/axhub-common/src/main/java/io/shinhanlife/glow/PageInfo.java similarity index 100% rename from src/main/java/io/shinhanlife/glow/PageInfo.java rename to axhub-common/src/main/java/io/shinhanlife/glow/PageInfo.java diff --git a/src/main/java/io/shinhanlife/glow/ResponseCode.java b/axhub-common/src/main/java/io/shinhanlife/glow/ResponseCode.java similarity index 100% rename from src/main/java/io/shinhanlife/glow/ResponseCode.java rename to axhub-common/src/main/java/io/shinhanlife/glow/ResponseCode.java diff --git a/src/main/java/io/shinhanlife/glow/ResponseUtil.java b/axhub-common/src/main/java/io/shinhanlife/glow/ResponseUtil.java similarity index 100% rename from src/main/java/io/shinhanlife/glow/ResponseUtil.java rename to axhub-common/src/main/java/io/shinhanlife/glow/ResponseUtil.java diff --git a/src/main/java/io/shinhanlife/glow/db/dto/AuditInfo.java b/axhub-common/src/main/java/io/shinhanlife/glow/db/dto/AuditInfo.java similarity index 100% rename from src/main/java/io/shinhanlife/glow/db/dto/AuditInfo.java rename to axhub-common/src/main/java/io/shinhanlife/glow/db/dto/AuditInfo.java diff --git a/axhub-gateway/build.gradle b/axhub-gateway/build.gradle new file mode 100644 index 0000000..ee1815f --- /dev/null +++ b/axhub-gateway/build.gradle @@ -0,0 +1,29 @@ +plugins { + id 'org.springframework.boot' +} + +dependencies { + implementation project(':axhub-common') + + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-data-redis' + + // MyBatis & DB + implementation 'org.springframework.boot:spring-boot-starter-jdbc' + implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.3' + runtimeOnly 'com.h2database:h2' + implementation 'p6spy:p6spy:3.9.1' + + // MapStruct + implementation "org.mapstruct:mapstruct:1.5.5.Final" + annotationProcessor "org.projectlombok:lombok-mapstruct-binding:0.2.0" + annotationProcessor "org.mapstruct:mapstruct-processor:1.5.5.Final" + + implementation 'com.networknt:json-schema-validator:1.4.0' + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.5.0' +} + +dependencies { + compileOnly 'org.projectlombok:lombok:1.18.32' + annotationProcessor 'org.projectlombok:lombok:1.18.32' +} diff --git a/axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/AxHubGatewayApplication.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/AxHubGatewayApplication.java new file mode 100644 index 0000000..7450c97 --- /dev/null +++ b/axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/AxHubGatewayApplication.java @@ -0,0 +1,13 @@ +package io.shinhanlife.axhub.biz.mcp.gateway; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cache.annotation.EnableCaching; + +@SpringBootApplication +@EnableCaching +public class AxHubGatewayApplication { + public static void main(String[] args) { + SpringApplication.run(AxHubGatewayApplication.class, args); + } +} diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/config/RedisConfig.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/config/RedisConfig.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/config/RedisConfig.java rename to axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/config/RedisConfig.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/controller/KillSwitchController.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/controller/KillSwitchController.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/controller/KillSwitchController.java rename to axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/controller/KillSwitchController.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/controller/McpRouterController.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/controller/McpRouterController.java similarity index 51% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/controller/McpRouterController.java rename to axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/controller/McpRouterController.java index d399eb0..bdb1fa2 100644 --- a/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/controller/McpRouterController.java +++ b/axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/controller/McpRouterController.java @@ -1,12 +1,9 @@ package io.shinhanlife.axhub.biz.mcp.gateway.controller; import com.fasterxml.jackson.databind.ObjectMapper; -import io.shinhanlife.axhub.biz.mcp.adapter.connector.LegacyEimsConnector; -import io.shinhanlife.axhub.biz.mcp.adapter.connector.ThirdPartySecurityConnector; import io.shinhanlife.axhub.biz.mcp.adapter.dto.JsonRpcRequest; import io.shinhanlife.axhub.biz.mcp.adapter.dto.JsonRpcResponse; import io.shinhanlife.axhub.biz.mcp.adapter.dto.Params; -import io.shinhanlife.axhub.biz.mcp.adapter.util.PiiMaskingUtils; import io.shinhanlife.axhub.biz.mcp.gateway.dto.ToolMetadata; import io.shinhanlife.axhub.biz.mcp.gateway.service.ExecuteService; import io.shinhanlife.axhub.biz.mcp.gateway.registry.RedisRegistryService; @@ -15,7 +12,7 @@ import io.shinhanlife.axhub.common.mcp.security.SecurityProperties; import lombok.extern.slf4j.Slf4j; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; -import org.springframework.web.client.ResourceAccessException; +import org.springframework.web.client.RestTemplate; import java.util.Map; import java.util.UUID; @@ -32,85 +29,19 @@ public class McpRouterController { private final RedisRegistryService redisRegistryService; private final ExecuteService executeService; private final SecurityProperties securityProperties; - private final LegacyEimsConnector legacyEimsConnector; - private final ThirdPartySecurityConnector thirdPartySecurityConnector; private final ObjectMapper objectMapper; + private final RestTemplate restTemplate = new RestTemplate(); - // 생성자 주입 public McpRouterController(RedisRegistryService redisRegistryService, ExecuteService executeService, SecurityProperties securityProperties, - LegacyEimsConnector legacyEimsConnector, - ThirdPartySecurityConnector thirdPartySecurityConnector, ObjectMapper objectMapper) { this.redisRegistryService = redisRegistryService; this.executeService = executeService; this.securityProperties = securityProperties; - this.legacyEimsConnector = legacyEimsConnector; - this.thirdPartySecurityConnector = thirdPartySecurityConnector; this.objectMapper = objectMapper; } - @Operation(summary = "Adapter 툴 실행 라우팅 (로컬 모듈화)", description = "AI Agent의 요청을 받아 직접 레거시 시스템을 호출합니다.") - @PostMapping("/execute-tool") - public ResponseEntity> routeToPreBuildTool(@RequestBody Map agentPayload) { - String trackId = UUID.randomUUID().toString(); - log.info("[{}] AI Agent로부터 툴 실행 요청 수신 완료", trackId); - log.info("[{}] AI Agent가 보낸 원본 payload: {}", trackId, agentPayload); - - try { - // 1. 요청 파싱 (Map -> JsonRpcRequest) - agentPayload.put("id", trackId); - JsonRpcRequest request = objectMapper.convertValue(agentPayload, JsonRpcRequest.class); - Params params = request.getParams(); - - if (params == null) { - throw new IllegalArgumentException("Invalid params: params 객체가 비어있습니다."); - } - - String routingType = params.getRoutingType(); - String interfaceId = params.getInterfaceId(); - - // 2. 라우터 실행 (분기 처리) - HTTP 통신 없이 직접 호출! - String executionResult; - if (interfaceId != null && (interfaceId.startsWith("DRM_") || interfaceId.startsWith("BM_"))) { - executionResult = thirdPartySecurityConnector.executeSecurityModule(interfaceId, params.getData()); - } else { - executionResult = legacyEimsConnector.executeByTool(routingType, interfaceId, params.getData(), params.getSpec()); - } - - // 3. PII 마스킹 - String maskedResult = PiiMaskingUtils.mask(executionResult); - - // 4. 응답 조립 (JsonRpcResponse -> Map) - JsonRpcResponse response = new JsonRpcResponse(); - response.setId(trackId); - response.setResult(maskedResult); - - Map rpcResponse = objectMapper.convertValue(response, Map.class); - log.info("[{}] 로컬 Adapter 처리 성공", trackId); - - return ResponseEntity.ok(rpcResponse); - - } catch (ResourceAccessException e) { - log.error("[{}] Adapter 시스템 응답 시간 초과 (Timeout) 발생! 사유: {}", trackId, e.getMessage()); - return ResponseEntity.status(504).body(Map.of( - "jsonrpc", "2.0", - "error", Map.of("code", -32603, "message", "인터페이스 서버 연결 시간 초과 (Timeout)"), - "id", trackId - )); - - } catch (Exception e) { - log.error("[{}] 시스템 예외 에러 발생: {}", trackId, e.getMessage()); - return ResponseEntity.internalServerError().body(Map.of( - "jsonrpc", "2.0", - "error", Map.of("code", -32000, "message", "내부 게이트웨이 서버 오류: " + e.getMessage()), - "id", trackId - )); - } - } - - // 1. [신규] 표준 MCP 파이프라인 호출 (가장 중요!) @Operation(summary = "MCP 파이프라인 호출", description = "MCP 표준 파이프라인(ExecuteService)을 통해 레거시 툴을 호출합니다.") @PostMapping("/tools/call") public ResponseEntity callTool( @@ -120,7 +51,6 @@ public class McpRouterController { @RequestBody Map payload, @RequestAttribute(value = "tenantId", required = false) String tenantId) { - // 메타데이터 주입 java.util.Map meta = new java.util.HashMap<>(); meta.put("traceId", traceId != null ? traceId : java.util.UUID.randomUUID().toString()); meta.put("agentId", agentId != null ? agentId : "UNKNOWN"); @@ -128,21 +58,9 @@ public class McpRouterController { payload.put("meta", meta); log.info("[MCP 표준] ExecuteService 파이프라인을 통한 툴 호출 시작 (Tenant: {}, Trace: {})", tenantId, meta.get("traceId")); - if (payload != null) { - try { - log.info(" [Gateway] AI Agent 요청 파라미터: {}", objectMapper.writeValueAsString(payload)); - } catch (Exception e) { - log.info(" [Gateway] AI Agent 요청 파라미터: {}", payload); - } - } try { Object result = executeService.execute(payload, tenantId); - try { - log.info("\n [MCP Gateway -> AI Agent] 최종 응답 반환: {}", objectMapper.writeValueAsString(result)); - } catch (Exception e) { - log.info("\n [MCP Gateway -> AI Agent] 최종 응답 반환: {}", result); - } return ResponseEntity.ok(result); } catch (SecurityException se) { log.warn(" [보안 차단] 권한 오류: {}", se.getMessage()); @@ -153,7 +71,6 @@ public class McpRouterController { } } - // 2. 기존 표준 규격 메서드들 (유지 및 동적 Registry 반영) @GetMapping("/tools/list") public ResponseEntity listTools() { List activeTools = redisRegistryService.getAllTools(); diff --git a/axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/dto/ToolMetadata.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/dto/ToolMetadata.java new file mode 100644 index 0000000..00693fe --- /dev/null +++ b/axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/dto/ToolMetadata.java @@ -0,0 +1,52 @@ +package io.shinhanlife.axhub.biz.mcp.gateway.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.Map; + +/** + * Tool(Agent)의 명세 및 라우팅 정보를 담고 있는 메타데이터 클래스 + * Redis 레지스트리에 저장되며, Planner와 Router 간의 통신 객체(Plan)로 사용됩니다. + */ +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ToolMetadata { + + // 1. Tool 기본 정보 + private String toolName; // 툴 고유 명칭 (예: CustomerSearchTool) + private String description; // 툴의 목적 및 설명 (LLM 프롬프트에 활용 가능) + + // 2. 파라미터 스키마 (JSON Schema 형태의 Map) + private Map parametersSchema; + + // 2-0. 프론트엔드 UI용 함수별 프롬프트 매핑 (추가됨) + private Map actionPrompts; + + // 2-1. 도메인 부서 그룹명 (권한 관리에 사용) + private String domainGroup; + + // 2-2. 툴 처리 엔드포인트 URI 경로 (예: /api/tool/customer-info) + private String endpoint; + + // 2-3. Pod 실행 URL (독립적인 Microservice 라우팅용, 예: http://localhost:8082) + private String podUrl; + + // 3. 연동 아키텍처 구분 (DIRECT / MCI_EAI) + private String integrationType; // 연동 타입: "DIRECT" 또는 "MCI_EAI" + + // 4. 레거시(MCI/EAI) 연동 시 필수 정보 (integrationType이 "MCI_EAI"일 때 사용) + private String mciServiceId; // MCI/EAI 호출을 위한 서비스 ID (예: CRM_001, LICO_992) + + // 5. 인프라 상태 정보 (DIRECT 연동 시 사용) + private Long lastHeartbeat; // Redis TTL 갱신용 마지막 하트비트 타임스탬프 + + // 6. 동적 서킷 브레이커 & 속도 제어 설정 (Registry 기반) + private Integer failureRateThreshold; // 서킷 브레이커 동작 기준 실패율 (%) + private Integer slidingWindowSize; // 서킷 브레이커 에러율 계산 표본 요청 수 + private Integer rateLimitForPeriod; // 속도 제어: 1초당 허용 최대 요청 수 +} \ No newline at end of file diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/messaging/KafkaProducerService.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/messaging/KafkaProducerService.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/messaging/KafkaProducerService.java rename to axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/messaging/KafkaProducerService.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/registry/RedisRegistryService.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/registry/RedisRegistryService.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/registry/RedisRegistryService.java rename to axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/registry/RedisRegistryService.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/service/ExecuteService.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/service/ExecuteService.java similarity index 50% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/service/ExecuteService.java rename to axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/service/ExecuteService.java index a86ffbf..c99cbb8 100644 --- a/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/service/ExecuteService.java +++ b/axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/service/ExecuteService.java @@ -1,60 +1,57 @@ package io.shinhanlife.axhub.biz.mcp.gateway.service; import io.shinhanlife.axhub.biz.mcp.adapter.dto.Params; +import io.shinhanlife.axhub.biz.mcp.gateway.dto.ToolMetadata; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; +import org.springframework.http.ResponseEntity; -import io.shinhanlife.axhub.biz.mcp.gateway.router.RequestValidator; -import io.shinhanlife.axhub.biz.mcp.gateway.router.ToolRouter; -import io.shinhanlife.axhub.biz.mcp.gateway.router.ResponseAggregator; -import io.shinhanlife.axhub.biz.mcp.gateway.client.ToolClient; import java.util.Map; -import io.shinhanlife.axhub.biz.mcp.gateway.dto.ToolMetadata; +import java.util.List; @Slf4j @Service @RequiredArgsConstructor public class ExecuteService { - // 파이프라인의 핵심 컴포넌트들 - private final RequestValidator validator; private final ToolPlanner planner; - private final ToolRouter router; - private final ToolClient client; - private final ResponseAggregator aggregator; private final KillSwitchService killSwitchService; + private final RestTemplate restTemplate = new RestTemplate(); public Object execute(Map payload, String tenantId) { log.info(" [ExecuteService] 전체 실행 흐름 제어 시작"); - // [비상 차단 1단계] Agent 단위 차단 검사 killSwitchService.checkAgent(tenantId); - // [비상 차단 2단계] Tool 단위 차단 검사 Map params = payload.containsKey("params") ? (Map) payload.get("params") : null; String toolName = params != null ? (String) params.get("name") : (String) payload.get("toolName"); killSwitchService.checkTool(toolName); - // 1. 검증 (Validator) - validator.validate(payload); - - // 2. 실행 계획 생성 및 권한 검증 (Planner) var planObj = planner.createPlan(payload, tenantId); ToolMetadata plan = (ToolMetadata) planObj; - // [비상 차단 3단계] Route/Legacy 단위 차단 검사 if (plan.getIntegrationType() != null) { killSwitchService.checkRoute(plan.getIntegrationType()); } - // 3. 라우팅 (Router) - Redis의 Tool Registry 참조 - var targetPod = router.route(plan); + // Dynamic Routing: Find the target Pod from the Redis registry + String targetUrl = "http://localhost:8082"; // Fallback + if (plan.getPodUrl() != null && !plan.getPodUrl().isEmpty()) { + targetUrl = plan.getPodUrl(); + } - // 4. 실제 Tool 호출 (Client) - Retry/Timeout 포함 (동적 제어 적용) - var rawResponse = client.call(targetPod, payload, plan); + log.info(" [ExecuteService] 라우팅 목적지: {}", targetUrl); + String executeApiUrl = targetUrl + "/mcp/api/v1/tools/call"; - // 5. 응답 정규화 및 병합 (Aggregator) - return aggregator.normalize(rawResponse); + // Forward the request to the target tool pod + try { + ResponseEntity response = restTemplate.postForEntity(executeApiUrl, payload, Object.class); + return response.getBody(); + } catch (Exception e) { + log.error(" [ExecuteService] Tool Pod 호출 실패: {}", e.getMessage()); + throw new RuntimeException("Tool Pod 호출 실패: " + e.getMessage()); + } } } \ No newline at end of file diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/service/KillSwitchService.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/service/KillSwitchService.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/service/KillSwitchService.java rename to axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/service/KillSwitchService.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/service/ToolPlanner.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/service/ToolPlanner.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/service/ToolPlanner.java rename to axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/service/ToolPlanner.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/so/atm/converter/AccessMgmtConverter.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/so/atm/converter/AccessMgmtConverter.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/so/atm/converter/AccessMgmtConverter.java rename to axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/so/atm/converter/AccessMgmtConverter.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/so/atm/domain/repository/AccessMgmtMapper.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/so/atm/domain/repository/AccessMgmtMapper.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/so/atm/domain/repository/AccessMgmtMapper.java rename to axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/so/atm/domain/repository/AccessMgmtMapper.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/so/atm/domain/service/AccessMgmtService.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/so/atm/domain/service/AccessMgmtService.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/so/atm/domain/service/AccessMgmtService.java rename to axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/so/atm/domain/service/AccessMgmtService.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/so/atm/domain/service/impl/AccessMgmtServiceImpl.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/so/atm/domain/service/impl/AccessMgmtServiceImpl.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/so/atm/domain/service/impl/AccessMgmtServiceImpl.java rename to axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/so/atm/domain/service/impl/AccessMgmtServiceImpl.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/so/atm/dto/AthrItemOutDto.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/so/atm/dto/AthrItemOutDto.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/so/atm/dto/AthrItemOutDto.java rename to axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/so/atm/dto/AthrItemOutDto.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/so/atm/dto/AthrOutDto.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/so/atm/dto/AthrOutDto.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/so/atm/dto/AthrOutDto.java rename to axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/so/atm/dto/AthrOutDto.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/so/atm/dto/AthrSaveInDto.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/so/atm/dto/AthrSaveInDto.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/so/atm/dto/AthrSaveInDto.java rename to axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/so/atm/dto/AthrSaveInDto.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/so/atm/dto/AthrSearchInDto.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/so/atm/dto/AthrSearchInDto.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/so/atm/dto/AthrSearchInDto.java rename to axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/so/atm/dto/AthrSearchInDto.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/so/atm/dto/RoleKnwlAthrInDto.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/so/atm/dto/RoleKnwlAthrInDto.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/so/atm/dto/RoleKnwlAthrInDto.java rename to axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/so/atm/dto/RoleKnwlAthrInDto.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/so/atm/dto/RoleListInDto.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/so/atm/dto/RoleListInDto.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/so/atm/dto/RoleListInDto.java rename to axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/so/atm/dto/RoleListInDto.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/so/atm/dto/RoleListOutDto.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/so/atm/dto/RoleListOutDto.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/so/atm/dto/RoleListOutDto.java rename to axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/so/atm/dto/RoleListOutDto.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/so/atm/dto/RoleToolAthrInDto.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/so/atm/dto/RoleToolAthrInDto.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/so/atm/dto/RoleToolAthrInDto.java rename to axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/so/atm/dto/RoleToolAthrInDto.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/so/atm/presentation/SOATM0100Controller.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/so/atm/presentation/SOATM0100Controller.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/so/atm/presentation/SOATM0100Controller.java rename to axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/so/atm/presentation/SOATM0100Controller.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/so/atm/presentation/io/AthrSaveRequest.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/so/atm/presentation/io/AthrSaveRequest.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/so/atm/presentation/io/AthrSaveRequest.java rename to axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/so/atm/presentation/io/AthrSaveRequest.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/so/atm/presentation/io/AthrSearchRequest.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/so/atm/presentation/io/AthrSearchRequest.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/so/atm/presentation/io/AthrSearchRequest.java rename to axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/so/atm/presentation/io/AthrSearchRequest.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/so/atm/presentation/io/AthrSearchResponse.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/so/atm/presentation/io/AthrSearchResponse.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/so/atm/presentation/io/AthrSearchResponse.java rename to axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/so/atm/presentation/io/AthrSearchResponse.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/so/atm/presentation/io/RoleListRequest.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/so/atm/presentation/io/RoleListRequest.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/so/atm/presentation/io/RoleListRequest.java rename to axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/so/atm/presentation/io/RoleListRequest.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/so/atm/usecase/AccessMgmtUseCase.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/so/atm/usecase/AccessMgmtUseCase.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/so/atm/usecase/AccessMgmtUseCase.java rename to axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/so/atm/usecase/AccessMgmtUseCase.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/so/atm/usecase/impl/AccessMgmtUseCaseImpl.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/so/atm/usecase/impl/AccessMgmtUseCaseImpl.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/so/atm/usecase/impl/AccessMgmtUseCaseImpl.java rename to axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/so/atm/usecase/impl/AccessMgmtUseCaseImpl.java diff --git a/src/main/java/io/shinhanlife/axhub/sample/converter/SampleConverter.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/sample/converter/SampleConverter.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/sample/converter/SampleConverter.java rename to axhub-gateway/src/main/java/io/shinhanlife/axhub/sample/converter/SampleConverter.java diff --git a/src/main/java/io/shinhanlife/axhub/sample/domain/model/AppliSystNtfyPatiModel.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/sample/domain/model/AppliSystNtfyPatiModel.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/sample/domain/model/AppliSystNtfyPatiModel.java rename to axhub-gateway/src/main/java/io/shinhanlife/axhub/sample/domain/model/AppliSystNtfyPatiModel.java diff --git a/src/main/java/io/shinhanlife/axhub/sample/domain/repository/GlowSampleRepository.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/sample/domain/repository/GlowSampleRepository.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/sample/domain/repository/GlowSampleRepository.java rename to axhub-gateway/src/main/java/io/shinhanlife/axhub/sample/domain/repository/GlowSampleRepository.java diff --git a/src/main/java/io/shinhanlife/axhub/sample/domain/service/GlowSampleService.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/sample/domain/service/GlowSampleService.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/sample/domain/service/GlowSampleService.java rename to axhub-gateway/src/main/java/io/shinhanlife/axhub/sample/domain/service/GlowSampleService.java diff --git a/src/main/java/io/shinhanlife/axhub/sample/domain/service/impl/GlowSampleServiceImpl.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/sample/domain/service/impl/GlowSampleServiceImpl.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/sample/domain/service/impl/GlowSampleServiceImpl.java rename to axhub-gateway/src/main/java/io/shinhanlife/axhub/sample/domain/service/impl/GlowSampleServiceImpl.java diff --git a/src/main/java/io/shinhanlife/axhub/sample/dto/AppliSystNtfyRgiInDTO.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/sample/dto/AppliSystNtfyRgiInDTO.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/sample/dto/AppliSystNtfyRgiInDTO.java rename to axhub-gateway/src/main/java/io/shinhanlife/axhub/sample/dto/AppliSystNtfyRgiInDTO.java diff --git a/src/main/java/io/shinhanlife/axhub/sample/dto/StrnTermListInDTO.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/sample/dto/StrnTermListInDTO.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/sample/dto/StrnTermListInDTO.java rename to axhub-gateway/src/main/java/io/shinhanlife/axhub/sample/dto/StrnTermListInDTO.java diff --git a/src/main/java/io/shinhanlife/axhub/sample/dto/StrnTermListOutDTO.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/sample/dto/StrnTermListOutDTO.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/sample/dto/StrnTermListOutDTO.java rename to axhub-gateway/src/main/java/io/shinhanlife/axhub/sample/dto/StrnTermListOutDTO.java diff --git a/src/main/java/io/shinhanlife/axhub/sample/presentation/GlowSampleController.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/sample/presentation/GlowSampleController.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/sample/presentation/GlowSampleController.java rename to axhub-gateway/src/main/java/io/shinhanlife/axhub/sample/presentation/GlowSampleController.java diff --git a/src/main/java/io/shinhanlife/axhub/sample/presentation/io/AppliSystNtfyPatiRequest.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/sample/presentation/io/AppliSystNtfyPatiRequest.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/sample/presentation/io/AppliSystNtfyPatiRequest.java rename to axhub-gateway/src/main/java/io/shinhanlife/axhub/sample/presentation/io/AppliSystNtfyPatiRequest.java diff --git a/src/main/java/io/shinhanlife/axhub/sample/presentation/io/AppliSystNtfyPatiResponse.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/sample/presentation/io/AppliSystNtfyPatiResponse.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/sample/presentation/io/AppliSystNtfyPatiResponse.java rename to axhub-gateway/src/main/java/io/shinhanlife/axhub/sample/presentation/io/AppliSystNtfyPatiResponse.java diff --git a/src/main/java/io/shinhanlife/axhub/sample/presentation/io/StrnTermRequest.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/sample/presentation/io/StrnTermRequest.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/sample/presentation/io/StrnTermRequest.java rename to axhub-gateway/src/main/java/io/shinhanlife/axhub/sample/presentation/io/StrnTermRequest.java diff --git a/src/main/java/io/shinhanlife/axhub/sample/presentation/io/StrnTermResponse.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/sample/presentation/io/StrnTermResponse.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/sample/presentation/io/StrnTermResponse.java rename to axhub-gateway/src/main/java/io/shinhanlife/axhub/sample/presentation/io/StrnTermResponse.java diff --git a/src/main/java/io/shinhanlife/axhub/sample/usecase/GlowSampleUseCase.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/sample/usecase/GlowSampleUseCase.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/sample/usecase/GlowSampleUseCase.java rename to axhub-gateway/src/main/java/io/shinhanlife/axhub/sample/usecase/GlowSampleUseCase.java diff --git a/src/main/java/io/shinhanlife/axhub/sample/usecase/impl/GlowSampleUseCaseImpl.java b/axhub-gateway/src/main/java/io/shinhanlife/axhub/sample/usecase/impl/GlowSampleUseCaseImpl.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/sample/usecase/impl/GlowSampleUseCaseImpl.java rename to axhub-gateway/src/main/java/io/shinhanlife/axhub/sample/usecase/impl/GlowSampleUseCaseImpl.java diff --git a/src/main/resources/SOATM0100_DDL.sql b/axhub-gateway/src/main/resources/SOATM0100_DDL.sql similarity index 100% rename from src/main/resources/SOATM0100_DDL.sql rename to axhub-gateway/src/main/resources/SOATM0100_DDL.sql diff --git a/src/main/resources/application-dev.properties b/axhub-gateway/src/main/resources/application-dev.properties similarity index 100% rename from src/main/resources/application-dev.properties rename to axhub-gateway/src/main/resources/application-dev.properties diff --git a/src/main/resources/application-local.properties b/axhub-gateway/src/main/resources/application-local.properties similarity index 100% rename from src/main/resources/application-local.properties rename to axhub-gateway/src/main/resources/application-local.properties diff --git a/src/main/resources/application-prod.properties b/axhub-gateway/src/main/resources/application-prod.properties similarity index 100% rename from src/main/resources/application-prod.properties rename to axhub-gateway/src/main/resources/application-prod.properties diff --git a/src/main/resources/application.properties b/axhub-gateway/src/main/resources/application.properties similarity index 100% rename from src/main/resources/application.properties rename to axhub-gateway/src/main/resources/application.properties diff --git a/src/main/resources/data.sql b/axhub-gateway/src/main/resources/data.sql similarity index 100% rename from src/main/resources/data.sql rename to axhub-gateway/src/main/resources/data.sql diff --git a/src/main/resources/logback-spring.xml b/axhub-gateway/src/main/resources/logback-spring.xml similarity index 100% rename from src/main/resources/logback-spring.xml rename to axhub-gateway/src/main/resources/logback-spring.xml diff --git a/src/main/resources/mapper/AccessMgmtMapper.xml b/axhub-gateway/src/main/resources/mapper/AccessMgmtMapper.xml similarity index 100% rename from src/main/resources/mapper/AccessMgmtMapper.xml rename to axhub-gateway/src/main/resources/mapper/AccessMgmtMapper.xml diff --git a/src/main/resources/mapper/ZtUsacRepository.xml b/axhub-gateway/src/main/resources/mapper/ZtUsacRepository.xml similarity index 100% rename from src/main/resources/mapper/ZtUsacRepository.xml rename to axhub-gateway/src/main/resources/mapper/ZtUsacRepository.xml diff --git a/src/main/resources/mapper/sm/mmg/ZtMenuRepository.xml b/axhub-gateway/src/main/resources/mapper/sm/mmg/ZtMenuRepository.xml similarity index 100% rename from src/main/resources/mapper/sm/mmg/ZtMenuRepository.xml rename to axhub-gateway/src/main/resources/mapper/sm/mmg/ZtMenuRepository.xml diff --git a/src/main/resources/mock-responses.json b/axhub-gateway/src/main/resources/mock-responses.json similarity index 100% rename from src/main/resources/mock-responses.json rename to axhub-gateway/src/main/resources/mock-responses.json diff --git a/src/main/resources/sample/GlowSampleRepository.xml b/axhub-gateway/src/main/resources/sample/GlowSampleRepository.xml similarity index 100% rename from src/main/resources/sample/GlowSampleRepository.xml rename to axhub-gateway/src/main/resources/sample/GlowSampleRepository.xml diff --git a/src/main/resources/schema.sql b/axhub-gateway/src/main/resources/schema.sql similarity index 100% rename from src/main/resources/schema.sql rename to axhub-gateway/src/main/resources/schema.sql diff --git a/src/main/resources/spy.properties b/axhub-gateway/src/main/resources/spy.properties similarity index 100% rename from src/main/resources/spy.properties rename to axhub-gateway/src/main/resources/spy.properties diff --git a/src/main/resources/static/index.html b/axhub-gateway/src/main/resources/static/index.html similarity index 100% rename from src/main/resources/static/index.html rename to axhub-gateway/src/main/resources/static/index.html diff --git a/src/main/resources/static/static/index.html b/axhub-gateway/src/main/resources/static/static/index.html similarity index 100% rename from src/main/resources/static/static/index.html rename to axhub-gateway/src/main/resources/static/static/index.html diff --git a/axhub-tool-core/build.gradle b/axhub-tool-core/build.gradle new file mode 100644 index 0000000..9f9b4af --- /dev/null +++ b/axhub-tool-core/build.gradle @@ -0,0 +1,12 @@ +plugins { + id 'java-library' +} + +dependencies { + api project(':axhub-common') +} + +dependencies { + compileOnly 'org.projectlombok:lombok:1.18.32' + annotationProcessor 'org.projectlombok:lombok:1.18.32' +} diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/aop/EimsMonitoringAspect.java b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/aop/EimsMonitoringAspect.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/aop/EimsMonitoringAspect.java rename to axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/aop/EimsMonitoringAspect.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/aop/GatewayLoggingAspect.java b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/aop/GatewayLoggingAspect.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/aop/GatewayLoggingAspect.java rename to axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/aop/GatewayLoggingAspect.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/connector/ExternalApiConnector.java b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/connector/ExternalApiConnector.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/connector/ExternalApiConnector.java rename to axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/connector/ExternalApiConnector.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/connector/InternalSystemConnector.java b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/connector/InternalSystemConnector.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/connector/InternalSystemConnector.java rename to axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/connector/InternalSystemConnector.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/connector/LegacyDbConnector.java b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/connector/LegacyDbConnector.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/connector/LegacyDbConnector.java rename to axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/connector/LegacyDbConnector.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/connector/LegacyEimsConnector.java b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/connector/LegacyEimsConnector.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/connector/LegacyEimsConnector.java rename to axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/connector/LegacyEimsConnector.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/connector/ThirdPartySecurityConnector.java b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/connector/ThirdPartySecurityConnector.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/connector/ThirdPartySecurityConnector.java rename to axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/connector/ThirdPartySecurityConnector.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/sender/EaiEimsSender.java b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/sender/EaiEimsSender.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/sender/EaiEimsSender.java rename to axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/sender/EaiEimsSender.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/sender/EimsSender.java b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/sender/EimsSender.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/sender/EimsSender.java rename to axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/sender/EimsSender.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/sender/HttpEimsSender.java b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/sender/HttpEimsSender.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/sender/HttpEimsSender.java rename to axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/sender/HttpEimsSender.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/sender/JspFormEimsSender.java b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/sender/JspFormEimsSender.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/sender/JspFormEimsSender.java rename to axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/sender/JspFormEimsSender.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/sender/JspJsonEimsSender.java b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/sender/JspJsonEimsSender.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/sender/JspJsonEimsSender.java rename to axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/sender/JspJsonEimsSender.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/sender/MciEimsSender.java b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/sender/MciEimsSender.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/sender/MciEimsSender.java rename to axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/sender/MciEimsSender.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/sender/TcpEimsSender.java b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/sender/TcpEimsSender.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/sender/TcpEimsSender.java rename to axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/sender/TcpEimsSender.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/support/DynamicPayloadBuilder.java b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/support/DynamicPayloadBuilder.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/support/DynamicPayloadBuilder.java rename to axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/support/DynamicPayloadBuilder.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/support/DynamicSchemaValidator.java b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/support/DynamicSchemaValidator.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/support/DynamicSchemaValidator.java rename to axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/support/DynamicSchemaValidator.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/support/ResultStandardizer.java b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/support/ResultStandardizer.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/support/ResultStandardizer.java rename to axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/support/ResultStandardizer.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/support/TicketManager.java b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/support/TicketManager.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/support/TicketManager.java rename to axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/support/TicketManager.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/support/ToolExecutionService.java b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/support/ToolExecutionService.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/support/ToolExecutionService.java rename to axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/support/ToolExecutionService.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/test/MockEimsHttpServer.java b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/test/MockEimsHttpServer.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/test/MockEimsHttpServer.java rename to axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/test/MockEimsHttpServer.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/test/MockEimsTcpServer.java b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/test/MockEimsTcpServer.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/test/MockEimsTcpServer.java rename to axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/test/MockEimsTcpServer.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/test/MockJspServer.java b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/test/MockJspServer.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/test/MockJspServer.java rename to axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/test/MockJspServer.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/util/LegacyDataTransformer.java b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/util/LegacyDataTransformer.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/util/LegacyDataTransformer.java rename to axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/util/LegacyDataTransformer.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/util/PiiMaskingLogbackConverter.java b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/util/PiiMaskingLogbackConverter.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/util/PiiMaskingLogbackConverter.java rename to axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/util/PiiMaskingLogbackConverter.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/util/PiiMaskingUtils.java b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/util/PiiMaskingUtils.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/util/PiiMaskingUtils.java rename to axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/util/PiiMaskingUtils.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/annotation/McpFunction.java b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/annotation/McpFunction.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/tool/annotation/McpFunction.java rename to axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/annotation/McpFunction.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/annotation/McpParameter.java b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/annotation/McpParameter.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/tool/annotation/McpParameter.java rename to axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/annotation/McpParameter.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/annotation/McpTool.java b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/annotation/McpTool.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/tool/annotation/McpTool.java rename to axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/annotation/McpTool.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/controller/BusinessToolController.java b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/controller/BusinessToolController.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/tool/controller/BusinessToolController.java rename to axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/controller/BusinessToolController.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/service/AbstractMcpToolService.java b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/service/AbstractMcpToolService.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/tool/service/AbstractMcpToolService.java rename to axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/service/AbstractMcpToolService.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/util/JsonSchemaGenerator.java b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/util/JsonSchemaGenerator.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/tool/util/JsonSchemaGenerator.java rename to axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/util/JsonSchemaGenerator.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/util/ToolScaffolder.java b/axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/util/ToolScaffolder.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/tool/util/ToolScaffolder.java rename to axhub-tool-core/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/util/ToolScaffolder.java diff --git a/axhub-tool-email/build.gradle b/axhub-tool-email/build.gradle new file mode 100644 index 0000000..6df11bb --- /dev/null +++ b/axhub-tool-email/build.gradle @@ -0,0 +1,12 @@ +plugins { + id 'org.springframework.boot' +} + +dependencies { + implementation project(':axhub-tool-core') +} + +dependencies { + compileOnly 'org.projectlombok:lombok:1.18.32' + annotationProcessor 'org.projectlombok:lombok:1.18.32' +} diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/EmailSendReq.java b/axhub-tool-email/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/EmailSendReq.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/EmailSendReq.java rename to axhub-tool-email/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/EmailSendReq.java diff --git a/axhub-tool-email/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/email/AxHubToolEmailApplication.java b/axhub-tool-email/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/email/AxHubToolEmailApplication.java new file mode 100644 index 0000000..669ded4 --- /dev/null +++ b/axhub-tool-email/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/email/AxHubToolEmailApplication.java @@ -0,0 +1,13 @@ +package io.shinhanlife.axhub.biz.mcp.tool.email; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cache.annotation.EnableCaching; + +@SpringBootApplication +@EnableCaching +public class AxHubToolEmailApplication { + public static void main(String[] args) { + SpringApplication.run(AxHubToolEmailApplication.class, args); + } +} diff --git a/axhub-tool-other/build.gradle b/axhub-tool-other/build.gradle new file mode 100644 index 0000000..6df11bb --- /dev/null +++ b/axhub-tool-other/build.gradle @@ -0,0 +1,12 @@ +plugins { + id 'org.springframework.boot' +} + +dependencies { + implementation project(':axhub-tool-core') +} + +dependencies { + compileOnly 'org.projectlombok:lombok:1.18.32' + annotationProcessor 'org.projectlombok:lombok:1.18.32' +} diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/BillingProcessReq.java b/axhub-tool-other/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/BillingProcessReq.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/BillingProcessReq.java rename to axhub-tool-other/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/BillingProcessReq.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/BillingStatusReq.java b/axhub-tool-other/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/BillingStatusReq.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/BillingStatusReq.java rename to axhub-tool-other/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/BillingStatusReq.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/BondCheckReq.java b/axhub-tool-other/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/BondCheckReq.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/BondCheckReq.java rename to axhub-tool-other/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/BondCheckReq.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/BondIssueReq.java b/axhub-tool-other/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/BondIssueReq.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/BondIssueReq.java rename to axhub-tool-other/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/BondIssueReq.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/ContractDetailReq.java b/axhub-tool-other/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/ContractDetailReq.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/ContractDetailReq.java rename to axhub-tool-other/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/ContractDetailReq.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/ContractStatusReq.java b/axhub-tool-other/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/ContractStatusReq.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/ContractStatusReq.java rename to axhub-tool-other/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/ContractStatusReq.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/CustomerDetailReq.java b/axhub-tool-other/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/CustomerDetailReq.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/CustomerDetailReq.java rename to axhub-tool-other/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/CustomerDetailReq.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/CustomerGradeReq.java b/axhub-tool-other/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/CustomerGradeReq.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/CustomerGradeReq.java rename to axhub-tool-other/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/CustomerGradeReq.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/LeaveCountReq.java b/axhub-tool-other/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/LeaveCountReq.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/LeaveCountReq.java rename to axhub-tool-other/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/LeaveCountReq.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/VacationRegisterReq.java b/axhub-tool-other/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/VacationRegisterReq.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/VacationRegisterReq.java rename to axhub-tool-other/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/VacationRegisterReq.java diff --git a/axhub-tool-other/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/other/AxHubToolOtherApplication.java b/axhub-tool-other/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/other/AxHubToolOtherApplication.java new file mode 100644 index 0000000..499d653 --- /dev/null +++ b/axhub-tool-other/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/other/AxHubToolOtherApplication.java @@ -0,0 +1,13 @@ +package io.shinhanlife.axhub.biz.mcp.tool.other; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cache.annotation.EnableCaching; + +@SpringBootApplication +@EnableCaching +public class AxHubToolOtherApplication { + public static void main(String[] args) { + SpringApplication.run(AxHubToolOtherApplication.class, args); + } +} diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/service/BillingProcessService.java b/axhub-tool-other/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/service/BillingProcessService.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/tool/service/BillingProcessService.java rename to axhub-tool-other/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/service/BillingProcessService.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/service/BondIssueService.java b/axhub-tool-other/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/service/BondIssueService.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/tool/service/BondIssueService.java rename to axhub-tool-other/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/service/BondIssueService.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/service/CommonUtilityService.java b/axhub-tool-other/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/service/CommonUtilityService.java similarity index 62% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/tool/service/CommonUtilityService.java rename to axhub-tool-other/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/service/CommonUtilityService.java index 48a68e5..02b1259 100644 --- a/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/service/CommonUtilityService.java +++ b/axhub-tool-other/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/service/CommonUtilityService.java @@ -4,8 +4,7 @@ import io.shinhanlife.axhub.biz.mcp.tool.annotation.McpFunction; import io.shinhanlife.axhub.biz.mcp.tool.annotation.McpTool; import io.shinhanlife.axhub.biz.mcp.tool.dto.VacationRegisterReq; import io.shinhanlife.axhub.biz.mcp.tool.dto.LeaveCountReq; -import io.shinhanlife.axhub.biz.mcp.tool.dto.SmsSendReq; -import io.shinhanlife.axhub.biz.mcp.tool.dto.EmailSendReq; +import io.shinhanlife.axhub.biz.mcp.tool.dto.LeaveCountReq; @McpTool( name = "common_utility_tool", @@ -25,13 +24,4 @@ public class CommonUtilityService extends AbstractMcpToolService { return executeLegacy("HTTP", "HR_VAC_02", data); } - @McpFunction(name = "send_sms", description = "SMS 발송", prompt = "고객님께 심사 완료 안내 SMS 문자를 발송해줘.", mappingId = "COM_SMS_01") - public Object sendSms(SmsSendReq data) { - return executeLegacy("HTTP", "COM_SMS_01", data); - } - - @McpFunction(name = "send_email", description = "이메일 발송", prompt = "담당자에게 결과 보고서 이메일을 보내줘.", mappingId = "COM_EML_01") - public Object sendEmail(EmailSendReq data) { - return executeLegacy("HTTP", "COM_EML_01", data); - } } diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/service/ContractInquiryService.java b/axhub-tool-other/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/service/ContractInquiryService.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/tool/service/ContractInquiryService.java rename to axhub-tool-other/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/service/ContractInquiryService.java diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/service/CustomerInfoService.java b/axhub-tool-other/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/service/CustomerInfoService.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/tool/service/CustomerInfoService.java rename to axhub-tool-other/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/service/CustomerInfoService.java diff --git a/axhub-tool-sms/build.gradle b/axhub-tool-sms/build.gradle new file mode 100644 index 0000000..6df11bb --- /dev/null +++ b/axhub-tool-sms/build.gradle @@ -0,0 +1,12 @@ +plugins { + id 'org.springframework.boot' +} + +dependencies { + implementation project(':axhub-tool-core') +} + +dependencies { + compileOnly 'org.projectlombok:lombok:1.18.32' + annotationProcessor 'org.projectlombok:lombok:1.18.32' +} diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/SmsSendReq.java b/axhub-tool-sms/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/SmsSendReq.java similarity index 100% rename from src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/SmsSendReq.java rename to axhub-tool-sms/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/dto/SmsSendReq.java diff --git a/axhub-tool-sms/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/sms/AxHubToolSmsApplication.java b/axhub-tool-sms/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/sms/AxHubToolSmsApplication.java new file mode 100644 index 0000000..c26e62c --- /dev/null +++ b/axhub-tool-sms/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/sms/AxHubToolSmsApplication.java @@ -0,0 +1,13 @@ +package io.shinhanlife.axhub.biz.mcp.tool.sms; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cache.annotation.EnableCaching; + +@SpringBootApplication +@EnableCaching +public class AxHubToolSmsApplication { + public static void main(String[] args) { + SpringApplication.run(AxHubToolSmsApplication.class, args); + } +} diff --git a/build.gradle b/build.gradle index 6d3a199..9f0db90 100644 --- a/build.gradle +++ b/build.gradle @@ -1,82 +1,40 @@ plugins { id 'java' - id 'org.springframework.boot' version '4.0.5' - id 'io.spring.dependency-management' version '1.1.6' + id 'org.springframework.boot' version '4.0.5' apply false + id 'io.spring.dependency-management' version '1.1.6' apply false } -group = 'io.shinhanlife' -version = '0.0.1-SNAPSHOT' - -java { - sourceCompatibility = '21' +allprojects { + group = 'io.shinhanlife' + version = '0.0.1-SNAPSHOT' } -def springBootVersion = '4.0.5' -def lombokVersion = '1.18.32' -def mapstructVersion = '1.5.5.Final' +subprojects { + apply plugin: 'java' + apply plugin: 'io.spring.dependency-management' -bootRun { - if (project.hasProperty('mainClass')) { - mainClass = project.property('mainClass') + java { + sourceCompatibility = '21' + } + + repositories { + mavenCentral() + } + + dependencyManagement { + imports { + mavenBom org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES + } + } + + dependencies { + compileOnly 'org.projectlombok:lombok:1.18.32' + annotationProcessor 'org.projectlombok:lombok:1.18.32' + testImplementation 'org.springframework.boot:spring-boot-starter-test' + } + + tasks.withType(JavaCompile) { + options.compilerArgs << '-parameters' + options.compilerArgs << '-Amapstruct.defaultComponentModel=spring' } - systemProperty "file.encoding", "UTF-8" - systemProperty "console.encoding", "UTF-8" -} - -springBoot { - mainClass = 'io.shinhanlife.AxHubAdminApplication' -} - -repositories { - mavenCentral() -} - -dependencies { - implementation "org.springframework.boot:spring-boot-starter-web:${springBootVersion}" - implementation 'org.springframework.boot:spring-boot-starter-data-redis' - - // Resilience4j - implementation 'io.github.resilience4j:resilience4j-spring-boot3:2.2.0' - implementation 'io.github.resilience4j:resilience4j-core:2.2.0' - implementation 'io.github.resilience4j:resilience4j-circuitbreaker:2.2.0' - implementation 'io.github.resilience4j:resilience4j-ratelimiter' - implementation 'io.github.resilience4j:resilience4j-retry:2.2.0' - - // AOP (needed by Resilience4j) - implementation 'org.springframework.boot:spring-boot-starter-aop:3.3.0' - - // MyBatis & DB - implementation 'org.springframework.boot:spring-boot-starter-jdbc' - implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.3' - runtimeOnly 'com.h2database:h2' - implementation 'p6spy:p6spy:3.9.1' - - // Redis explicit driver - implementation 'io.lettuce:lettuce-core:6.6.0.RELEASE' - - // MapStruct - implementation "org.mapstruct:mapstruct:${mapstructVersion}" - - // Lombok - compileOnly "org.projectlombok:lombok:${lombokVersion}" - annotationProcessor "org.projectlombok:lombok:${lombokVersion}" - - // lombok-mapstruct-binding is usually needed if mapstruct is processed after lombok - annotationProcessor "org.projectlombok:lombok-mapstruct-binding:0.2.0" - annotationProcessor "org.mapstruct:mapstruct-processor:${mapstructVersion}" - - // MCP required dependencies - implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.17.1' - implementation 'com.fasterxml.jackson.core:jackson-databind:2.17.1' - implementation 'com.networknt:json-schema-validator:1.4.0' - implementation 'org.springframework.kafka:spring-kafka:3.2.0' - implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.5.0' - - // Test - testImplementation "org.springframework.boot:spring-boot-starter-test:${springBootVersion}" -} - -tasks.withType(JavaCompile) { - options.compilerArgs << '-parameters' - options.compilerArgs << '-Amapstruct.defaultComponentModel=spring' } diff --git a/create_apps.py b/create_apps.py new file mode 100644 index 0000000..e79cf3d --- /dev/null +++ b/create_apps.py @@ -0,0 +1,46 @@ +import os + +apps = { + "axhub-gateway": { + "pkg": "io.shinhanlife.axhub.biz.mcp.gateway", + "cls": "AxHubGatewayApplication", + "path": "axhub-gateway/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/AxHubGatewayApplication.java" + }, + "axhub-tool-sms": { + "pkg": "io.shinhanlife.axhub.biz.mcp.tool.sms", + "cls": "AxHubToolSmsApplication", + "path": "axhub-tool-sms/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/sms/AxHubToolSmsApplication.java" + }, + "axhub-tool-email": { + "pkg": "io.shinhanlife.axhub.biz.mcp.tool.email", + "cls": "AxHubToolEmailApplication", + "path": "axhub-tool-email/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/email/AxHubToolEmailApplication.java" + }, + "axhub-tool-other": { + "pkg": "io.shinhanlife.axhub.biz.mcp.tool.other", + "cls": "AxHubToolOtherApplication", + "path": "axhub-tool-other/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/other/AxHubToolOtherApplication.java" + } +} + +for module, info in apps.items(): + dir_path = os.path.dirname(info["path"]) + os.makedirs(dir_path, exist_ok=True) + content = f"""package {info['pkg']}; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.cache.annotation.EnableCaching; + +@SpringBootApplication +@EnableCaching +public class {info['cls']} {{ + public static void main(String[] args) {{ + SpringApplication.run({info['cls']}.class, args); + }} +}} +""" + with open(info["path"], "w", encoding="utf-8") as f: + f.write(content) + +print("Application classes recreated.") diff --git a/fix_build.py b/fix_build.py new file mode 100644 index 0000000..263cc0d --- /dev/null +++ b/fix_build.py @@ -0,0 +1,18 @@ +import os + +lombok_deps = """ +dependencies { + compileOnly 'org.projectlombok:lombok:1.18.32' + annotationProcessor 'org.projectlombok:lombok:1.18.32' +} +""" + +modules = ["axhub-common", "axhub-gateway", "axhub-tool-core", "axhub-tool-sms", "axhub-tool-email", "axhub-tool-other"] + +for m in modules: + build_gradle_path = os.path.join(m, "build.gradle") + if os.path.exists(build_gradle_path): + with open(build_gradle_path, "a", encoding="utf-8") as f: + f.write(lombok_deps) + +print("Lombok added to all modules.") diff --git a/gradle_migrator.py b/gradle_migrator.py new file mode 100644 index 0000000..a73eca6 --- /dev/null +++ b/gradle_migrator.py @@ -0,0 +1,120 @@ +import os + +root_build_gradle = """plugins { + id 'java' + id 'org.springframework.boot' version '4.0.5' apply false + id 'io.spring.dependency-management' version '1.1.6' apply false +} + +allprojects { + group = 'io.shinhanlife' + version = '0.0.1-SNAPSHOT' +} + +subprojects { + apply plugin: 'java' + apply plugin: 'io.spring.dependency-management' + + java { + sourceCompatibility = '21' + } + + repositories { + mavenCentral() + } + + dependencyManagement { + imports { + mavenBom org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES + } + } + + dependencies { + compileOnly 'org.projectlombok:lombok:1.18.32' + annotationProcessor 'org.projectlombok:lombok:1.18.32' + testImplementation 'org.springframework.boot:spring-boot-starter-test' + } + + tasks.withType(JavaCompile) { + options.compilerArgs << '-parameters' + options.compilerArgs << '-Amapstruct.defaultComponentModel=spring' + } +} +""" + +with open("build.gradle", "w", encoding="utf-8") as f: + f.write(root_build_gradle) + +# axhub-common +common_build_gradle = """dependencies { + implementation 'com.fasterxml.jackson.core:jackson-databind:2.17.1' + implementation 'org.springframework.boot:spring-boot-starter-web' +} +""" +with open("axhub-common/build.gradle", "w", encoding="utf-8") as f: + f.write(common_build_gradle) + +# axhub-tool-core +core_build_gradle = """dependencies { + api project(':axhub-common') + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-data-redis' + + // Resilience4j + implementation 'io.github.resilience4j:resilience4j-spring-boot3:2.2.0' + implementation 'io.github.resilience4j:resilience4j-core:2.2.0' + implementation 'io.github.resilience4j:resilience4j-circuitbreaker:2.2.0' + implementation 'io.github.resilience4j:resilience4j-ratelimiter' + implementation 'io.github.resilience4j:resilience4j-retry:2.2.0' + implementation 'org.springframework.boot:spring-boot-starter-aop:3.3.0' + + // MCP required + implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-xml:2.17.1' +} +""" +with open("axhub-tool-core/build.gradle", "w", encoding="utf-8") as f: + f.write(core_build_gradle) + +# gateway +gateway_build_gradle = """plugins { + id 'org.springframework.boot' +} + +dependencies { + implementation project(':axhub-common') + + implementation 'org.springframework.boot:spring-boot-starter-web' + implementation 'org.springframework.boot:spring-boot-starter-data-redis' + + // MyBatis & DB + implementation 'org.springframework.boot:spring-boot-starter-jdbc' + implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.3' + runtimeOnly 'com.h2database:h2' + implementation 'p6spy:p6spy:3.9.1' + + // MapStruct + implementation "org.mapstruct:mapstruct:1.5.5.Final" + annotationProcessor "org.projectlombok:lombok-mapstruct-binding:0.2.0" + annotationProcessor "org.mapstruct:mapstruct-processor:1.5.5.Final" + + implementation 'com.networknt:json-schema-validator:1.4.0' + implementation 'org.springdoc:springdoc-openapi-starter-webmvc-ui:2.5.0' +} +""" +with open("axhub-gateway/build.gradle", "w", encoding="utf-8") as f: + f.write(gateway_build_gradle) + +# tool-sms, email, other +for tool in ["axhub-tool-sms", "axhub-tool-email", "axhub-tool-other"]: + tool_build_gradle = """plugins { + id 'org.springframework.boot' +} + +dependencies { + implementation project(':axhub-tool-core') +} +""" + with open(f"{tool}/build.gradle", "w", encoding="utf-8") as f: + f.write(tool_build_gradle) + +print("Gradle files generated.") diff --git a/msa_migrator.py b/msa_migrator.py new file mode 100644 index 0000000..fd31e39 --- /dev/null +++ b/msa_migrator.py @@ -0,0 +1,81 @@ +import os +import shutil +from pathlib import Path +import re + +def create_module_structure(base_dir, module_name): + os.makedirs(os.path.join(base_dir, module_name, "src", "main", "java"), exist_ok=True) + os.makedirs(os.path.join(base_dir, module_name, "src", "main", "resources"), exist_ok=True) + +def move_file_to_module(src_path, dest_module, dest_package): + if not os.path.exists(src_path): + return + + dest_dir = os.path.join(dest_module, "src", "main", "java", *dest_package.split(".")) + os.makedirs(dest_dir, exist_ok=True) + + file_name = os.path.basename(src_path) + dest_path = os.path.join(dest_dir, file_name) + shutil.move(src_path, dest_path) + +def move_dir_to_module(src_dir, dest_module, dest_package): + if not os.path.exists(src_dir): + return + + dest_dir = os.path.join(dest_module, "src", "main", "java", *dest_package.split(".")) + os.makedirs(dest_dir, exist_ok=True) + + for item in os.listdir(src_dir): + s = os.path.join(src_dir, item) + d = os.path.join(dest_dir, item) + if os.path.isdir(s): + shutil.copytree(s, d, dirs_exist_ok=True) + shutil.rmtree(s) + else: + shutil.move(s, d) + +if __name__ == "__main__": + print("Starting MSA Migration...") + + modules = ["axhub-common", "axhub-gateway", "axhub-tool-core", "axhub-tool-sms", "axhub-tool-email", "axhub-tool-other"] + for m in modules: + create_module_structure(".", m) + + base_pkg = "io.shinhanlife.axhub" + biz_pkg = f"{base_pkg}.biz.mcp" + src_base = os.path.join("src", "main", "java", "io", "shinhanlife", "axhub") + src_biz = os.path.join(src_base, "biz", "mcp") + + move_dir_to_module(os.path.join(src_base, "common"), "axhub-common", f"{base_pkg}.common") + move_file_to_module(os.path.join(src_biz, "adapter", "dto", "JsonRpcRequest.java"), "axhub-common", f"{biz_pkg}.adapter.dto") + move_file_to_module(os.path.join(src_biz, "adapter", "dto", "JsonRpcResponse.java"), "axhub-common", f"{biz_pkg}.adapter.dto") + move_file_to_module(os.path.join(src_biz, "adapter", "dto", "ErrorDetail.java"), "axhub-common", f"{biz_pkg}.adapter.dto") + move_file_to_module(os.path.join(src_biz, "adapter", "dto", "Params.java"), "axhub-common", f"{biz_pkg}.adapter.dto") + move_file_to_module(os.path.join(src_biz, "gateway", "dto", "ToolMetadata.java"), "axhub-common", f"{biz_pkg}.gateway.dto") + + move_dir_to_module(os.path.join(src_biz, "gateway", "controller"), "axhub-gateway", f"{biz_pkg}.gateway.controller") + move_dir_to_module(os.path.join(src_biz, "gateway", "service"), "axhub-gateway", f"{biz_pkg}.gateway.service") + move_dir_to_module(os.path.join(src_biz, "gateway", "config"), "axhub-gateway", f"{biz_pkg}.gateway.config") + + move_dir_to_module(os.path.join(src_biz, "adapter", "connector"), "axhub-tool-core", f"{biz_pkg}.adapter.connector") + move_dir_to_module(os.path.join(src_biz, "adapter", "sender"), "axhub-tool-core", f"{biz_pkg}.adapter.sender") + move_dir_to_module(os.path.join(src_biz, "adapter", "aop"), "axhub-tool-core", f"{biz_pkg}.adapter.aop") + move_dir_to_module(os.path.join(src_biz, "adapter", "util"), "axhub-tool-core", f"{biz_pkg}.adapter.util") + move_dir_to_module(os.path.join(src_biz, "adapter", "test"), "axhub-tool-core", f"{biz_pkg}.adapter.test") + move_dir_to_module(os.path.join(src_biz, "tool", "annotation"), "axhub-tool-core", f"{biz_pkg}.tool.annotation") + move_file_to_module(os.path.join(src_biz, "tool", "service", "AbstractMcpToolService.java"), "axhub-tool-core", f"{biz_pkg}.tool.service") + move_dir_to_module(os.path.join(src_biz, "tool", "controller"), "axhub-tool-core", f"{biz_pkg}.tool.controller") + + move_file_to_module(os.path.join(src_biz, "tool", "service", "SmsSendService.java"), "axhub-tool-sms", f"{biz_pkg}.tool.service") + move_file_to_module(os.path.join(src_biz, "tool", "dto", "SmsSendReq.java"), "axhub-tool-sms", f"{biz_pkg}.tool.dto") + + move_file_to_module(os.path.join(src_biz, "tool", "service", "EmailSendService.java"), "axhub-tool-email", f"{biz_pkg}.tool.service") + move_file_to_module(os.path.join(src_biz, "tool", "dto", "EmailSendReq.java"), "axhub-tool-email", f"{biz_pkg}.tool.dto") + + move_dir_to_module(os.path.join(src_biz, "tool", "service"), "axhub-tool-other", f"{biz_pkg}.tool.service") + move_dir_to_module(os.path.join(src_biz, "tool", "dto"), "axhub-tool-other", f"{biz_pkg}.tool.dto") + move_dir_to_module(os.path.join(src_biz, "tool", "util"), "axhub-tool-other", f"{biz_pkg}.tool.util") + + move_file_to_module(os.path.join(src_base, "AxHubAdminApplication.java"), "axhub-gateway", base_pkg) + + print("Migration complete.") diff --git a/settings.gradle b/settings.gradle index 5cb78ad..870b90c 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1,8 @@ rootProject.name = 'axhub-admin' + +include 'axhub-common' +include 'axhub-gateway' +include 'axhub-tool-core' +include 'axhub-tool-sms' +include 'axhub-tool-email' +include 'axhub-tool-other' diff --git a/src/main/java/io/shinhanlife/AxHubAdminApplication.java b/src/main/java/io/shinhanlife/AxHubAdminApplication.java deleted file mode 100644 index a3b0e66..0000000 --- a/src/main/java/io/shinhanlife/AxHubAdminApplication.java +++ /dev/null @@ -1,14 +0,0 @@ -package io.shinhanlife; - -import io.shinhanlife.glow.GlowMybatisMapper; -import org.mybatis.spring.annotation.MapperScan; -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -@MapperScan(basePackages = "io.shinhanlife", annotationClass = GlowMybatisMapper.class) // @GlowMybatisMapper 어노테이션이 있는 인터페이스만 스캔 -public class AxHubAdminApplication { - public static void main(String[] args) { - SpringApplication.run(AxHubAdminApplication.class, args); - } -} \ No newline at end of file diff --git a/src/main/java/io/shinhanlife/AxHubGatewayApplication.java b/src/main/java/io/shinhanlife/AxHubGatewayApplication.java deleted file mode 100644 index 736db6f..0000000 --- a/src/main/java/io/shinhanlife/AxHubGatewayApplication.java +++ /dev/null @@ -1,22 +0,0 @@ -package io.shinhanlife; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; - -import java.util.Collections; - -@SpringBootApplication -@ComponentScan(basePackages = { - "io.shinhanlife.axhub.biz.mcp.gateway", - "io.shinhanlife.axhub.biz.mcp.adapter", - "io.shinhanlife.axhub.common.mcp" -}) -public class AxHubGatewayApplication { - public static void main(String[] args) { - SpringApplication app = new SpringApplication(AxHubGatewayApplication.class); - // Gateway는 8081 포트에서 실행 - app.setDefaultProperties(Collections.singletonMap("server.port", "8081")); - app.run(args); - } -} diff --git a/src/main/java/io/shinhanlife/AxHubToolApplication.java b/src/main/java/io/shinhanlife/AxHubToolApplication.java deleted file mode 100644 index 9c68546..0000000 --- a/src/main/java/io/shinhanlife/AxHubToolApplication.java +++ /dev/null @@ -1,31 +0,0 @@ -package io.shinhanlife; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.context.annotation.ComponentScan; -import org.springframework.scheduling.annotation.EnableScheduling; - -import java.util.Collections; - -@SpringBootApplication -@EnableScheduling -@ComponentScan(basePackages = { - "io.shinhanlife.axhub.biz.mcp.tool", - "io.shinhanlife.axhub.biz.mcp.adapter", - "io.shinhanlife.axhub.common.mcp" -}) -public class AxHubToolApplication { - public static void main(String[] args) { - // 기본 포트는 8082로 설정하되, 파라미터(--server.port=808x)가 있으면 해당 포트로 설정 - String port = "8082"; - for (String arg : args) { - if (arg.startsWith("--server.port=")) { - port = arg.substring("--server.port=".length()); - } - } - System.setProperty("server.port", port); - - SpringApplication app = new SpringApplication(AxHubToolApplication.class); - app.run(args); - } -} diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/controller/MockEsbController.java b/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/controller/MockEsbController.java deleted file mode 100644 index 4aeb805..0000000 --- a/src/main/java/io/shinhanlife/axhub/biz/mcp/adapter/controller/MockEsbController.java +++ /dev/null @@ -1,24 +0,0 @@ -// [MockEsbController.java] - 로컬 테스트용 가짜 ESB 서버 -package io.shinhanlife.axhub.biz.mcp.adapter.controller; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.MediaType; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@Slf4j -@RestController -@RequestMapping("/mock/esb") -public class MockEsbController { - - // MCI (RestClient)가 이 주소로 실제 HTTP 요청을 보냅니다. - @PostMapping(value = "/api", consumes = MediaType.APPLICATION_XML_VALUE, produces = MediaType.APPLICATION_XML_VALUE) - public String mockMciResponse(@RequestBody String requestXml) { - log.info("[가짜 ESB 서버] MCI 실시간 요청 수신 완료!\n받은 데이터: {}", requestXml); - - // ESB 서버가 응답하는 것처럼 가짜 XML 전문을 리턴합니다. - return "
SUCCESS
정상 조회되었습니다.
"; - } -} \ No newline at end of file diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/client/ToolClient.java b/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/client/ToolClient.java deleted file mode 100644 index 672c48d..0000000 --- a/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/client/ToolClient.java +++ /dev/null @@ -1,167 +0,0 @@ -package io.shinhanlife.axhub.biz.mcp.gateway.client; - -import com.fasterxml.jackson.databind.ObjectMapper; -import io.shinhanlife.axhub.biz.mcp.adapter.connector.LegacyEimsConnector; -import io.shinhanlife.axhub.biz.mcp.adapter.connector.ThirdPartySecurityConnector; -import io.shinhanlife.axhub.biz.mcp.adapter.dto.JsonRpcRequest; -import io.shinhanlife.axhub.biz.mcp.adapter.dto.JsonRpcResponse; -import io.shinhanlife.axhub.biz.mcp.adapter.dto.Params; -import io.shinhanlife.axhub.biz.mcp.adapter.util.PiiMaskingUtils; -import io.shinhanlife.axhub.biz.mcp.gateway.dto.ToolMetadata; -import io.shinhanlife.axhub.common.mcp.security.SecurityProperties; -import io.shinhanlife.axhub.biz.mcp.gateway.messaging.KafkaProducerService; -import io.github.resilience4j.circuitbreaker.CircuitBreaker; -import io.github.resilience4j.circuitbreaker.CircuitBreakerConfig; -import io.github.resilience4j.circuitbreaker.CircuitBreakerRegistry; -import io.github.resilience4j.ratelimiter.RateLimiter; -import io.github.resilience4j.ratelimiter.RateLimiterConfig; -import io.github.resilience4j.ratelimiter.RateLimiterRegistry; -import io.github.resilience4j.ratelimiter.RequestNotPermitted; -import io.github.resilience4j.retry.Retry; -import io.github.resilience4j.retry.RetryConfig; -import io.github.resilience4j.retry.RetryRegistry; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.time.Duration; -import java.util.Map; -import java.util.UUID; -import java.util.function.Supplier; -import org.springframework.web.client.RestClient; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.http.HttpEntity; -import org.springframework.core.ParameterizedTypeReference; - -@Slf4j -@Component -@RequiredArgsConstructor -public class ToolClient { - - private final SecurityProperties securityProperties; - private final CircuitBreakerRegistry circuitBreakerRegistry; - private final RateLimiterRegistry rateLimiterRegistry; - private final RetryRegistry retryRegistry; - private final KafkaProducerService kafkaProducerService; - private final RestClient restClient = RestClient.builder().build(); - - private final LegacyEimsConnector legacyEimsConnector; - private final ThirdPartySecurityConnector thirdPartySecurityConnector; - private final ObjectMapper objectMapper; - - /** - * 실제 Tool Pod를 호출합니다. (동적 서킷 브레이커 및 속도 제어 적용) - */ - public Object call(Object targetPod, Map payload, Object planObj) { - log.info("[ToolClient] RPC 통신 준비 - 동적 제어 정책 적용"); - - ToolMetadata plan = (ToolMetadata) planObj; - String toolName = plan.getToolName(); - - int failureRate = plan.getFailureRateThreshold() != null ? plan.getFailureRateThreshold() : 50; - int slidingWindowSize = plan.getSlidingWindowSize() != null ? plan.getSlidingWindowSize() : 10; - - CircuitBreakerConfig cbConfig = CircuitBreakerConfig.custom() - .failureRateThreshold(failureRate) - .slidingWindowSize(slidingWindowSize) - .slidingWindowType(CircuitBreakerConfig.SlidingWindowType.COUNT_BASED) - .waitDurationInOpenState(Duration.ofSeconds(10)) - .build(); - CircuitBreaker circuitBreaker = circuitBreakerRegistry.circuitBreaker(toolName, cbConfig); - - int limitForPeriod = plan.getRateLimitForPeriod() != null ? plan.getRateLimitForPeriod() : 50; - - RateLimiterConfig rlConfig = RateLimiterConfig.custom() - .limitForPeriod(limitForPeriod) - .limitRefreshPeriod(Duration.ofSeconds(1)) - .timeoutDuration(Duration.ofMillis(0)) - .build(); - RateLimiter rateLimiter = rateLimiterRegistry.rateLimiter(toolName, rlConfig); - - RetryConfig rtConfig = RetryConfig.custom() - .maxAttempts(3) - .waitDuration(Duration.ofMillis(500)) - .build(); - Retry retry = retryRegistry.retry(toolName, rtConfig); - - String internalApiKey = securityProperties.getApiKeys().keySet().iterator().next(); - - try { - Supplier> supplier = () -> { - if (plan.getEndpoint() != null) { - Map targetMap = (Map) targetPod; - String baseUrl = (String) targetMap.get("targetUrl"); - String targetUrl = baseUrl + plan.getEndpoint(); - log.info("[ToolClient] 동적 엔드포인트 호출: {}", targetUrl); - - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - headers.set("X-API-KEY", internalApiKey); - - return restClient.post() - .uri(targetUrl) - .headers(h -> h.addAll(headers)) - .body(payload) - .retrieve() - .body(new ParameterizedTypeReference>() {}); - } else { - // 레거시 하드코딩 라우팅 (Adapter 로컬 직접 호출) - log.info("[ToolClient] 레거시 라우팅: Adapter 로컬 모듈 호출"); - try { - JsonRpcRequest request = objectMapper.convertValue(payload, JsonRpcRequest.class); - Params params = request.getParams(); - - if (params == null) { - throw new IllegalArgumentException("Invalid params"); - } - - String routingType = params.getRoutingType(); - String interfaceId = params.getInterfaceId(); - - String executionResult; - if (interfaceId != null && (interfaceId.startsWith("DRM_") || interfaceId.startsWith("BM_"))) { - executionResult = thirdPartySecurityConnector.executeSecurityModule(interfaceId, params.getData()); - } else { - executionResult = legacyEimsConnector.executeByTool(routingType, interfaceId, params.getData(), params.getSpec()); - } - - String maskedResult = PiiMaskingUtils.mask(executionResult); - - JsonRpcResponse response = new JsonRpcResponse(); - response.setId(request.getId() != null ? request.getId() : UUID.randomUUID().toString()); - response.setResult(maskedResult); - - return objectMapper.convertValue(response, Map.class); - } catch (Exception e) { - throw new RuntimeException("Adapter 로컬 호출 실패: " + e.getMessage(), e); - } - } - }; - - Supplier> rateLimitedSupplier = RateLimiter.decorateSupplier(rateLimiter, supplier); - Supplier> retryingSupplier = Retry.decorateSupplier(retry, rateLimitedSupplier); - Supplier> protectedSupplier = CircuitBreaker.decorateSupplier(circuitBreaker, retryingSupplier); - - Map response = protectedSupplier.get(); - - log.info(" [ToolClient] RPC 호출 성공 (적용된 제어기: {})", toolName); - return response; - - } catch (RequestNotPermitted e) { - log.warn(" [ToolClient] 트래픽 폭주 감지! Kafka 대기열로 요청을 전환합니다. (Tool: {})", toolName); - - String ticketId = kafkaProducerService.queueRequest("mcp.tool.execute.queue", payload); - - return Map.of( - "status", "QUEUED", - "ticketId", ticketId, - "message", "현재 트래픽 폭주로 인해 대기열에 등록되었습니다. 티켓 ID를 통해 결과를 확인해주세요." - ); - - } catch (Exception e) { - log.error(" [ToolClient] RPC 통신 실패 또는 차단됨: {}", e.getMessage()); - throw new RuntimeException("Tool Pod 호출 중 예외/차단 발생: " + e.getMessage(), e); - } - } -} diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/router/RequestValidator.java b/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/router/RequestValidator.java deleted file mode 100644 index 0af8f62..0000000 --- a/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/router/RequestValidator.java +++ /dev/null @@ -1,76 +0,0 @@ -package io.shinhanlife.axhub.biz.mcp.gateway.router; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -import java.util.List; -import java.util.Map; - -@Slf4j -@Component -public class RequestValidator { - - // 파이프라인 진입을 위해 반드시 필요한 필수 필드 목록 - private static final List REQUIRED_FIELDS = List.of("traceId", "agentId", "userPrompt"); - - public void validate(Map payload) { - log.info(" [Validator] 파라미터 및 스키마 검증 시작"); - - // 1. 페이로드 자체 Null 또는 Empty 체크 - if (payload == null || payload.isEmpty()) { - log.error(" [Validator] 검증 실패: 페이로드가 비어 있습니다."); - throw new IllegalArgumentException("요청 페이로드가 존재하지 않습니다."); - } - - // JSON-RPC 2.0 껍데기 검증 - if (!"2.0".equals(payload.get("jsonrpc"))) { - throw new IllegalArgumentException("지원하지 않는 규격입니다. 'jsonrpc': '2.0' 이 필요합니다."); - } - if (!"tools/call".equals(payload.get("method"))) { - throw new IllegalArgumentException("지원하지 않는 method 입니다. 'tools/call' 이 필요합니다."); - } - - Map params = (Map) payload.get("params"); - if (params == null || params.isEmpty()) { - throw new IllegalArgumentException("params 객체가 누락되었습니다."); - } - - Map arguments = (Map) params.get("arguments"); - if (arguments == null) { - throw new IllegalArgumentException("params.arguments 객체가 누락되었습니다."); - } - - // 2. 필수 파라미터 누락 및 빈 값 검증 (meta 내에서 검증) - Map meta = (Map) payload.get("meta"); - if (meta == null) { - throw new IllegalArgumentException("메타데이터 객체(meta)가 누락되었습니다."); - } - - for (String field : REQUIRED_FIELDS) { - if (!meta.containsKey(field)) { - log.error(" [Validator] 검증 실패: 필수 메타데이터 누락 [{}]", field); - throw new IllegalArgumentException("필수 파라미터가 누락되었습니다: " + field); - } - - Object value = meta.get(field); - if (value == null || value.toString().trim().isEmpty()) { - log.error(" [Validator] 검증 실패: 필수 메타데이터의 값이 비어 있음 [{}]", field); - throw new IllegalArgumentException("필수 파라미터의 값이 비어있을 수 없습니다: " + field); - } - } - - // 3. 비즈니스 로직에 따른 추가 데이터 길이 또는 타입 검증 (예: 프롬프트 길이) - String traceId = meta.get("traceId").toString(); - String userPrompt = meta.get("userPrompt").toString(); - - if (userPrompt.length() > 2000) { - log.warn(" [Validator] 프롬프트 길이 초과 (Trace ID: {})", traceId); - throw new IllegalArgumentException("프롬프트 길이는 2000자를 초과할 수 없습니다."); - } - - log.info(" [Validator] 스키마 검증 완료 (Trace ID: {})", traceId); - - // TODO: 향후 더 복잡한 JSON Schema 파일(schema.json) 기반의 엄격한 검증이 필요해지면, - // networknt/json-schema-validator 라이브러리를 도입하여 이 부분을 교체할 수 있습니다. - } -} diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/router/ResponseAggregator.java b/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/router/ResponseAggregator.java deleted file mode 100644 index 1a56e1e..0000000 --- a/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/router/ResponseAggregator.java +++ /dev/null @@ -1,13 +0,0 @@ -package io.shinhanlife.axhub.biz.mcp.gateway.router; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Component; - -@Slf4j -@Component -public class ResponseAggregator { - public Object normalize(Object rawResponse) { - log.info("📊 [Aggregator] 결과 병합 및 응답 포맷 정규화"); - return rawResponse; // 최종 응답 반환 - } -} diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/router/ToolRouter.java b/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/router/ToolRouter.java deleted file mode 100644 index b38d2fe..0000000 --- a/src/main/java/io/shinhanlife/axhub/biz/mcp/gateway/router/ToolRouter.java +++ /dev/null @@ -1,101 +0,0 @@ -package io.shinhanlife.axhub.biz.mcp.gateway.router; - -import io.shinhanlife.axhub.biz.mcp.gateway.dto.ToolMetadata; -import io.shinhanlife.axhub.biz.mcp.gateway.registry.RedisRegistryService; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ThreadLocalRandom; - -@Slf4j -@Component -@RequiredArgsConstructor -public class ToolRouter { - - private final RedisRegistryService redisRegistryService; - - // application.yml 등에 정의된 신한라이프 EAI 표준 게이트웨이 주소 - @Value("${shinhan.eai.gateway.url:http://eai.internal.shinhanlife.com/api/v1/invoke}") - private String eaiGatewayUrl; - - /** - * Planner에서 생성된 실행 계획(ToolMetadata)을 바탕으로 - * Client가 호출할 최종 타겟 정보(URL 및 필수 헤더/파라미터)를 라우팅합니다. - * - * @param plan ToolPlanner에서 반환한 실행 계획 (ToolMetadata) - * @return Client에게 전달될 라우팅 정보 Map (targetUrl, integrationType, mciServiceId 등) - */ - public Map route(Object plan) { - log.info("📍 [Router] 타겟 시스템 라우팅 분석 시작"); - - // 1. Planner에서 넘어온 plan을 ToolMetadata로 안전하게 캐스팅 (Java 16+ 패턴 매칭) - if (!(plan instanceof ToolMetadata toolMetadata)) { - log.error(" [Router] 잘못된 Plan 객체 타입 전달"); - throw new IllegalArgumentException("올바르지 않은 실행 계획(Plan) 타입입니다."); - } - - String toolName = toolMetadata.getToolName(); - String integrationType = toolMetadata.getIntegrationType(); - - Map routingResult = new HashMap<>(); - routingResult.put("toolName", toolName); - routingResult.put("integrationType", integrationType); - - // 2. 분기 처리: 레거시(MCI/EAI) 연동 vs 내부 직접(DIRECT) 연동 - if ("MCI_EAI".equalsIgnoreCase(integrationType)) { - // [A] MCI/EAI 연동 로직 - String mciServiceId = toolMetadata.getMciServiceId(); - if (mciServiceId == null || mciServiceId.isBlank()) { - log.error(" [Router] EAI 라우팅 실패: mciServiceId가 누락되었습니다. (Tool: {})", toolName); - throw new IllegalStateException("MCI/EAI 연동 툴의 필수값(Service ID)이 누락되었습니다."); - } - - log.info(" [Router] MCI/EAI 연계 라우팅 - Tool: {}, Service ID: {}", toolName, mciServiceId); - - // EAI 고정 서버 주소와 Service ID를 결과에 담아 Client로 전달 - routingResult.put("targetUrl", eaiGatewayUrl); - routingResult.put("mciServiceId", mciServiceId); - - } else { - // [B] 내부 마이크로서비스 직접(DIRECT) 연동 로직 - log.info(" [Router] 내부 DIRECT 연계 라우팅 - Tool: {}", toolName); - - // Redis에서 현재 살아있는 해당 툴의 활성 Pod(URL) 목록 조회 - List availablePods = redisRegistryService.getAvailablePods(toolName); - - if (availablePods == null || availablePods.isEmpty()) { - log.error(" [Router] 라우팅 실패: '{}' 툴을 처리할 수 있는 활성 Pod가 없습니다.", toolName); - throw new IllegalStateException("활성화된 대상 Tool Pod를 찾을 수 없습니다: " + toolName); - } - - // 다중 Pod 중 하나를 선택 (Random 로드밸런싱) - String targetUrl = selectPodLoadBalanced(availablePods); - log.info(" [Router] DIRECT 라우팅 완료 - 선택된 타겟 URL: {}", targetUrl); - - routingResult.put("targetUrl", targetUrl); - } - - // 3. Client 계층에서 즉시 활용할 수 있도록 라우팅 결과 반환 - return routingResult; - } - - /** - * 다중 인스턴스(Pod) 환경을 위한 클라이언트 사이드 로드밸런싱 로직 (랜덤 방식) - * - * @param availablePods 살아있는 타겟 URL 리스트 - * @return 로드밸런싱을 통해 선택된 단일 URL - */ - private String selectPodLoadBalanced(List availablePods) { - if (availablePods.size() == 1) { - return availablePods.get(0); - } - // Java ThreadLocalRandom을 사용하여 동시성 이슈 없이 난수 생성 - int randomIndex = ThreadLocalRandom.current().nextInt(availablePods.size()); - return availablePods.get(randomIndex); - } -} diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/model/ToolConfig.java b/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/model/ToolConfig.java deleted file mode 100644 index dd19c85..0000000 --- a/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/model/ToolConfig.java +++ /dev/null @@ -1,21 +0,0 @@ -package io.shinhanlife.axhub.biz.mcp.tool.model; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.Setter; - -import java.util.List; - -@Getter -@Setter -@AllArgsConstructor -public class ToolConfig { - private String name; - private String description; - private String path; - private String group; - - // 추가: 레거시 통신용 동적 설정 - private String routingType; - private List functions; -} diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/model/ToolFunction.java b/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/model/ToolFunction.java deleted file mode 100644 index 85fa082..0000000 --- a/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/model/ToolFunction.java +++ /dev/null @@ -1,15 +0,0 @@ -package io.shinhanlife.axhub.biz.mcp.tool.model; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -@AllArgsConstructor -public class ToolFunction { - private String name; - private String description; - private String interfaceId; - private String parameterSchema; -} diff --git a/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/registry/MockToolAutoRegistrar.java b/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/registry/MockToolAutoRegistrar.java deleted file mode 100644 index a155457..0000000 --- a/src/main/java/io/shinhanlife/axhub/biz/mcp/tool/registry/MockToolAutoRegistrar.java +++ /dev/null @@ -1,191 +0,0 @@ -package io.shinhanlife.axhub.biz.mcp.tool.registry; - -import io.shinhanlife.axhub.biz.mcp.tool.annotation.McpFunction; -import io.shinhanlife.axhub.biz.mcp.tool.annotation.McpTool; -import io.shinhanlife.axhub.biz.mcp.gateway.dto.ToolMetadata; -import com.fasterxml.jackson.databind.ObjectMapper; -import io.shinhanlife.axhub.biz.mcp.tool.util.JsonSchemaGenerator; - -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.context.event.ApplicationReadyEvent; -import org.springframework.context.ApplicationContext; -import org.springframework.context.event.ContextClosedEvent; -import org.springframework.context.event.EventListener; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Component; -import org.springframework.web.client.RestClient; - -import jakarta.annotation.PostConstruct; -import java.lang.reflect.Method; -import java.util.*; - -@Slf4j -@Component -public class MockToolAutoRegistrar { - - private final RestClient restClient = RestClient.builder().build(); - private final ApplicationContext applicationContext; - private final ObjectMapper objectMapper; - - @Value("${mcp.gateway.url:http://localhost:8081/mcp/api/v1}") - private String gatewayUrl; - private final String API_KEY = "SHINHAN_MCP_TEST_KEY_9999"; - - @Value("${server.port:8081}") - private int serverPort; - - @Value("${mcp.tool.target:all}") - private String toolTarget; - - @Value("${mcp.tool.host:localhost}") - private String toolHost; - - private List registeredTools = new ArrayList<>(); - - public MockToolAutoRegistrar(ApplicationContext applicationContext, ObjectMapper objectMapper) { - this.applicationContext = applicationContext; - this.objectMapper = objectMapper; - } - - private HttpHeaders createHeaders() { - HttpHeaders headers = new HttpHeaders(); - headers.setContentType(MediaType.APPLICATION_JSON); - headers.set("X-API-KEY", API_KEY); - return headers; - } - - @EventListener(ApplicationReadyEvent.class) - public void registerOnStartup() { - if (serverPort == 8081) return; - - log.info("[MockTool] Tool Pod 기동 완료! (Port: {})", serverPort); - registeredTools.clear(); - - for (Object bean : applicationContext.getBeansWithAnnotation(McpTool.class).values()) { - McpTool mcpTool = bean.getClass().getAnnotation(McpTool.class); - if (!"all".equals(toolTarget) && !mcpTool.name().equals(toolTarget) && !mcpTool.group().equals(toolTarget)) { - continue; - } - - for (Method method : bean.getClass().getDeclaredMethods()) { - if (method.isAnnotationPresent(McpFunction.class)) { - McpFunction mcpFunc = method.getAnnotation(McpFunction.class); - - ToolMetadata myMetadata = new ToolMetadata(); - myMetadata.setToolName(mcpFunc.name()); // Function -> Tool로 승격 - myMetadata.setDescription(mcpFunc.description()); - myMetadata.setDomainGroup(mcpTool.group()); - myMetadata.setEndpoint("/api/tool/execute/" + mcpFunc.name()); - myMetadata.setPodUrl("http://" + toolHost + ":" + serverPort); - myMetadata.setIntegrationType(mcpTool.routingType()); - myMetadata.setFailureRateThreshold(50); - myMetadata.setSlidingWindowSize(20); - myMetadata.setRateLimitForPeriod(100); - - Map actionPrompts = new HashMap<>(); - actionPrompts.put(mcpFunc.name(), mcpFunc.prompt()); - myMetadata.setActionPrompts(actionPrompts); - - Map parametersSchema = new HashMap<>(); - parametersSchema.put("type", "object"); - Map aggregatedProperties = new HashMap<>(); - - if (method.getParameterCount() > 0) { - Class paramType = method.getParameterTypes()[0]; - if (!Map.class.isAssignableFrom(paramType)) { - // DTO 기반 스키마 (비즈니스 파라미터만) - Map autoSchema = JsonSchemaGenerator.generatePropertiesSchema(paramType); - aggregatedProperties.putAll(autoSchema); - } else { - String schemaJson = mcpFunc.parameterSchema(); - if (!"{}".equals(schemaJson)) { - try { - @SuppressWarnings("unchecked") - Map schemaMap = objectMapper.readValue(schemaJson, Map.class); - aggregatedProperties.putAll(schemaMap); - } catch (Exception e) { - log.error(" [MockTool] 스키마 파싱 실패 {}: {}", mcpFunc.name(), e.getMessage()); - } - } - } - } - - parametersSchema.put("properties", aggregatedProperties); - myMetadata.setParametersSchema(parametersSchema); - - try { - String registerUrl = gatewayUrl + "/registry/register"; - restClient.post() - .uri(registerUrl) - .headers(h -> h.addAll(createHeaders())) - .body(myMetadata) - .retrieve() - .body(String.class); - log.info(" [MockTool] 함수 툴 승격 및 등록 성공: {} (Pod: {})", mcpFunc.name(), myMetadata.getPodUrl()); - registeredTools.add(mcpFunc.name()); - } catch (Exception e) { - log.error(" [MockTool] {} 등록 실패: {}", mcpFunc.name(), e.getMessage()); - } - } - } - } - log.info(""); - } - - @Scheduled(fixedRate = 30000) - public void sendHeartbeat() { - if (serverPort == 8081) return; - - HttpHeaders headers = createHeaders(); - headers.setContentType(MediaType.TEXT_PLAIN); - - boolean needsReRegistration = false; - for (String toolName : registeredTools) { - try { - String heartbeatUrl = gatewayUrl + "/registry/heartbeat"; - restClient.post() - .uri(heartbeatUrl) - .headers(h -> h.addAll(headers)) - .body(toolName) - .retrieve() - .body(String.class); - log.info(" [MockTool] {} Heartbeat 전송 완료", toolName); - } catch (Exception e) { - log.error(" [MockTool] {} Heartbeat 전송 실패: {}", toolName, e.getMessage()); - needsReRegistration = true; - } - } - - if (needsReRegistration) { - log.info(" [MockTool] 하트비트 실패로 재등록을 시도합니다."); - registerOnStartup(); - } - } - - @EventListener(ContextClosedEvent.class) - public void deregisterOnShutdown() { - if (serverPort == 8081) return; - - log.info("\n [MockTool] Tool Pod (Port: {}) 종료 중...", serverPort); - HttpHeaders headers = createHeaders(); - headers.setContentType(MediaType.TEXT_PLAIN); - - for (String toolName : registeredTools) { - try { - String deregisterUrl = gatewayUrl + "/registry/deregister"; - restClient.post() - .uri(deregisterUrl) - .headers(h -> h.addAll(headers)) - .body(toolName) - .retrieve() - .body(String.class); - log.info(" [MockTool] {} 명시적 해제 성공!", toolName); - } catch (Exception e) { - log.error(" [MockTool] {} 해제 실패: {}", toolName, e.getMessage()); - } - } - } -} diff --git a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/converter/MenuConverter.java b/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/converter/MenuConverter.java deleted file mode 100644 index ddbb8fe..0000000 --- a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/converter/MenuConverter.java +++ /dev/null @@ -1,19 +0,0 @@ -package io.shinhanlife.axhub.biz.sm.mmg.converter; - -import io.shinhanlife.axhub.biz.sm.mmg.dto.MenuInDto; -import io.shinhanlife.axhub.biz.sm.mmg.dto.MenuListDto; -import io.shinhanlife.axhub.biz.sm.mmg.presentation.io.SmMmg0000M01RRequest; -import io.shinhanlife.axhub.biz.sm.mmg.presentation.io.SmMmg0000M01RResponse; -import org.mapstruct.Mapper; - - -@Mapper(componentModel = "spring") -public abstract class MenuConverter { - - public abstract MenuInDto smMmg0000M01RRequestToMenuInDto(SmMmg0000M01RRequest req); - - public abstract MenuListDto smMmg0000M01RResponseToMenuListDto(SmMmg0000M01RResponse res); - - public abstract SmMmg0000M01RResponse menuListDtoeToSmMmg0000M01RResponse(MenuListDto res); - -} \ No newline at end of file diff --git a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/domain/model/ZtMenu.java b/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/domain/model/ZtMenu.java deleted file mode 100644 index b956976..0000000 --- a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/domain/model/ZtMenu.java +++ /dev/null @@ -1,61 +0,0 @@ -package io.shinhanlife.axhub.biz.sm.mmg.domain.model; - -import io.shinhanlife.glow.db.dto.AuditInfo; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -/** - * ZtMenu은 ZT_MENU 테이블을 매핑하는 Entity 클래스입니다. - * 이 클래스는 테이블의 컬럼을 Java 필드로 매핑합니다. - * - * @Data: Lombok을 통해 getter, setter 등을 자동 생성. - */ -@Getter -@Builder -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@AllArgsConstructor -public class ZtMenu extends AuditInfo { - - // 메뉴 ID (PK) - private Integer menuId; - - // 부모 메뉴 ID (FK) - private Integer parentMenuId; - - // 컴포넌트 이름 - private String name; - - // 라우트 경로 - private String path; - - // 메뉴 이름 - private String title; - - // 메뉴 아이콘 - private String icon; - - // 메뉴 숨김 여부 (Y/N) - private String isHide; - - // 탭 숨김 여부 (Y/N) - private String isHideTab; - - // 링크 - private String link; - - // iframe 여부 (Y/N) - private String isIframe; - - // 캐시 여부 (Y/N) - private String keepAlive; - - // 메뉴 표시 순서 - private Integer orderSeq; - - // 활성 여부 (Y/N) - private String isActive; - -} \ No newline at end of file diff --git a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/domain/repository/MenuRepository.java b/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/domain/repository/MenuRepository.java deleted file mode 100644 index b57c7ef..0000000 --- a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/domain/repository/MenuRepository.java +++ /dev/null @@ -1,25 +0,0 @@ -package io.shinhanlife.axhub.biz.sm.mmg.domain.repository; - -import io.shinhanlife.axhub.biz.sm.mmg.dto.MenuInDto; -import io.shinhanlife.axhub.biz.sm.mmg.dto.MenuOutDto; -import io.shinhanlife.axhub.biz.sm.mmg.dto.MenuSaveInDto; -import io.shinhanlife.glow.GlowMybatisMapper; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - - -@GlowMybatisMapper -public interface MenuRepository { - - List selectMenu(MenuInDto dto); - - MenuOutDto selectMenuById(@Param("menuId") Integer menuId); - - void insertMenu(MenuSaveInDto dto); - - void updateMenu(MenuSaveInDto dto); - - void deleteMenu(@Param("menuId") Integer menuId); - -} \ No newline at end of file diff --git a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/domain/service/impl/MenuService.java b/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/domain/service/impl/MenuService.java deleted file mode 100644 index bbf8947..0000000 --- a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/domain/service/impl/MenuService.java +++ /dev/null @@ -1,20 +0,0 @@ -package io.shinhanlife.axhub.biz.sm.mmg.domain.service.impl; - - -import io.shinhanlife.axhub.biz.sm.mmg.dto.MenuInDto; -import io.shinhanlife.axhub.biz.sm.mmg.dto.MenuListDto; -import io.shinhanlife.axhub.biz.sm.mmg.dto.MenuOutDto; -import io.shinhanlife.axhub.biz.sm.mmg.dto.MenuSaveInDto; - -import java.util.List; - -public interface MenuService { - - List selectMenu(MenuInDto dto); - - MenuOutDto findById(Integer menuId); - - Integer save(MenuSaveInDto dto); - - void delete(Integer menuId); -} \ No newline at end of file diff --git a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/domain/service/impl/MenuServiceImpl.java b/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/domain/service/impl/MenuServiceImpl.java deleted file mode 100644 index cae6f0f..0000000 --- a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/domain/service/impl/MenuServiceImpl.java +++ /dev/null @@ -1,117 +0,0 @@ -package io.shinhanlife.axhub.biz.sm.mmg.domain.service.impl; - - -import io.shinhanlife.axhub.biz.sm.mmg.domain.repository.MenuRepository; -import io.shinhanlife.axhub.biz.sm.mmg.dto.MenuInDto; -import io.shinhanlife.axhub.biz.sm.mmg.dto.MenuListDto; -import io.shinhanlife.axhub.biz.sm.mmg.dto.MenuOutDto; -import io.shinhanlife.axhub.biz.sm.mmg.dto.MenuSaveInDto; -import io.shinhanlife.axhub.common.util.SessionUtil; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -import java.util.ArrayList; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.stream.Collectors; - -@Service -@RequiredArgsConstructor -public class MenuServiceImpl implements MenuService { - - private final MenuRepository menuRepository; - - @Override - public List selectMenu(MenuInDto dto) { - List allMenus = menuRepository.selectMenu(dto); - - // 비루트 메뉴(부모 ID가 null이 아닌)만 그룹핑하여 맵 생성 - Map> menuMap = allMenus.stream() - .filter(menu -> menu.getParentMenuId() != null) - .collect(Collectors.groupingBy(MenuOutDto::getParentMenuId)); - - // 루트 메뉴 (parentMenuId == null) - List roots = allMenus.stream() - .filter(menu -> menu.getParentMenuId() == null) - .collect(Collectors.toList()); - - // 트리 빌드 - List menuList = buildTree(roots, menuMap); - - return menuList; - } - - private List buildTree(List menus, Map> menuMap) { - List dtos = new ArrayList<>(); - for (MenuOutDto menu : menus) { - MenuListDto dto = convertToDto(menu); - List children = menuMap.getOrDefault(menu.getMenuId(), new ArrayList<>()); - if (!children.isEmpty()) { - dto.setChildren(buildTree(children, menuMap)); - } - dtos.add(dto); - } - return dtos; - } - - @Override - public MenuOutDto findById(Integer menuId) { - return menuRepository.selectMenuById(menuId); - } - - @Override - @Transactional - public Integer save(MenuSaveInDto dto) { - Date now = new Date(); - String prafNo = SessionUtil.getPrafNo(); - String ognzNo = SessionUtil.getOgnzNo(); - - if (dto.getIsActive() == null) dto.setIsActive("Y"); - if (dto.getIsHide() == null) dto.setIsHide("N"); - if (dto.getIsHideTab() == null) dto.setIsHideTab("N"); - if (dto.getIsIframe() == null) dto.setIsIframe("N"); - if (dto.getKeepAlive() == null) dto.setKeepAlive("N"); - if (dto.getOrderSeq() == null) dto.setOrderSeq(0); - - dto.setSystChgDt(now); - dto.setSystChgPrafNo(prafNo); - dto.setSystChgOgnzNo(ognzNo); - dto.setSystChgSystCd("AXH"); - dto.setSystChgPrgrId("SMNMG0100M"); - - if (dto.getMenuId() == null) { - dto.setSystRgiDt(now); - dto.setSystRgiPrafNo(prafNo); - dto.setSystRgiOgnzNo(ognzNo); - dto.setSystRgiSystCd("AXH"); - dto.setSystRgiPrgrId("SMNMG0100M"); - menuRepository.insertMenu(dto); - } else { - menuRepository.updateMenu(dto); - } - return dto.getMenuId(); - } - - @Override - @Transactional - public void delete(Integer menuId) { - menuRepository.deleteMenu(menuId); - } - - private MenuListDto convertToDto(MenuOutDto menu) { - MenuListDto.Meta meta = new MenuListDto.Meta(); - meta.setTitle(menu.getTitle()); - meta.setIcon(menu.getIcon()); - meta.setHide("Y".equals(menu.getIsHide())); - meta.setHideTab("Y".equals(menu.getIsHideTab())); - meta.setLink(menu.getLink()); - meta.setIframe("Y".equals(menu.getIsIframe())); - meta.setKeepAlive("Y".equals(menu.getKeepAlive())); - meta.setOrderSeq(menu.getOrderSeq()); - meta.setActive("Y".equals(menu.getIsActive())); - return MenuListDto.builder().id(menu.getMenuId()).name(menu.getName()).path(menu.getPath()).meta(meta).build(); - } - -} diff --git a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/dto/MenuInDto.java b/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/dto/MenuInDto.java deleted file mode 100644 index 2280ddd..0000000 --- a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/dto/MenuInDto.java +++ /dev/null @@ -1,22 +0,0 @@ -package io.shinhanlife.axhub.biz.sm.mmg.dto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -@Builder -@AllArgsConstructor -public class MenuInDto { - - public MenuInDto() { - setIsActive("Y"); - } - - private String isActive; // 기본 활성 메뉴만 - private String path; // 라우트 경로 - private String title; // 기본 활성 메뉴만 - -} diff --git a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/dto/MenuListDto.java b/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/dto/MenuListDto.java deleted file mode 100644 index 6011250..0000000 --- a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/dto/MenuListDto.java +++ /dev/null @@ -1,90 +0,0 @@ -package io.shinhanlife.axhub.biz.sm.mmg.dto; - -import com.fasterxml.jackson.annotation.JsonProperty; -import java.util.List; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -/** - * MenuDto는 Vue의 MenuListType에 맞춘 DTO입니다. - * 트리 구조를 지원하며, meta 객체 포함. - * @Data: Lombok을 통해 getter, setter 등을 자동 생성. - */ -@Getter -@Setter -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class MenuListDto { - private Integer id; - private Integer parentMenuId; - private String name; - private String path; - private Meta meta; - private List children; - - @Getter - @Setter - @Builder - @NoArgsConstructor - @AllArgsConstructor - public static class Meta { - private String title; - private String icon; - private boolean showBadge; - private String showTextBadge; - private boolean hide; - private boolean hideTab; - private String link; - private boolean iframe; - private boolean keepAlive; - - // 메뉴 표시 순서 - private Integer orderSeq; - // 활성 여부 - private boolean isActive; - - @JsonProperty("isHide") - public boolean isHide() { - return hide; - } - - @JsonProperty("isHide") - public void setHide(boolean hide) { - this.hide = hide; - } - - @JsonProperty("isHideTab") - public boolean isHideTab() { - return hideTab; - } - - @JsonProperty("isHideTab") - public void setHideTab(boolean hideTab) { - this.hideTab = hideTab; - } - - @JsonProperty("isIframe") - public boolean isIframe() { - return iframe; - } - - @JsonProperty("isIframe") - public void setIframe(boolean iframe) { - this.iframe = iframe; - } - - @JsonProperty("isActive") - public boolean isActive() { - return isActive; - } - - @JsonProperty("isActive") - public void setActive(boolean isActive) { - this.isActive = isActive; - } - } -} \ No newline at end of file diff --git a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/dto/MenuOutDto.java b/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/dto/MenuOutDto.java deleted file mode 100644 index 5d0c4d3..0000000 --- a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/dto/MenuOutDto.java +++ /dev/null @@ -1,53 +0,0 @@ -package io.shinhanlife.axhub.biz.sm.mmg.dto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -@Builder -@AllArgsConstructor -public class MenuOutDto { - - // 메뉴 ID (PK) - private Integer menuId; - - // 부모 메뉴 ID (FK) - private Integer parentMenuId; - - // 컴포넌트 이름 - private String name; - - // 라우트 경로 - private String path; - - // 메뉴 이름 - private String title; - - // 메뉴 아이콘 - private String icon; - - // 메뉴 숨김 여부 (Y/N) - private String isHide; - - // 탭 숨김 여부 (Y/N) - private String isHideTab; - - // 링크 - private String link; - - // iframe 여부 (Y/N) - private String isIframe; - - // 캐시 여부 (Y/N) - private String keepAlive; - - // 메뉴 표시 순서 - private Integer orderSeq; - - // 활성 여부 (Y/N) - private String isActive; - -} diff --git a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/dto/MenuSaveInDto.java b/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/dto/MenuSaveInDto.java deleted file mode 100644 index c6400c3..0000000 --- a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/dto/MenuSaveInDto.java +++ /dev/null @@ -1,39 +0,0 @@ -package io.shinhanlife.axhub.biz.sm.mmg.dto; - -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -import java.util.Date; - -@Getter -@Setter -@NoArgsConstructor -public class MenuSaveInDto { - - private Integer menuId; - private Integer parentMenuId; - private String name; - private String path; - private String title; - private String icon; - private String isHide; - private String isHideTab; - private String link; - private String isIframe; - private String keepAlive; - private Integer orderSeq; - private String isActive; - - private Date systRgiDt; - private String systRgiPrafNo; - private String systRgiOgnzNo; - private String systRgiSystCd; - private String systRgiPrgrId; - - private Date systChgDt; - private String systChgPrafNo; - private String systChgOgnzNo; - private String systChgSystCd; - private String systChgPrgrId; -} \ No newline at end of file diff --git a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/presentation/SmMmg0000MController.java b/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/presentation/SmMmg0000MController.java deleted file mode 100644 index f8b1fb5..0000000 --- a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/presentation/SmMmg0000MController.java +++ /dev/null @@ -1,30 +0,0 @@ -package io.shinhanlife.axhub.biz.sm.mmg.presentation; - -import io.shinhanlife.axhub.biz.sm.mmg.presentation.io.SmMmg0000M01RRequest; -import io.shinhanlife.axhub.biz.sm.mmg.presentation.io.SmMmg0000M01RResponse; -import io.shinhanlife.axhub.biz.sm.mmg.usecase.SmMmg0000MUseCase; -import io.shinhanlife.glow.BaseResponse; -import io.shinhanlife.glow.GlowControllerId; -import java.util.List; - -import io.shinhanlife.glow.ResponseUtil; -import lombok.RequiredArgsConstructor; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; - - -@RestController -@RequiredArgsConstructor -public class SmMmg0000MController { - - private final SmMmg0000MUseCase smMmg0000MUseCase; - - @PostMapping("SMMMG0000M01R") - @GlowControllerId("SMMMG0000M01R") - public ResponseEntity>> SMMMG0000M01R(@RequestBody SmMmg0000M01RRequest req) { - return ResponseUtil.ok(smMmg0000MUseCase.selectMenu(req)); - } - -} \ No newline at end of file diff --git a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/presentation/SmNmg0100MController.java b/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/presentation/SmNmg0100MController.java deleted file mode 100644 index c43c37e..0000000 --- a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/presentation/SmNmg0100MController.java +++ /dev/null @@ -1,47 +0,0 @@ -package io.shinhanlife.axhub.biz.sm.mmg.presentation; - -import io.shinhanlife.axhub.biz.sm.mmg.presentation.io.SmNmg0100M01DRequest; -import io.shinhanlife.axhub.biz.sm.mmg.presentation.io.SmNmg0100M01RRequest; -import io.shinhanlife.axhub.biz.sm.mmg.presentation.io.SmNmg0100M01RResponse; -import io.shinhanlife.axhub.biz.sm.mmg.presentation.io.SmNmg0100M01SRequest; -import io.shinhanlife.axhub.biz.sm.mmg.presentation.io.SmNmg0100M01SResponse; -import io.shinhanlife.axhub.biz.sm.mmg.usecase.SmNmg0100MUseCase; -import io.shinhanlife.glow.BaseResponse; -import io.shinhanlife.glow.GlowControllerId; -import io.shinhanlife.glow.ResponseUtil; -import lombok.RequiredArgsConstructor; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RestController; - -import java.util.List; - -@RestController -@RequiredArgsConstructor -public class SmNmg0100MController { - - private final SmNmg0100MUseCase useCase; - - @PostMapping("SMNMG0100M01R") - @GlowControllerId("SMNMG0100M01R") - public ResponseEntity>> SMNMG0100M01R( - @RequestBody SmNmg0100M01RRequest req) { - return ResponseUtil.ok(useCase.selectMenu(req)); - } - - @PostMapping("SMNMG0100M01S") - @GlowControllerId("SMNMG0100M01S") - public ResponseEntity> SMNMG0100M01S( - @RequestBody SmNmg0100M01SRequest req) { - return ResponseUtil.ok(useCase.saveMenu(req)); - } - - @PostMapping("SMNMG0100M01D") - @GlowControllerId("SMNMG0100M01D") - public ResponseEntity> SMNMG0100M01D( - @RequestBody SmNmg0100M01DRequest req) { - useCase.deleteMenu(req); - return ResponseUtil.ok(null); - } -} diff --git a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/presentation/io/SmMmg0000M01RRequest.java b/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/presentation/io/SmMmg0000M01RRequest.java deleted file mode 100644 index 1368d6a..0000000 --- a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/presentation/io/SmMmg0000M01RRequest.java +++ /dev/null @@ -1,19 +0,0 @@ -package io.shinhanlife.axhub.biz.sm.mmg.presentation.io; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; - -@Getter -@Builder -@AllArgsConstructor -public class SmMmg0000M01RRequest { - - public SmMmg0000M01RRequest() { - this.isActive = "Y"; - } - - private String isActive; // 기본 활성 메뉴만 - private String path; // 라우트 경로 - private String title; // 기본 활성 메뉴만 -} diff --git a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/presentation/io/SmMmg0000M01RResponse.java b/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/presentation/io/SmMmg0000M01RResponse.java deleted file mode 100644 index ae7a88c..0000000 --- a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/presentation/io/SmMmg0000M01RResponse.java +++ /dev/null @@ -1,87 +0,0 @@ -package io.shinhanlife.axhub.biz.sm.mmg.presentation.io; - -import com.fasterxml.jackson.annotation.JsonProperty; -import io.shinhanlife.axhub.biz.sm.mmg.dto.MenuListDto; -import java.util.List; -import lombok.AccessLevel; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -@Getter -@Builder -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@AllArgsConstructor -public class SmMmg0000M01RResponse { - - private Integer id; - private Integer parentMenuId; - private String name; - private String path; - private MenuListDto.Meta meta; - private List children; - - @Getter - @Setter - @Builder - @NoArgsConstructor - @AllArgsConstructor - public static class Meta { - private String title; - private String icon; - private boolean showBadge; - private String showTextBadge; - private boolean hide; - private boolean hideTab; - private String link; - private boolean iframe; - private boolean keepAlive; - - // 메뉴 표시 순서 - private Integer orderSeq; - // 활성 여부 - private boolean isActive; - - @JsonProperty("isHide") - public boolean isHide() { - return hide; - } - - @JsonProperty("isHide") - public void setHide(boolean hide) { - this.hide = hide; - } - - @JsonProperty("isHideTab") - public boolean isHideTab() { - return hideTab; - } - - @JsonProperty("isHideTab") - public void setHideTab(boolean hideTab) { - this.hideTab = hideTab; - } - - @JsonProperty("isIframe") - public boolean isIframe() { - return iframe; - } - - @JsonProperty("isIframe") - public void setIframe(boolean iframe) { - this.iframe = iframe; - } - - @JsonProperty("isActive") - public boolean isActive() { - return isActive; - } - - @JsonProperty("isActive") - public void setActive(boolean isActive) { - this.isActive = isActive; - } - } -} \ No newline at end of file diff --git a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/presentation/io/SmNmg0100M01DRequest.java b/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/presentation/io/SmNmg0100M01DRequest.java deleted file mode 100644 index 1080167..0000000 --- a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/presentation/io/SmNmg0100M01DRequest.java +++ /dev/null @@ -1,11 +0,0 @@ -package io.shinhanlife.axhub.biz.sm.mmg.presentation.io; - -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -public class SmNmg0100M01DRequest { - - private Integer menuId; -} \ No newline at end of file diff --git a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/presentation/io/SmNmg0100M01RRequest.java b/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/presentation/io/SmNmg0100M01RRequest.java deleted file mode 100644 index 361c7dd..0000000 --- a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/presentation/io/SmNmg0100M01RRequest.java +++ /dev/null @@ -1,13 +0,0 @@ -package io.shinhanlife.axhub.biz.sm.mmg.presentation.io; - -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -public class SmNmg0100M01RRequest { - - private String isActive; - private String path; - private String title; -} diff --git a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/presentation/io/SmNmg0100M01RResponse.java b/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/presentation/io/SmNmg0100M01RResponse.java deleted file mode 100644 index e68ffa0..0000000 --- a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/presentation/io/SmNmg0100M01RResponse.java +++ /dev/null @@ -1,70 +0,0 @@ -package io.shinhanlife.axhub.biz.sm.mmg.presentation.io; - -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; -import lombok.Setter; - -import java.util.List; - -@Getter -@Setter -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class SmNmg0100M01RResponse { - - private Integer id; - private Integer parentMenuId; - private String name; - private String path; - private Meta meta; - private List children; - - @Getter - @Setter - @Builder - @NoArgsConstructor - @AllArgsConstructor - public static class Meta { - private String title; - private String icon; - private String link; - private Integer orderSeq; - - private boolean hide; - private boolean hideTab; - private boolean iframe; - private boolean keepAlive; - private boolean active; - - @JsonProperty("isHide") - public boolean isHide() { return hide; } - - @JsonProperty("isHide") - public void setHide(boolean hide) { this.hide = hide; } - - @JsonProperty("isHideTab") - public boolean isHideTab() { return hideTab; } - - @JsonProperty("isHideTab") - public void setHideTab(boolean hideTab) { this.hideTab = hideTab; } - - @JsonProperty("isIframe") - public boolean isIframe() { return iframe; } - - @JsonProperty("isIframe") - public void setIframe(boolean iframe) { this.iframe = iframe; } - - @JsonProperty("keepAlive") - public boolean isKeepAlive() { return keepAlive; } - - @JsonProperty("isActive") - public boolean isActive() { return active; } - - @JsonProperty("isActive") - public void setActive(boolean active) { this.active = active; } - } -} diff --git a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/presentation/io/SmNmg0100M01SRequest.java b/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/presentation/io/SmNmg0100M01SRequest.java deleted file mode 100644 index 994e2b3..0000000 --- a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/presentation/io/SmNmg0100M01SRequest.java +++ /dev/null @@ -1,23 +0,0 @@ -package io.shinhanlife.axhub.biz.sm.mmg.presentation.io; - -import lombok.Getter; -import lombok.Setter; - -@Getter -@Setter -public class SmNmg0100M01SRequest { - - private Integer menuId; - private Integer parentMenuId; - private String name; - private String path; - private String title; - private String icon; - private String isHide; - private String isHideTab; - private String link; - private String isIframe; - private String keepAlive; - private Integer orderSeq; - private String isActive; -} \ No newline at end of file diff --git a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/presentation/io/SmNmg0100M01SResponse.java b/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/presentation/io/SmNmg0100M01SResponse.java deleted file mode 100644 index 70c36c6..0000000 --- a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/presentation/io/SmNmg0100M01SResponse.java +++ /dev/null @@ -1,15 +0,0 @@ -package io.shinhanlife.axhub.biz.sm.mmg.presentation.io; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@Builder -@NoArgsConstructor -@AllArgsConstructor -public class SmNmg0100M01SResponse { - - private Integer menuId; -} \ No newline at end of file diff --git a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/usecase/SmMmg0000MUseCase.java b/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/usecase/SmMmg0000MUseCase.java deleted file mode 100644 index ed86391..0000000 --- a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/usecase/SmMmg0000MUseCase.java +++ /dev/null @@ -1,12 +0,0 @@ -package io.shinhanlife.axhub.biz.sm.mmg.usecase; - - -import io.shinhanlife.axhub.biz.sm.mmg.presentation.io.SmMmg0000M01RRequest; -import io.shinhanlife.axhub.biz.sm.mmg.presentation.io.SmMmg0000M01RResponse; - -import java.util.List; - -public interface SmMmg0000MUseCase { - - public List selectMenu(SmMmg0000M01RRequest req); -} diff --git a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/usecase/SmNmg0100MUseCase.java b/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/usecase/SmNmg0100MUseCase.java deleted file mode 100644 index f4e148a..0000000 --- a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/usecase/SmNmg0100MUseCase.java +++ /dev/null @@ -1,18 +0,0 @@ -package io.shinhanlife.axhub.biz.sm.mmg.usecase; - -import io.shinhanlife.axhub.biz.sm.mmg.presentation.io.SmNmg0100M01DRequest; -import io.shinhanlife.axhub.biz.sm.mmg.presentation.io.SmNmg0100M01RRequest; -import io.shinhanlife.axhub.biz.sm.mmg.presentation.io.SmNmg0100M01RResponse; -import io.shinhanlife.axhub.biz.sm.mmg.presentation.io.SmNmg0100M01SRequest; -import io.shinhanlife.axhub.biz.sm.mmg.presentation.io.SmNmg0100M01SResponse; - -import java.util.List; - -public interface SmNmg0100MUseCase { - - List selectMenu(SmNmg0100M01RRequest req); - - SmNmg0100M01SResponse saveMenu(SmNmg0100M01SRequest req); - - void deleteMenu(SmNmg0100M01DRequest req); -} \ No newline at end of file diff --git a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/usecase/impl/SmMmg0000MUseCaseImpl.java b/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/usecase/impl/SmMmg0000MUseCaseImpl.java deleted file mode 100644 index 6591343..0000000 --- a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/usecase/impl/SmMmg0000MUseCaseImpl.java +++ /dev/null @@ -1,38 +0,0 @@ -package io.shinhanlife.axhub.biz.sm.mmg.usecase.impl; - -import java.util.ArrayList; -import java.util.List; - -import io.shinhanlife.axhub.biz.sm.mmg.converter.MenuConverter; -import io.shinhanlife.axhub.biz.sm.mmg.domain.service.impl.MenuService; -import io.shinhanlife.axhub.biz.sm.mmg.dto.MenuInDto; -import io.shinhanlife.axhub.biz.sm.mmg.dto.MenuListDto; -import io.shinhanlife.axhub.biz.sm.mmg.presentation.io.SmMmg0000M01RRequest; -import io.shinhanlife.axhub.biz.sm.mmg.presentation.io.SmMmg0000M01RResponse; -import io.shinhanlife.axhub.biz.sm.mmg.usecase.SmMmg0000MUseCase; -import io.shinhanlife.glow.GlowServiceGroupId; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -@Service -@RequiredArgsConstructor -@GlowServiceGroupId(value = "SmMmgc", description="SmMmg") -public class SmMmg0000MUseCaseImpl implements SmMmg0000MUseCase { - - private final MenuService menuService; - private final MenuConverter converter; - - @Override - public List selectMenu(SmMmg0000M01RRequest req) { - List result = new ArrayList<>(); - MenuInDto dto = converter.smMmg0000M01RRequestToMenuInDto(req); - List menuListDtos = menuService.selectMenu(dto); - - - - for (MenuListDto menuListDto : menuListDtos) { - result.add(converter.menuListDtoeToSmMmg0000M01RResponse(menuListDto)); - } - return result; - } -} diff --git a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/usecase/impl/SmNmg0100MUseCaseImpl.java b/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/usecase/impl/SmNmg0100MUseCaseImpl.java deleted file mode 100644 index 4fe3ce3..0000000 --- a/src/main/java/io/shinhanlife/axhub/biz/sm/mmg/usecase/impl/SmNmg0100MUseCaseImpl.java +++ /dev/null @@ -1,93 +0,0 @@ -package io.shinhanlife.axhub.biz.sm.mmg.usecase.impl; - -import io.shinhanlife.axhub.biz.sm.mmg.domain.service.impl.MenuService; -import io.shinhanlife.axhub.biz.sm.mmg.dto.MenuInDto; -import io.shinhanlife.axhub.biz.sm.mmg.dto.MenuListDto; -import io.shinhanlife.axhub.biz.sm.mmg.dto.MenuSaveInDto; -import io.shinhanlife.axhub.biz.sm.mmg.presentation.io.SmNmg0100M01DRequest; -import io.shinhanlife.axhub.biz.sm.mmg.presentation.io.SmNmg0100M01RRequest; -import io.shinhanlife.axhub.biz.sm.mmg.presentation.io.SmNmg0100M01RResponse; -import io.shinhanlife.axhub.biz.sm.mmg.presentation.io.SmNmg0100M01SRequest; -import io.shinhanlife.axhub.biz.sm.mmg.presentation.io.SmNmg0100M01SResponse; -import io.shinhanlife.axhub.biz.sm.mmg.usecase.SmNmg0100MUseCase; -import io.shinhanlife.glow.GlowServiceGroupId; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; - -import java.util.Collections; -import java.util.List; -import java.util.stream.Collectors; - -@Service -@RequiredArgsConstructor -@GlowServiceGroupId(value = "SmNmgc", description = "SmNmg") -public class SmNmg0100MUseCaseImpl implements SmNmg0100MUseCase { - - private final MenuService menuService; - - @Override - public List selectMenu(SmNmg0100M01RRequest req) { - MenuInDto inDto = new MenuInDto(); - inDto.setIsActive(req.getIsActive()); - inDto.setPath(req.getPath()); - inDto.setTitle(req.getTitle()); - - List tree = menuService.selectMenu(inDto); - return tree.stream().map(this::toResponse).collect(Collectors.toList()); - } - - @Override - public SmNmg0100M01SResponse saveMenu(SmNmg0100M01SRequest req) { - MenuSaveInDto dto = new MenuSaveInDto(); - dto.setMenuId(req.getMenuId()); - dto.setParentMenuId(req.getParentMenuId()); - dto.setName(req.getName()); - dto.setPath(req.getPath()); - dto.setTitle(req.getTitle()); - dto.setIcon(req.getIcon()); - dto.setIsHide(req.getIsHide()); - dto.setIsHideTab(req.getIsHideTab()); - dto.setLink(req.getLink()); - dto.setIsIframe(req.getIsIframe()); - dto.setKeepAlive(req.getKeepAlive()); - dto.setOrderSeq(req.getOrderSeq()); - dto.setIsActive(req.getIsActive()); - - Integer savedId = menuService.save(dto); - return SmNmg0100M01SResponse.builder().menuId(savedId).build(); - } - - @Override - public void deleteMenu(SmNmg0100M01DRequest req) { - menuService.delete(req.getMenuId()); - } - - private SmNmg0100M01RResponse toResponse(MenuListDto dto) { - MenuListDto.Meta m = dto.getMeta(); - - SmNmg0100M01RResponse.Meta meta = SmNmg0100M01RResponse.Meta.builder() - .title(m != null ? m.getTitle() : null) - .icon(m != null ? m.getIcon() : null) - .hide(m != null && m.isHide()) - .hideTab(m != null && m.isHideTab()) - .link(m != null ? m.getLink() : null) - .iframe(m != null && m.isIframe()) - .keepAlive(m != null && m.isKeepAlive()) - .orderSeq(m != null ? m.getOrderSeq() : 0) - .active(m != null && m.isActive()) - .build(); - - List children = (dto.getChildren() == null || dto.getChildren().isEmpty()) - ? Collections.emptyList() - : dto.getChildren().stream().map(this::toResponse).collect(Collectors.toList()); - - return SmNmg0100M01RResponse.builder() - .id(dto.getId()) - .parentMenuId(dto.getParentMenuId()) - .name(dto.getName()) - .path(dto.getPath()) - .meta(meta) - .children(children) - .build(); - } -} \ No newline at end of file