From 311462d613dc88e71ddc04be5765d890da50f3e2 Mon Sep 17 00:00:00 2001 From: jade Date: Thu, 20 Aug 2026 15:18:47 +0900 Subject: [PATCH] =?UTF-8?q?gradle=20=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 240 +++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 183 insertions(+), 57 deletions(-) diff --git a/build.gradle b/build.gradle index 9d1d1d40b..48a2a1c0d 100644 --- a/build.gradle +++ b/build.gradle @@ -1,113 +1,239 @@ -// 루트 Gradle 설정: 모든 Gateway/Tool Pod 모듈이 공유하는 빌드 기준을 정의합니다. plugins { - // Java 컴파일, 테스트, JAR 생성 기능을 제공합니다. id 'java' - - // 하위 실행 모듈에서 bootRun/bootJar를 사용하기 위한 Spring Boot 플러그인입니다. - // 루트 프로젝트에는 적용하지 않으므로 apply false를 사용합니다. - id 'org.springframework.boot' version '3.5.11' apply false - - // Spring Boot / Spring AI BOM에 정의된 라이브러리 버전을 일관되게 적용합니다. - id 'io.spring.dependency-management' version '1.1.6' apply false + id 'org.springframework.boot' version '3.5.11' + id 'io.spring.dependency-management' version '1.1.7' } -// 모든 모듈이 공유하는 Maven 식별자입니다. + +// ============================================================================ +// 전체 프로젝트 공통 Maven 좌표 +// ============================================================================ + allprojects { + // 모든 모듈이 공유하는 Maven Group ID입니다. group = 'io.shinhanlife' + // 모든 모듈이 공유하는 프로젝트 버전입니다. version = '0.0.1-SNAPSHOT' } -// dat-gateway, dat-was-lib, dat-was-oth, dat-was-sms에 공통 적용합니다. + subprojects { + // 모든 하위 모듈에서 Java Plugin을 사용합니다. apply plugin: 'java' + // Spring Boot BOM 기반 의존성 버전 관리를 위해 적용합니다. apply plugin: 'io.spring.dependency-management' java { - // 프로젝트 표준 Java 버전입니다. - sourceCompatibility = '21' - } - - repositories { - // 현재 공개 정식 라이브러리 저장소입니다. - // 폐쇄망 적용 시 사내 Nexus Proxy URL로 교체합니다. - mavenCentral() - } - - dependencyManagement { - imports { - // Spring Boot 3.5.11과 호환되는 Spring/Jackson/Tomcat 등의 버전을 관리합니다. - mavenBom org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES - - // Boot 3.5.11과 호환되는 Spring AI 계층은 1.1.8로 유지합니다. - mavenBom 'org.springframework.ai:spring-ai-bom:1.1.8' - - // MCP Java SDK만 2.0.0으로 올립니다. Spring AI 2.x 전체 BOM은 Boot 4 기반이므로 사용하지 않습니다. - mavenBom 'io.modelcontextprotocol.sdk:mcp-bom:2.0.0' - - // MCP SDK 2.0의 Jackson 2 전송 모듈이 요구하는 호환 버전입니다. - mavenBom 'com.fasterxml.jackson:jackson-bom:2.20.1' + toolchain { + languageVersion = JavaLanguageVersion.of(21) } } + repositories { + + // -------------------------------------------------------------------- + // 외부 개발 환경 + // -------------------------------------------------------------------- + // + // 현재 인터넷이 가능한 환경에서는 Maven Central을 사용합니다. + // + // 신한라이프 폐쇄망 반입 시 아래 mavenCentral()은 제거하고 + // 사내 Nexus Repository URL로 교체해야 합니다. + // + // 예: + // + // maven { + // url = uri('https://내부-Nexus/repository/maven-public/') + // } + // + // Nexus 인증이 필요한 경우에는 credentials 설정도 추가해야 합니다. + // + // credentials { + // username = findProperty('nexusUsername') ?: System.getenv('NEXUS_USERNAME') + // password = findProperty('nexusPassword') ?: System.getenv('NEXUS_PASSWORD') + // } + // + // 계정/비밀번호를 build.gradle에 직접 작성하면 안 됩니다. + // -------------------------------------------------------------------- + + mavenCentral() + } + + + // ======================================================================== + // Dependency Version Management + // ======================================================================== + + dependencyManagement { + + imports { + // Spring Boot 3.5.11이 검증한 + // Spring Framework / Jackson / Tomcat / Logback / + // JUnit 등 주요 라이브러리 버전을 공통 관리합니다. + // 하위 모듈에서는 Spring Boot가 관리하는 라이브러리라면 + // 가급적 개별 버전을 직접 지정하지 않고 사용합니다. + mavenBom org.springframework.boot.gradle.plugin.SpringBootPlugin.BOM_COORDINATES + + // MCP SDK 버전 관리 + mavenBom 'io.modelcontextprotocol.sdk:mcp-bom:2.0.0' + + } + } + + + // ======================================================================== + // Common Dependencies + // ======================================================================== + dependencies { - // Lombok은 컴파일 시 getter/builder 등 반복 코드를 생성하며 실행 JAR에는 포함하지 않습니다. + + // ==================================================================== + // Lombok + // ==================================================================== + + // Lombok은 컴파일 시 Getter / Setter / Builder 등의 + // 반복 코드를 생성합니다. + // + // compileOnly이므로 Runtime JAR에는 포함되지 않습니다. compileOnly 'org.projectlombok:lombok:1.18.32' + + // Lombok Annotation Processor입니다. annotationProcessor 'org.projectlombok:lombok:1.18.32' + + // 테스트 코드에서도 Lombok Annotation을 사용할 수 있도록 합니다. testCompileOnly 'org.projectlombok:lombok:1.18.32' + + // 테스트 코드용 Lombok Annotation Processor입니다. testAnnotationProcessor 'org.projectlombok:lombok:1.18.32' - // Tool DTO와 MCI 요청/응답 객체 간 Converter 구현체를 컴파일 시 자동 생성합니다. + + // ==================================================================== + // MapStruct + // ==================================================================== + + // Tool DTO와 + // MCI 요청/응답 DTO 사이의 Converter 구현체를 + // 컴파일 시 자동 생성하기 위해 사용합니다. implementation 'org.mapstruct:mapstruct:1.5.5.Final' + + // Lombok과 MapStruct Annotation Processor가 + // 함께 동작할 때 발생할 수 있는 처리 순서 문제를 해결합니다. annotationProcessor 'org.projectlombok:lombok-mapstruct-binding:0.2.0' + + // MapStruct Converter 구현 클래스를 생성하는 + // Annotation Processor입니다. annotationProcessor 'org.mapstruct:mapstruct-processor:1.5.5.Final' - // 모든 모듈의 JUnit 5 기반 테스트 공통 의존성입니다. + + // ==================================================================== + // Test + // ==================================================================== + + // Spring Boot Test / JUnit 5 / Mockito / AssertJ 등 + // 공통 테스트 환경을 제공합니다. testImplementation 'org.springframework.boot:spring-boot-starter-test' + + // Gradle / IDE 환경에서 JUnit Platform 기반 테스트 실행을 지원합니다. testRuntimeOnly 'org.junit.platform:junit-platform-launcher' } - tasks.withType(JavaCompile) { - // 리플렉션/MCP Schema 생성 시 메서드 파라미터명을 사용할 수 있도록 보존합니다. + + // ======================================================================== + // Java Compile Options + // ======================================================================== + + tasks.withType(JavaCompile).configureEach { + + // Reflection 및 MCP Schema 생성 시 + // Java 메서드의 실제 파라미터명을 사용할 수 있도록 + // 컴파일 결과에 파라미터 이름을 보존합니다. options.compilerArgs << '-parameters' - // MapStruct 구현체를 Spring Bean으로 생성해 생성자 주입으로 사용할 수 있게 합니다. + // MapStruct가 생성하는 Converter 구현 클래스를 + // Spring Bean(@Component)으로 생성합니다. + // + // 이를 통해 생성자 주입 등의 방식으로 사용할 수 있습니다. options.compilerArgs << '-Amapstruct.defaultComponentModel=spring' } - tasks.withType(Test) { - // JUnit 5 테스트 플랫폼을 사용합니다. + + // ======================================================================== + // Test Configuration + // ======================================================================== + + tasks.withType(Test).configureEach { + + // 모든 하위 모듈에서 JUnit 5 Platform을 사용합니다. useJUnitPlatform() } } -// Tool 이름 중복 검사 프로그램이 포함된 공통 라이브러리 모듈입니다. + +// ============================================================================ +// Tool Validation +// ============================================================================ + + +// Tool Annotation / Tool Schema 검증 프로그램이 들어있는 +// 공통 라이브러리 프로젝트입니다. def toolCoreProject = project(':dat-was-lib') -// 전체 Tool Pod의 @McpTool(name) 중복을 배포 산출물 생성 전에 차단합니다. + +// ============================================================================ +// MCP Tool Name Validation +// ============================================================================ + +// 전체 Tool Pod 프로젝트에서 선언된 +// @McpTool(name = "...") 값의 중복 여부를 검사합니다. +// +// 동일한 Tool Name이 존재하면 배포 산출물 생성 전에 +// 빌드를 실패시켜 중복 Tool이 배포되는 것을 차단합니다. tasks.register('validateMcpToolNames', JavaExec) { + + // Gradle Verification Task 그룹으로 분류합니다. group = 'verification' + + // Gradle Tasks 조회 시 표시되는 설명입니다. description = 'Checks duplicate @McpTool names across all Tool modules before packaging.' - // 검사 Runner를 실행하기 전에 dat-was-lib 클래스를 먼저 컴파일합니다. + + // 검사 프로그램이 dat-was-lib에 존재하므로 + // JavaExec 실행 전에 dat-was-lib의 classes 작업을 수행합니다. dependsOn toolCoreProject.tasks.named('classes') + + + // dat-was-lib의 Runtime Classpath를 + // Tool Validation Runner 실행 Classpath로 사용합니다. classpath = toolCoreProject.sourceSets.main.runtimeClasspath - mainClass.set('io.shinhanlife.dat.lib.validation.McpToolNameValidationRunner') + + + // Tool Name 중복 검증을 수행하는 Main Class입니다. + mainClass.set( + 'io.shinhanlife.dat.lib.validation.McpToolNameValidationRunner' + ) + + // 전체 멀티모듈 프로젝트를 검사할 수 있도록 + // Root Project 경로를 Runner의 Argument로 전달합니다. args rootProject.projectDir.absolutePath } -tasks.register('validateToolSchemaV17', JavaExec) { - group = 'verification' - description = 'Validates BC-DAB-STD-003 V17 definitions for every @McpTool.' - dependsOn toolCoreProject.tasks.named('classes') - classpath = toolCoreProject.sourceSets.main.runtimeClasspath - mainClass.set('io.shinhanlife.dat.lib.validation.ToolSchemaV17ValidationRunner') - args rootProject.projectDir.absolutePath -} +// ============================================================================ +// BootJar Validation Hook +// ============================================================================ subprojects { - // 배포용 Spring Boot JAR 생성 전에 Tool 이름 중복 검증을 강제합니다. + + // Spring Boot 실행 모듈에서 bootJar를 수행할 경우 + // 실제 배포 JAR이 만들어지기 전에 + // + // 1. MCP Tool Name 중복 검사 + // 2. Tool Schema V17 검사 + // + // 두 검증 작업을 반드시 수행하도록 합니다. tasks.matching { it.name == 'bootJar' }.configureEach { + + // @McpTool Name 중복 검증 dependsOn rootProject.tasks.named('validateMcpToolNames') - dependsOn rootProject.tasks.named('validateToolSchemaV17') + } -} +} \ No newline at end of file