Skip to content

Commit e04c891

Browse files
Merge pull request #12 from EntryDSM/refactor/11-plugin-auto-apply-with-check-task
Refactor/11-plugin-auto-apply-with-check-task
2 parents 68ebc16 + e15cea9 commit e04c891

14 files changed

Lines changed: 174 additions & 239 deletions

File tree

build-logic/src/main/kotlin/io/casper/build/TestClass.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,9 @@ package io.casper.build
55
* 이제 올바른 KDoc 주석 형식을 사용합니다.
66
*/
77
class TestClass {
8+
89
/**
9-
* 이 함수는 KDoc 주석 검사 테스트를 위한 용도입니다.
10-
*
11-
* @return 항상 Unit을 반환합니다.
10+
* 이 함수는 빌드 로직에서 사용하는 테스트 함수입니다.
1211
*/
1312
fun testFunction() {
1413
println("이 함수는 문서화 검사를 테스트하기 위한 용도입니다.")

build.gradle.kts

Lines changed: 8 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,16 @@
11
plugins {
22
kotlin("jvm") version "1.9.23"
3-
kotlin("plugin.spring") version "1.9.23"
4-
id("org.springframework.boot") version "3.4.4"
5-
id("io.spring.dependency-management") version "1.1.7"
63
id("org.jlleitschuh.gradle.ktlint").version("12.1.1")
74
id("io.gitlab.arturbosch.detekt") version "1.23.6"
85
id("casper.documentation-convention")
96
}
107

11-
// 모든 프로젝트(루트 및 서브프로젝트)에 공통 설정 적용
12-
allprojects {
8+
// 서브프로젝트 설정
9+
subprojects {
10+
// 서브프로젝트에 공통 설정 적용
1311
repositories {
1412
mavenCentral()
1513
}
16-
17-
// 모든 프로젝트에 플러그인 적용
18-
apply(plugin = "casper.documentation-convention")
1914
}
2015

2116
tasks.register("checkAll") {
@@ -25,6 +20,11 @@ tasks.register("checkAll") {
2520
// 루트 프로젝트의 check 태스크에 의존
2621
dependsOn(tasks.named("check"))
2722

23+
// 모든 서브프로젝트의 check 태스크에 의존
24+
subprojects.forEach { subproject ->
25+
dependsOn(subproject.tasks.matching { it.name.startsWith("check") })
26+
}
27+
2828
// build-logic, convention 등 includeBuild 모듈의 check 태스크에 의존
2929
dependsOn(gradle.includedBuilds.map { it.task(":check") })
3030
}
@@ -38,20 +38,6 @@ java {
3838
}
3939
}
4040

41-
dependencies {
42-
implementation("org.springframework.boot:spring-boot-starter")
43-
implementation("org.jetbrains.kotlin:kotlin-reflect")
44-
testImplementation("org.springframework.boot:spring-boot-starter-test")
45-
testImplementation("org.jetbrains.kotlin:kotlin-test-junit5")
46-
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
47-
}
48-
49-
kotlin {
50-
compilerOptions {
51-
freeCompilerArgs.addAll("-Xjsr305=strict")
52-
}
53-
}
54-
5541
tasks.withType<Test> {
5642
useJUnitPlatform()
5743
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
plugins {
2+
kotlin("jvm")
3+
id("casper.documentation-convention") // 명시적으로 플러그인 적용
4+
}
5+
6+
group = "hs.kr.casper.entrydsm"
7+
version = "0.0.1-SNAPSHOT"
8+
9+
repositories {
10+
mavenCentral()
11+
}
12+
13+
dependencies {
14+
testImplementation(kotlin("test"))
15+
}
16+
17+
tasks.test {
18+
useJUnitPlatform()
19+
}
20+
kotlin {
21+
jvmToolchain(17)
22+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package hs.kr.entrydsm.application
2+
3+
/**
4+
* 이 클래스는 KDoc 주석 검사 테스트를 위한 용도입니다.
5+
* 이제 올바른 KDoc 주석 형식을 사용합니다.
6+
*/
7+
class TestClass2 {
8+
9+
/**
10+
* 이 함수는 문서화 검사를 테스트하기 위한 용도입니다.
11+
*/
12+
fun testFunction() {
13+
println("이 함수는 문서화 검사를 테스트하기 위한 용도입니다.")
14+
}
15+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
2+
3+
plugins {
4+
kotlin("jvm")
5+
kotlin("plugin.spring") version "1.9.23"
6+
id("org.springframework.boot") version "3.4.4"
7+
id("io.spring.dependency-management") version "1.1.7"
8+
id("casper.documentation-convention")
9+
}
10+
11+
group = "hs.kr.entrydsm"
12+
version = "0.0.1-SNAPSHOT"
13+
14+
repositories {
15+
mavenCentral()
16+
}
17+
18+
dependencies {
19+
// impl project
20+
implementation(project(":casper-application-domain"))
21+
22+
implementation("org.springframework.boot:spring-boot-starter")
23+
implementation("org.jetbrains.kotlin:kotlin-reflect")
24+
25+
testImplementation("org.springframework.boot:spring-boot-starter-test")
26+
testImplementation(kotlin("test"))
27+
}
28+
29+
tasks.withType<KotlinCompile> {
30+
kotlinOptions {
31+
freeCompilerArgs += "-Xjsr305=strict"
32+
}
33+
}
34+
35+
tasks.withType<Test> {
36+
useJUnitPlatform()
37+
}
38+
39+
kotlin {
40+
jvmToolchain(17)
41+
}

src/main/kotlin/hs/kr/entrydsm/application/CasperApplication.kt renamed to casper-application-infrastructure/src/main/kotlin/hs/kr/entrydsm/application/CasperApplication.kt

File renamed without changes.
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package hs.kr.entrydsm.application
2+
3+
/**
4+
* test
5+
*/
6+
class TestClass3 {
7+
8+
}

casper-application-infrastructure/src/main/resources/application.yml

Whitespace-only changes.

src/test/kotlin/hs/kr/entrydsm/application/CasperApplicationTests.kt renamed to casper-application-infrastructure/src/test/kotlin/hs/kr/entrydsm/application/CasperApplicationTests.kt

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,10 @@ package hs.kr.entrydsm.application
33
import org.junit.jupiter.api.Test
44
import org.springframework.boot.test.context.SpringBootTest
55

6-
/**
7-
* asdf
8-
*
9-
*/
106
@SpringBootTest
117
class CasperApplicationTests {
8+
129
@Test
1310
fun contextLoads() {
1411
}
15-
}
12+
}

casper-convention/src/main/kotlin/io/casper/convention/plugins/DocumentationConventionPlugin.kt

Lines changed: 72 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -11,47 +11,94 @@ import org.gradle.kotlin.dsl.register
1111

1212
/**
1313
* Casper 프로젝트의 KDoc 문서화 규칙을 정의하는 Gradle 플러그인입니다.
14+
* 코드 요소(클래스, 함수, 프로퍼티 등)에 KDoc 주석이 있는지 확인하는 태스크를 제공합니다.
1415
*/
1516
class DocumentationConventionPlugin : Plugin<Project> {
17+
/**
18+
* 플러그인을 프로젝트에 적용합니다.
19+
* 각 코드 요소별 문서화 확인 태스크와 통합 태스크를 등록하고, 빌드 라이프사이클에 연결합니다.
20+
*
21+
* @param project 플러그인이 적용될 프로젝트
22+
*/
1623
override fun apply(project: Project) {
17-
with(project) {
18-
// 현재 프로젝트에 태스크 등록
19-
registerDocTasks(this)
20-
21-
// 모든 서브프로젝트에도 태스크 등록
22-
subprojects {
23-
registerDocTasks(this)
24-
}
25-
}
24+
project.logger.lifecycle("문서화 규칙 플러그인을 적용합니다: ${project.name}")
25+
val registeredTasks = registerIndividualDocCheckTasks(project)
26+
registerAggregateTask(project, registeredTasks)
27+
connectToCheckLifecycle(project)
2628
}
2729

30+
/**
31+
* 각 코드 요소(클래스, 함수, 프로퍼티 등)별로 개별 문서화 확인 태스크를 등록합니다.
32+
* DocCheckTaskType에 정의된 각 유형에 대해 DocCheckTask를 생성합니다.
33+
*
34+
* @param project 태스크가 등록될 프로젝트
35+
* @return 등록된 태스크 프로바이더 목록
36+
*/
37+
private fun registerIndividualDocCheckTasks(project: Project): List<TaskProvider<out Task>> {
38+
val registeredTasks = mutableListOf<TaskProvider<out Task>>()
2839

29-
private fun Project.registerDocTasks(project: Project) {
30-
with(project) {
31-
val registeredTasks = mutableListOf<TaskProvider<out Task>>()
40+
DocCheckTaskType.values().forEach { taskType ->
41+
val taskName = taskType.taskName
3242

33-
DocCheckTaskType.values().forEach { taskType ->
34-
val task = tasks.register<DocCheckTask>(taskType.taskName) {
43+
// 이미 같은 이름의 태스크가 있는지 확인
44+
if (project.tasks.findByName(taskName) == null) {
45+
val task = project.tasks.register<DocCheckTask>(taskName) {
3546
group = DocConstants.DOC_GROUP
3647
description = taskType.description
3748
codeElement.set(taskType.codeElement)
3849
}
3950
registeredTasks.add(task)
51+
project.logger.lifecycle("${project.name}${taskName} 태스크를 등록했습니다.")
52+
} else {
53+
project.logger.lifecycle("${project.name}에 이미 ${taskName} 태스크가 있습니다.")
54+
registeredTasks.add(project.tasks.named(taskName))
4055
}
56+
}
57+
return registeredTasks
58+
}
4159

42-
// 모든 문서화 검사를 한 번에 실행하는 태스크
43-
tasks.register("checkAllDocs") {
44-
group = DocConstants.CHECK_GROUP
45-
description = "모든 코드 요소의 KDoc 주석 여부를 확인합니다"
60+
/**
61+
* 모든 개별 문서화 확인 태스크를 한 번에 실행하는 통합 태스크를 등록합니다.
62+
* 이 태스크는 모든 개별 태스크에 의존하므로, 하나의 명령으로 모든 확인을 실행할 수 있습니다.
63+
*
64+
* @param project 태스크가 등록될 프로젝트
65+
* @param individualTasks 의존할 개별 태스크 목록
66+
*/
67+
private fun registerAggregateTask(project: Project, individualTasks: List<TaskProvider<out Task>>) {
68+
// 모든 문서화 검사를 한 번에 실행하는 태스크
69+
if (project.tasks.findByName(CHECK_ALL_DOCS_TASK) == null) {
70+
project.tasks.register(CHECK_ALL_DOCS_TASK) {
71+
group = DocConstants.CHECK_GROUP
72+
description = "모든 코드 요소의 KDoc 주석 여부를 확인합니다"
4673

47-
// 등록된 모든 검사 태스크에 의존
48-
dependsOn(registeredTasks)
74+
// 등록된 모든 검사 태스크에 의존
75+
dependsOn(individualTasks)
76+
}
77+
project.logger.lifecycle("${project.name}${CHECK_ALL_DOCS_TASK} 태스크를 등록했습니다.")
78+
}
79+
}
80+
81+
/**
82+
* 문서화 확인 태스크를 프로젝트의 기본 check 태스크에 연결합니다.
83+
* 이를 통해 일반적인 빌드 라이프사이클에 문서화 확인이 포함됩니다.
84+
*
85+
* @param project 연결될 프로젝트
86+
*/
87+
private fun connectToCheckLifecycle(project: Project) {
88+
// 프로젝트 평가 후에 check 태스크가 있으면 checkAllDocs를 의존성으로 추가
89+
project.afterEvaluate {
90+
project.tasks.findByName("check")?.dependsOn(CHECK_ALL_DOCS_TASK)
91+
project.logger.lifecycle("${project.name}의 check 태스크에 ${CHECK_ALL_DOCS_TASK} 의존성을 추가했습니다.")
92+
}
4993
}
5094

51-
// 빌드 검증 과정에 문서화 검사 포함
52-
tasks.named("check") {
53-
dependsOn("checkAllDocs")
95+
/**
96+
* 플러그인 내에서 사용되는 상수 값들을 정의합니다.
97+
*/
98+
companion object {
99+
/**
100+
* 모든 문서화 확인 태스크를 실행하는 통합 태스크의 이름입니다.
101+
*/
102+
const val CHECK_ALL_DOCS_TASK = "checkAllDocs"
54103
}
55-
}
56-
}
57104
}

0 commit comments

Comments
 (0)