plugins { id 'java' id 'org.springframework.boot' version '3.5.0' id 'io.spring.dependency-management' version '1.1.7' } group = 'org.demon' version = '0.0.1-SNAPSHOT' java { toolchain { languageVersion = JavaLanguageVersion.of(17) } } configurations { compileOnly { extendsFrom annotationProcessor } } repositories { mavenCentral() } /** * ====== 빌드타임 스위칭 ====== * 사용법: * - OLD 스키마(기본): ./gradlew clean build * - NEW 스키마: ./gradlew clean build -PcpSchema=new * * 디렉터리 구조(패키지는 반드시 동일해야 함): * - schemas/com/worker/domain/entity ← OLD 엔티티들 (package com.worker.domain.entity;) * - schemas/com/worker/domain/entity_new ← NEW 엔티티들 (package com.worker.domain.entity;) */ //def schema = (project.findProperty("cpSchema") ?: "old") // 'old' | 'new' //def isNew = schema == "new" def schema = "new" def isNew = true springBoot { mainClass = "com.worker.CleanParkingWorkerApplication" // 실제 패키지/클래스명으로! } sourceSets { main { java { // 공통 코드 setSrcDirs(["src/main/java", "src/schemas"]) if (isNew) { // old제외 exclude "com/worker/domain/entity/**" exclude "com/worker/domain/repo/**" } else { // new제외 exclude "com/worker/domain/entity_new/**" exclude "com/worker/domain/repo_new/**" } } resources { setSrcDirs(["src/main/resources"]) } } } //apply plugin: 'idea' //idea { // module { // // Gradle 컴파일은 이미 old만 포함이지만, // // IDE가 엔티티 경로를 소스 루트로 잡지 않게 명시적으로 제외 // excludeDirs += file('src/schemas/com/worker/domain/entity_new') // excludeDirs += file('src/schemas/com/worker/domain/repo_new') //// excludeDirs += file('src/schemas/com/worker/domain/entity') //// excludeDirs += file('src/schemas/com/worker/domain/repo') // // // (선택) 아예 IDE 소스루트를 old로만 제한하고 싶다면 아래처럼 지정도 가능 // // sourceDirs = [ // // file('src/main/java'), // // file('src/schemas/com/worker/domain/entity'), // // file('src/schemas/com/worker/domain/repo') // // ] as Set // } //} /** * ====== 의존성 ====== * (중복/불필요 항목 정리) */ dependencies { implementation 'org.springframework.boot:spring-boot-starter-data-jpa' implementation 'org.springframework.boot:spring-boot-starter-quartz' implementation 'org.springframework.boot:spring-boot-starter-thymeleaf' implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-webflux' implementation 'org.springframework.session:spring-session-core' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' developmentOnly 'org.springframework.boot:spring-boot-devtools' // DB 드라이버 (필요한 것만 남기세요) runtimeOnly 'com.mysql:mysql-connector-j' runtimeOnly 'org.mariadb.jdbc:mariadb-java-client' runtimeOnly 'com.oracle.database.jdbc:ojdbc11' testImplementation 'org.springframework.boot:spring-boot-starter-test' testRuntimeOnly 'org.junit.platform:junit-platform-launcher' // === QueryDSL (Spring Boot 3.x / Jakarta) === implementation 'com.querydsl:querydsl-jpa:5.0.0:jakarta' annotationProcessor 'com.querydsl:querydsl-apt:5.0.0:jakarta' annotationProcessor 'jakarta.annotation:jakarta.annotation-api' annotationProcessor 'jakarta.persistence:jakarta.persistence-api' // sftp implementation 'com.jcraft:jsch:0.1.55' } tasks.named('test') { useJUnitPlatform() } /** * ====== QueryDSL 생성 경로 설정 및 포함 ====== * Q클래스는 여기에 생성됨: * build/generated/sources/annotationProcessor/java/main * 소스셋에 포함시켜 IDE/컴파일러가 인식하도록 추가. */ tasks.withType(JavaCompile).configureEach { options.annotationProcessorGeneratedSourcesDirectory = file("$buildDir/generated/sources/annotationProcessor/java/main") } sourceSets.main.java.srcDir("$buildDir/generated/sources/annotationProcessor/java/main") // clean 시 생성된 Q소스도 함께 정리 tasks.clean.doFirst { delete("$buildDir/generated/sources/annotationProcessor/java/main") } // 어떤 자바 파일이 실제로 main 소스셋에 들어갔는지 출력 tasks.register("printJavaFiles") { doLast { println "cpSchema/new? isNew = ${isNew}" println "Included Java files in main:" def files = sourceSets.main.java.asFileTree.matching { include '**/*.java' } .files.toList().sort { a, b -> a.path <=> b.path } files.each { println " - ${it}" } println "Total: ${files.size()}" } }