New Score :0
High Score :0
Run Best
NICE BUSINESS TYPE INDICATOR
3. ๊ธ์ ์ ์น๊ตฌ์๊ฒ ๋น๋ ธ๋๋ฐ ์ค๋์ด ๋์ ์ฃผ๊ธฐ๋ก ํ๋ .. ๊ทธ๋ฐ๋ฐ ์นด๋๊ฐ์ ๋ด์ผํ๋ ๋ ๋ ์ค๋์ธ๋ฐ... ์ด๊ฑธ ์ด์ฉ๋...
4. ์ฐ๋ฆฌ ํ์ฌ๋ ์ค์ํ ์์ฌ ๊ฒฐ์ ์ ํ ๋?
5. ์ด์ฌํ ์ผํ ๋๋ฅผ ์ํ ์ ๋ฌผ์ ์ฃผ๊ณ ์ถ๋ค. ์ด๋ค๊ฒ ์ข์๊น?
6. ์ํ์์ ํฌ์์ํ์ ์ถ์ฒ๋ฐ์๋ค. ์ด๋ค๊ฑธ ๊ฐ์ ํ์ง?
7. ํ์ฌ์์์ ๋๋?
8. ๊ฟ์์ ๊นจ์ด๋๋ 20๋ ์ ์ผ๋ก ๋์๊ฐ๋ค. ๋น์ ์ด ์ ์ผ ๋จผ์ ํ๋์ผ์?
9. ๋ด๊ฐ ์ธ์ฌ ๋ด๋น์๋ผ๋ฉด ์ ๊ท ์ ์ฌ์ ์ฑ์ฉ ์ ์ ์ผ ์ค์ํ๊ฒ ๋ณด๋๊ฒ์?
10. ํ์ฌ์ ์ ๋ง ์ซ์ดํ๋ ๋๋ฃ๊ฐ ์๋ค๋ฉด?
11. ๊ฐ๋ํ ์ง์ ๊ฐ์ฅ์ด ๋์๋ค.. ์๋ ์ ์์ผ ๋ ์ ๋ฌผ์?
12. ํ์ ํ์ฌ ์ถ๊ทผ ์คํ์ผ์?
13.ํ์ฌ ์ฒด์ก๋ํ ํ๋ ๋ ์ด๋ค. ์ค๋ ๋ญํ์ง?
14. ๋์ ์ ๋ฌด ์คํ์ผ์?
Gradle์ ์์กด์ฑ ๊ธฐ๋ฐ ํ๋ก๊ทธ๋๋ฐ์ ํ ์๋ก, ์์ ๊ณผ ์์ ๊ฐ์ ์ข ์ ๊ด๊ณ๋ฅผ ์ ์ํฉ๋๋ค. Gradle์ ์ด๋ฌํ ์์ ์ด ์ข ์ ํญ๋ชฉ ์์๋๋ก ์คํ๋๋๋ก ๋ณด์ฅํฉ๋๋ค. ๋น๋ ์คํฌ๋ฆฝํธ์ ํ๋ฌ๊ทธ์ธ์ ์ด ์ข ์์ฑ ๊ทธ๋ํ๋ฅผ ๊ตฌ์ฑํฉ๋๋ค. ์ด ํ์ด์ง์์๋ Gradle์ด ์ด๋ฌํ ์คํฌ๋ฆฝํธ๋ฅผ ํด์ํ ๋ ๊ฑฐ์น๋ ์๋ช ์ฃผ๊ธฐ์ ๋จ๊ณ์ ๋ํด ์ค๋ช ํฉ๋๋ค. ๋ํ ์ด ํ์ด์ง์์๋ ์๋ฆผ์ ์ฌ์ฉํ์ฌ ์๋ช ์ฃผ๊ธฐ์ ์ด๋ฒคํธ์ ๋์ํ๋ ๋ฐฉ๋ฒ์ ์ค๋ช ํฉ๋๋ค.
Task Graphs
์ผ๋ถ ๋น๋ ๋๊ตฌ๋ ์์ ์ ์คํํ ๋ ์์ ๊ทธ๋ํ๋ฅผ ์กฐํฉํฉ๋๋ค. Gradle์ ์์ ์ ์คํํ๊ธฐ ์ ์ ์์ ๊ทธ๋ํ๋ฅผ ์์ฑํฉ๋๋ค. ๊ตฌ์ฑ ๋ฐฉ์ง ๊ธฐ๋ฅ์ ์ฌ์ฉํ๋ฉด Gradle์ ํ์ฌ ๋น๋์ ํฌํจ๋์ง ์์ ์์ ์ ๊ตฌ์ฑ์ ๊ฑด๋๋๋๋ค.
๊ฐ ํ๋ก์ ํธ ๋ด์์ ์์ ์ DAG(๋ฐฉํฅ์ฑ ๋น์ํ ๊ทธ๋ํ)๋ฅผ ํ์ฑํฉ๋๋ค.
The diagram represents dependencies between tasks as arrows:

ํ๋ฌ๊ทธ์ธ๊ณผ ์์ฒด ๋น๋ ์คํฌ๋ฆฝํธ๋ ๋ชจ๋ ์์ ์ข ์์ฑ ๋ฉ์ปค๋์ฆ์ ํตํด ์์ ๊ทธ๋ํ์ ๊ธฐ์ฌํฉ๋๋ค.
Build Phases
Gradle ๋น๋์๋ ์ธ ๊ฐ์ง ๋จ๊ณ๊ฐ ์์ต๋๋ค. Gradle์ ์ด๋ฌํ ๋จ๊ณ๋ฅผ ์ฒซ ๋ฒ์งธ ์ด๊ธฐํ, ๊ตฌ์ฑ, ๋ง์ง๋ง์ผ๋ก ์คํ์ ์์๋ก ์คํํฉ๋๋ค.
- ์ค์ ํ์ผ์ ๊ฐ์งํฉ๋๋ค.
- ์ค์ ํ์ผ์ ํ๊ฐํ์ฌ ๋น๋์ ์ฐธ์ฌํ๋ ํ๋ก์ ํธ ๋ฐ ํฌํจ๋ ๋น๋๋ฅผ ํ์ธํฉ๋๋ค.
- ๋ชจ๋ ํ๋ก์ ํธ์ ๋ํด Project ์ธ์คํด์ค๋ฅผ ๋ง๋ญ๋๋ค.
- ๋น๋์ ์ฐธ์ฌํ๋ ๋ชจ๋ ํ๋ก์ ํธ์ ๋น๋ ์คํฌ๋ฆฝํธ๋ฅผ ํ๊ฐํฉ๋๋ค.
- ์์ฒญ๋ ์์ ์ ๋ํ ์์ ๊ทธ๋ํ๋ฅผ ๋ง๋ญ๋๋ค.
- ์ ํํ ๊ฐ ์์ ์ ์ข ์์ฑ ์์๋๋ก ์์ฝํ๊ณ ์คํํฉ๋๋ค.
Example
๋ค์ ์์ ์์๋ ์ค์ ๋ฐ ๋น๋ ํ์ผ์ ์ด๋ค ๋ถ๋ถ์ด ๋ค์ํ ๋น๋ ๋จ๊ณ์ ํด๋นํ๋์ง ๋ณด์ฌ ์ค๋๋ค.
rootProject.name = "basic"
println("This is executed during the initialization phase.")
println("This is executed during the configuration phase.")
tasks.register("configured") {
println("This is also executed during the configuration phase, because :configured is used in the build.")
}
tasks.register("test") {
doLast {
println("This is executed during the execution phase.")
}
}
tasks.register("testBoth") {
doFirst {
println("This is executed first during the execution phase.")
}
doLast {
println("This is executed last during the execution phase.")
}
println("This is executed during the configuration phase as well, because :testBoth is used in the build.")
}
๋ค์ ๋ช ๋ น์ ์์์ ์ง์ ํ ํ ์คํธ ๋ฐ testBoth ์์ ์ ๊ตฌ์ฑํ๊ณ ์คํํฉ๋๋ค. Gradle์ ์์ฒญ๋ ์์ ๊ณผ ๊ทธ ์ข ์ ํญ๋ชฉ๋ง ๊ตฌ์ฑํ๋ฏ๋ก ๊ตฌ์ฑ๋ ์์ ์ ๊ตฌ์ฑ๋์ง ์์ต๋๋ค.
> gradle test testBoth
This is executed during the initialization phase.
> Configure project :
This is executed during the configuration phase.
This is executed during the configuration phase as well, because :testBoth is used in the build.
> Task :test
This is executed during the execution phase.
> Task :testBoth
This is executed first during the execution phase.
This is executed last during the execution phase.
BUILD SUCCESSFUL in 0s
2 actionable tasks: 2 executed
Initialization
์ด๊ธฐํ ๋จ๊ณ์์ Gradle์ ๋น๋์ ์ฐธ์ฌํ๋ ํ๋ก์ ํธ ๋ฐ ํฌํจ๋ ๋น๋๋ฅผ ๊ฐ์งํฉ๋๋ค. Gradle์ ๋จผ์ ์ค์ ํ์ผ์ ํ๊ฐํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ Gradle์ ๊ฐ ํ๋ก์ ํธ์ ํ๋ก์ ํธ ์ธ์คํด์ค๋ฅผ ์ธ์คํด์คํํฉ๋๋ค.
Detect Settings File
:
- Gradle์ ์์ ๋๋ ํ ๋ฆฌ์์ settings.gradle(.kts) ํ์ผ์ ์ฐพ์ต๋๋ค.
- Gradle์ด settings.gradle(.kts) ํ์ผ์ ์ฐพ์ผ๋ฉด ํ์ฌ ํ๋ก์ ํธ๊ฐ ๋ค์ค ํ๋ก์ ํธ ๋น๋์ ์ผ๋ถ์ธ์ง ํ์ธํฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด Gradle์ ๋ค์ค ํ๋ก์ ํธ๋ก ๋น๋๋ฉ๋๋ค.
- Gradle์ด settings.gradle(.kts) ํ์ผ์ ์ฐพ์ง ๋ชปํ๋ฉด Gradle์ ๋จ์ผ ํ๋ก์ ํธ๋ก ๋น๋๋ฉ๋๋ค.
ํ์ค Gradle ํ๋ก์ ํธ ๋ ์ด์์์์ ํ๋ก์ ํธ ๊ฒฝ๋ก๋ ๋์คํฌ์ ์ค์ ํ์ ํ๋ก์ ํธ ๋ ์ด์์๊ณผ ์ผ์นํฉ๋๋ค. ์ค์ ํ์ผ์ ๋ํ ์๋ ๊ฒ์์ ํ์ค ํ๋ก์ ํธ ๋ ์ด์์์ด ์๋ ๋ค์ค ํ๋ก์ ํธ ๋น๋์์๋ง ์๋ํฉ๋๋ค. ๋นํ์ค ๋ ์ด์์์ ์ฌ์ฉํ๋ ํ๋ก์ ํธ๋ฅผ ๋น๋ํ๋ ค๋ฉด settings.gradle(.kts)์ด ํฌํจ๋ ๋๋ ํฐ๋ฆฌ์์ ๋น๋๋ฅผ ์คํํฉ๋๋ค.
Evaluate Settings File
- ๋น๋ ์คํฌ๋ฆฝํธ ํด๋์ค ๊ฒฝ๋ก์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐํฉ๋๋ค.
- ๋ณตํฉ ๋น๋์ ์ฐธ์ฌํ๋ ํฌํจ๋ ๋น๋๋ฅผ ์ ์ํฉ๋๋ค.
- ๋ค์ค ํ๋ก์ ํธ ๋น๋์ ์ฐธ์ฌํ๋ ํ๋ก์ ํธ๋ฅผ ์ ์ํฉ๋๋ค.
Gradle์ ๋น๋์ ๋ชจ๋ ํ๋ก์ ํธ์ ๋ํด ํ๋ก์ ํธ๋ฅผ ๋ง๋ญ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ ํ๋ก์ ํธ์ ์ด๋ฆ์ ์ต์์ ๋๋ ํฐ๋ฆฌ์ ์ด๋ฆ๊ณผ ๊ฐ์ต๋๋ค. ๋ฃจํธ ํ๋ก์ ํธ๋ฅผ ์ ์ธํ ๋ชจ๋ ํ๋ก์ ํธ์๋ ๋ถ๋ชจ ํ๋ก์ ํธ๊ฐ ์์ต๋๋ค. ๋ชจ๋ ํ๋ก์ ํธ์๋ ํ์ ํ๋ก์ ํธ๊ฐ ์์ ์ ์์ต๋๋ค.
Configuration
๊ตฌ์ฑ ๋จ๊ณ์์ Gradle์ ์ด๊ธฐํ ๋จ๊ณ์์ ์์ฑ๋ ํ๋ก์ ํธ์ ํ ์ผ ๋ฐ ๊ธฐํ ์์ฑ์ ์ถ๊ฐํฉ๋๋ค. ๊ตฌ์ฑ ๋จ๊ณ๊ฐ ๋๋๋ฉด Gradle์ ์์ฒญ๋ ์์ ์ ๋ํ ์์ ํ ์์ ์คํ ๊ทธ๋ํ๋ฅผ ๊ฐ๊ฒ ๋ฉ๋๋ค.
Project Evaluation
ํ๋ก์ ํธ ํ๊ฐ ์ค์ Gradle์ ๋น๋ ์คํฌ๋ฆฝํธ๋ฅผ ํ๊ฐํ์ฌ ํ๋ก์ ํธ ๋ด์์ ์์ ๊ณ์ธต ๊ตฌ์กฐ๋ฅผ ๊ตฌ์ถํฉ๋๋ค. ์ด ๊ณ์ธต ๊ตฌ์กฐ์๋ ๋ชจ๋ ์์ ์ ๋ํ ์ ๋ ฅ, ์์ ๋ฐ ์ถ๋ ฅ์ด ํฌํจ๋ฉ๋๋ค.
React to Project Evaluation
ํ๋ก์ ํธ ํ๊ฐ ์ง์ ๊ณผ ์งํ์ ์๋ฆผ์ ๋ฐ์ ์ ์์ต๋๋ค. ์ด๋ฌํ ์๋ฆผ์ ํ๋ก์ ํธ ํ๊ฐ๊ฐ ์คํจํ ๊ฒฝ์ฐ์๋ ์๋ํฉ๋๋ค. ๋ชจ๋ ํ๋ก์ ํธ ๋๋ ํน์ ํ๋ก์ ํธ์ ๋ํ ํ๋ก์ ํธ ํ๊ฐ ์๋ฆผ์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ด๋ฌํ ์๋ฆผ์ ๋ค์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๋น๋ ์คํฌ๋ฆฝํธ์์ ๋ชจ๋ ์ ์๋ฅผ ์ ์ฉํ ํ์ ์ถ๊ฐ ๊ตฌ์ฑ
- ์ฌ์ฉ์ ์ง์ ๋ก๊น
- ์ฌ์ฉ์ ์ง์ ํ๋กํ์ผ๋ง
๋ค์ ์์ ์์๋ gradle.beforeProject()๋ฅผ ์ฌ์ฉํ์ฌ hasTests ์์ฑ์ ํน์ ํ ์คํธ์ ์ถ๊ฐํฉ๋๋ค. ๋์ค์ ์์ ์์๋ gradle.afterProject()๋ฅผ ์ฌ์ฉํ์ฌ hasTests ์์ฑ ๊ฐ์ด true์ธ ๊ฐ ํ๋ก์ ํธ์ ํ ์คํธ ์์ ์ ์ถ๊ฐํฉ๋๋ค.
gradle.beforeProject {
// Set a default value
project.ext.set("hasTests", false)
}
gradle.afterProject {
if (project.ext.has("hasTests") && project.ext.get("hasTests") as Boolean) {
val projectString = project.toString()
println("Adding test task to $projectString")
tasks.register("test") {
doLast {
println("Running tests for $projectString")
}
}
}
}
extra["hasTests"] = true
> gradle -q test
Adding test task to project ':project-a'
Running tests for project ':project-a'
ํด๋ก์ ๋์ ๋ฆฌ์ค๋๋ฅผ ํตํด ์ด๋ฌํ ์ด๋ฒคํธ๋ฅผ ์์ ํ๋ ค๋ฉด ๋น๋์ Gradle ์ธ์คํด์ค์ ProjectEvaluationListener๋ฅผ ์ถ๊ฐ ํ์ธ์.
Task Execution Graph Assembly
ํ๋ก์ ํธ ํ๊ฐ ์ค์ Gradle์ ์์ ์คํ ๊ทธ๋ํ, ์ฆ ์์ ๊ฐ์ ์ข ์์ฑ ๊ด๊ณ๋ฅผ ๋ํ๋ด๋ DAG๋ฅผ ์กฐํฉํฉ๋๋ค.
React to Task Execution Graph Assembly
Gradle์ด ํ๋ก์ ํธ์ ์์ ์คํ ๊ทธ๋ํ ์์ฑ์ ์๋ฃํ ์งํ์ ์๋ฆผ์ ๋ฐ์ ์ ์์ต๋๋ค.
์ด๋ฌํ ์ด๋ฒคํธ๋ฅผ ์์ ํ๋ ค๋ฉด ํ๋ก์ ํธ์ TaskExecutionGraph์ TaskExecutionGraphListener๋ฅผ ์ถ๊ฐํฉ๋๋ค.
Task Creation
ํ๋ก์ ํธ ํ๊ฐ ์ค์ Gradle์ ์์ ๋ฐ ๊ตฌ์ฑ ์์ ์ ๋ฑ๋กํฉ๋๋ค. ๊ตฌ์ฑ ์์ ์ ํด๋น ์์ ์ ๋ํ ์ ๋ ฅ, ์ถ๋ ฅ ๋ฐ ์์ ์ ์ ์ํฉ๋๋ค. ์์ ์ด ์์ฒญ๋ ์์ ์ ๋ํ ์์ ๊ทธ๋ํ์ ์ผ๋ถ์ธ ๊ฒฝ์ฐ ํ๊ฐ๋ฉ๋๋ค.
React to Task Creation
Gradle์ด ํ๋ก์ ํธ์ ํ ์ผ์ ์ถ๊ฐํ ์งํ์ ์๋ฆผ์ ๋ฐ์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด ์ด๋ฌํ ์๋ฆผ์ ์ฌ์ฉํ์ฌ ์ผ๋ถ ๊ธฐ๋ณธ๊ฐ ๋๋ ๋ฉ์๋๋ฅผ ์ค์ ํ ์ ์์ต๋๋ค.
tasks.whenTaskAdded {
extra["srcDir"] = "src/main/java"
}
val a by tasks.registering
println("source dir is ${a.get().extra["srcDir"]}")
> gradle -q a
source dir is src/main/java
ํด๋ก์ ๋์ ์์ ๊ธฐ๋ฅผ ํตํด ์ด๋ฌํ ์ด๋ฒคํธ๋ฅผ ์์ ํ๋ ค๋ฉด TaskContainer์ ์์ ์ ์ถ๊ฐํฉ๋๋ค.
Execution
์คํ ๋จ๊ณ์์ Gradle์ ์์ ์ ์คํํฉ๋๋ค. Gradle์ ๊ตฌ์ฑ ๋จ๊ณ์์ ์์ฑ๋ ์์ ์คํ ๊ทธ๋ํ๋ฅผ ์ฌ์ฉํ์ฌ ์คํํ ์์ ์ ๊ฒฐ์ ํฉ๋๋ค.
Task Execution
์์ ์คํ์๋ ์ผ๋ฐ์ ์ผ๋ก ๋น๋์ ์ฐ๊ฒฐํ๋ ๋๋ถ๋ถ์ ์์ (๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ค์ด๋ก๋, ์ฝ๋ ์ปดํ์ผ, ์ ๋ ฅ ์ฝ๊ธฐ ๋ฐ ์ถ๋ ฅ ์์ฑ)์ด ํฌํจ๋ฉ๋๋ค.
React to Task Execution Notifications
์์ ์คํ ์ด๋ฒคํธ๋ ๊ตฌ์ฑ ์บ์์ ํธํ๋์ง ์์ต๋๋ค. ๋น๋ ์๋น์ค๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌ์ฑ ์บ์์ ํธํ๋๋ ๋ฐฉ์์ผ๋ก ์์ ์คํ์ ๋ํ ์ ๋ณด๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค.
tasks.register("ok")
tasks.register("broken") {
dependsOn("ok")
doLast {
throw RuntimeException("broken")
}
}
gradle.taskGraph.beforeTask {
println("executing $this ...")
}
gradle.taskGraph.afterTask {
if (state.failure != null) {
println("FAILED")
} else {
println("done")
}
}
> gradle -q broken
executing task ':ok' ...
done
executing task ':broken' ...
FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':broken'.
> broken
* Try:
> Run with --stacktrace option to get the stack trace.
> Run with --info or --debug option to get more log output.
> Run with --scan to get full insights.
* Get more help at https://help.gradle.org
BUILD FAILED in 0s
ํด๋ก์ ๋์ ์์ ๊ธฐ๋ฅผ ํตํด ์ด๋ฌํ ์ด๋ฒคํธ๋ฅผ ์์ ํ๋ ค๋ฉด ํ๋ก์ ํธ์ TaskExecutionGraph์ TaskExecutionListener๋ฅผ ์ถ๊ฐํฉ๋๋ค.