์ฌํด ์ด์ ์ธํด ๋ฉด์ ๋ณด๋ฉด์ ๋ฐ์๋ ์ง๋ฌธ ์ค ๊ธฐ์ต์ ๋จ๋ ์ง๋ฌธ์ด๋ค.
“compile๊ณผ implementation์ ์ฐจ์ด๋ฅผ ์ค๋ช ํด์ฃผ์ธ์”
์๊ฐํด๋ณด์ง๋ ์์ ์ง๋ฌธ์ด๋ผ ๋ต๋ณํ์ง ๋ชปํ๊ณ , ์์ฌ์์ด ๋ง์ด ๋จ์๋ค.
kts๊ฐ ์์ฆ ๋ํดํธ๋ก ์ฃผ์ด์ง๊ธฐ๋ ํ๋ kts ๊ธฐ์ค์ผ๋ก ๊ธ์ ์์ฑํ๋๋ก ํ๊ฒ ๋ค. ์ด๋ฒ ์ฃผ์ ์์ groovy์ ํฐ ์ฐจ์ด๋ ์๋ค.
api & implementation ๊ตฌ๋ถํ๊ธฐ
dependencies {
api("org.apache.httpcomponents:httpclient:4.5.7")
implementation("org.apache.commons:commons-lang3:3.5")
compile("org.apache.httpcomponents:httpclient:4.5.7") // deprecated
}
์ธ๋ถ api ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๋๋ dependeny์ ์ถ๊ฐ๋ฅผ ํด์ค์ผํ๋ค. compile๋ก ํ๋ ๋ฐฉ๋ฒ๋ ์์์ผ๋ ์ด ๋ฐฉ๋ฒ์ 7.0 ์ด์๋ถํฐ๋ deprecated๋๊ณ ๊ทธ๋ ๋์ฒด๋๊ฒ api ํค์๋์ด๋ฏ๋ก ์ด๋ฒ ๊ธ์์๋ api์ implementation๋ง ๋ค๋ฃจ๋๋ก ํ๊ฒ ๋ค. api๋ compile์ ๋์ฒด์ ๋ก, compile๋ก ์ ์ธ๋ ๋ชจ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ api๋ก ๊ต์ฒดํด์ ์ฌ์ฉํ ์ ์๋ค.
์๋ ๊ทธ๋ฆผ์ Java Library Plugin์ ์ฌ์ฉํ ๋์ ๊ตฌ์ฑ๋์ธ๋ฐ,
์ด๋ก์ ๋ฐ์ค๋ค์ ์ฌ์ฉ์๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ์ ์ํด ์ ์ธํด์ผํ๋ ๊ฒ๋ค์ด๊ณ , ํ๋์ ๋ฐ์ค๋ ๋ด๋ถ ์ปดํฌ๋ํธ์์ ์ฌ์ฉํ ๋ ์ ์ธํ๋ ๊ฒ, ํํฌ์ ๋ฐ์ค๋ ๊ตฌ์ฑ์์๋ค์ด ์ปดํ์ผ๋๊ฑฐ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์คํ์ค์ผ ๋ ์ฌ์ฉ๋๋ ๊ตฌ์ฑ์ค์ ์ด๋ค. ํ์ดํ ๋ฐฉํฅ์ ๋ณด๋ฉด ์ ์ ์๋ฏ์ด api๊ฐ ๊ฐ์ฅ ์ต์์ ๋ ๋ฒจ์ด๊ณ , implementation์ด api๋ฅผ ๋ฐ์์ ์ฌ์ฉํ๋ ๊ฒ์ ์ ์ ์๋ค.
ํด๋์คํจ์ค๊ฐ ํ๋์์ผ๋ก ํํ๋์ด์๋๋ฐ, ์๋ฐํ์ผ์ ์ปดํ์ผํ๋ฉด ๋ฐ์ดํธ ์ฝ๋๊ฐ ๋ง๋ค์ด์ง๊ณ , ์ด๊ฑธ ์คํํ ๋ ๊ฐ๊ฐ ํน์ ๊ฒฝ๋ก์์ ํด๋์ค ํ์ผ๊ณผ ํจํค์ง๋ฅผ ํ์ํ๊ฒ ๋๋๋ฐ ์ด๊ฒ compileClasspath, runtimeClasspath๋ค.
๊ทธ๋ฆผ์ ๋ณด๋ฉด api, implementation ๋ชจ๋ ์ปดํ์ผ, ๋ฐํ์ ๊ฒฝ๋ก ๋ชจ๋ ์ค์ ํ๋ ๊ฒ์ ์ ์ ์๋ค. ์ด์ api์ implementation์ ์ดํด๋ณด์.
class A{
fun main(){
val b = B();
}
}
class B {
fun foo(): Int{
return C().bar();
}
}
class C {
fun bar(): Int{
return 10;
}
}
A๊ฐ ์ฌ์ฉ์์ ํด๋์ค๋ค. ์ธ๋ถ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ Bํด๋์ค๋ฅผ ์ฌ์ฉ์๊ฐ ์ฌ์ฉํ๋ ค๊ณ ํ๋๋ฐ, B์์๋ C์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ค. C๊น์ง ์ฐ๊ฒฐ๋ ๊ฑธ ์ ์ด ์์กด์ฑ(transitive dependency)์ด๋ผ๊ณ ํ๋ค.
graph LR
A-->B
B-->C
์ฌ์ฉ์๊ฐ ์ธ ๊ฒ์ B์ด๊ธฐ ๋๋ฌธ์, ์ปดํ์ผ ์ ํ์ํ ์์กด์ฑ์ด A, B ์ด๊ณ ๋ฐํ์ ๋๋ B๊ฐ ํธ์ถํ๋ C๋ ๊ฐ์ ธ์์ผํ๋ A, B, C๊ฐ ๋ฐํ์ ๋ ํ์ํ ์์กด์ฑ์ด๋ค. ์ฌ์ฉ์๊ฐ B ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ implementation์ผ๋ก ์ ์ธํ๋ค๋ฉด compile ์ปดํ์ผ ์ C๋ฅผ ์ ํ์๊ฐ ์๊ณ , C์ ๋ณํ๊ฐ ์๊ฒจ๋ ์ฌ์ฉ์๋ ์ ๊ฒฝ ์ธ ํ์๊ฐ ์๋ค.
์ ํํ ์๊ธฐํ๋ฉด implementaion์ด ์ ์ด ์์กด์ฑ์ ํ๋ฝํ์ง์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์๊ฐ C์ ๋ฉ์๋๋ฅผ ์ง์ ์ฌ์ฉํ ์ ์๋ค. ๋ฐ๋ฉด api๋ก ์ ์ธํ๋ค๋ฉด implementation๋ณด๋ค ๋์ ๋ฒ์๋ฅผ ๋ด๋นํ๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ ๋ C๋ ๋ค์ด๊ฐ๊ฒ ๋๋ค. ์ด๋ฌ๋ฉด ์ปดํ์ผ ์ ์ฌ์ฉ์๊ฐ C์ ์กด์ฌ๋ฅผ ์ ์ ์๊ณ C๊ฐ ์์ ์ด ๋๋ค๋ฉด ์ฌ์ฉ์๊ฐ ์ด ์ฌ์ค์ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์ ์ชฝ์์๋ ์ฌ์ปดํ์ผ์ด ํ์ํ๋ค.
์ฃผ๋ชฉํด์ผ๋ ๋ถ๋ถ์ ์ฌ์ปดํ์ผ์ด๋ค. ์ ์์์ฒ๋ผ ๊ฐ๋จํ ์์กด๊ด๊ณ์ ๊ฒฝ์ฐ์๋ ํฌ๊ฒ ์๊ด์์ ์ ์์ง๋ง, ๋ฉํฐ๋ชจ๋๊ณผ ๊ฐ์ด ์ฌ๋ฌ ๊ณณ์์ ๊ฐ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ฐ๋ก๋ฐ๋ก ์ฌ์ฉํ๊ฒ ๋๋ ๊ฒฝ์ฐ๋ฅผ ๊ฐ์ ํด๋ณด์.
graph LR
A-->B
D-->B
E-->B
B-->C
G-->V
B๋ฅผ ์ฌ์ฉํ๋ A, D, E๊ฐ ์๋๋ฐ, A์์ ์ฌ์ฉํ๋ B๋ฉ์๋๊ฐ C์ ์กด์ฌํ๋ค. C์ ์๋ ๋ฉ์๋(์ฌ๊ธฐ์๋ bar๋ฉ์๋) ๊ฐ ์์ ๋์์ ๋ api๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐํ๋ค๊ณ ๊ฐ์ ํ๋ฉด A, D, E ๋ชจ๋ ์ฌ์ปดํ์ผ์ด ํ์ํ ์ํฉ์ด ๋๋ค. ๋ C์ classpath๋ฅผ ์ปดํ์ผ ๊ฒฝ๋ก์ ๋ค ๋ ธ์ถ์ํค๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ ์๋๊ฐ ๋๋ ค์ง๊ณ , ์์ ๋งํ๋ฏ ์ฌ์ปดํ์ผ์ด ํ์ํ ๊ฒฝ์ฐ๋ ์๊ธฐ ๋๋ฌธ์ ์ ์ฒด์ ์ธ ์ปดํ์ผ์๊ฐ์ด ๋์ด๋๊ฒ ๋๋ ๋จ์ ์ด ์๊ธด๋ค. ๋์์ธํจํด ์ธก๋ฉด์ผ๋ก ์ ๊ทผํ๋ฉด ๋จ์ผ์ฑ ์์์น(Single Responsibility)์ ์ด๊ธ๋๋ค๊ณ ๋ณผ ์ ์๊ฒ ๋ค.
์ด๋ฅผ ํตํด ์ ์ ์๋๊ฑด ๋๋๋ก implementation์ผ๋ก ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐํด์ผํ๊ณ , api๋ฅผ ์ฌ์ฉํ ๊ฒฝ์ฐ ์ต๋ํ ์ฝํ ๊ฒฐํฉ์ ํ๊ฒ ์ ๋ํด์ผํ๋ค๋ ๊ฒ์ด๋ค. api๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ ์ญ์ ์ํฅ์ ๋ฏธ์น๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋, ๋ถ๋ชจํด๋์ค๋ ์ธํฐํ์ด์ค์ ํด๋นํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฌ์ฉํ๋ ๊ฒ์ด ํจ์จ์ ์ด๊ฒ ์ฐ๋ ๋ฐฉ๋ฒ์ด๋ค.
๋ฉํฐ๋ชจ๋, MVVM, MVC ์ ๊ฐ์ ํจํด์ ์กด์ฌ์ด์ ์ ๋น์ทํ๋ค๊ณ ์๊ฐํ๋ค.
์ฐธ์กฐ:
https://docs.gradle.org/current/userguide/java_library_plugin.html
"๋๊ธ, ๊ณต๊ฐ ๋ฒํผ ํ ๋ฒ์ฉ ๋๋ฅด๊ณ ๊ฐ์ฃผ์๋ฉด ํฐ ํ์ด ๋ฉ๋๋ค"