12
15

์˜ฌํ•ด ์ดˆ์— ์ธํ„ด ๋ฉด์ ‘ ๋ณด๋ฉด์„œ ๋ฐ›์•˜๋˜ ์งˆ๋ฌธ ์ค‘ ๊ธฐ์–ต์— ๋‚จ๋Š” ์งˆ๋ฌธ์ด๋‹ค.

“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

https://docs.gradle.org/current/userguide/declaring_dependencies.html#sec:what-are-dependency-configurations

"๋Œ“๊ธ€, ๊ณต๊ฐ ๋ฒ„ํŠผ ํ•œ ๋ฒˆ์”ฉ ๋ˆ„๋ฅด๊ณ  ๊ฐ€์ฃผ์‹œ๋ฉด ํฐ ํž˜์ด ๋ฉ๋‹ˆ๋‹ค"
๋ฐ˜์‘ํ˜•
COMMENT