๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
BackEnd๐ŸŒฑ/Spring

[gradle] implementation, api ์ฐจ์ด

by dkswnkk 2024. 9. 7.

๊ฐœ์š”

Gradle์—์„œ ์˜์กด์„ฑ์„ ์„ค์ •ํ•  ๋•Œ๋Š” compileOnly, runtimeOnly, implementation, api ๋“ฑ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์˜ต์…˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํŠนํžˆ api์™€ implementation์€ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ”„๋กœ์ ํŠธ์— ์ถ”๊ฐ€ํ•  ๋•Œ ๊ฐ€์žฅ ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ, ์ด ๋‘˜์€ ๋ชจ๋‘ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€๋งŒ ๊ฐ๊ธฐ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๋™์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฐจ์ด์ ์„ ์•Œ์•„๋‘๋ฉด ์ข‹๋‹ค.

dependencies {
    api 'org.apache.httpcomponents:httpclient:4.5.7'
    implementation 'org.apache.commons:commons-lang3:3.5'
}

์ฐธ๊ณ ๋กœ ์ด์ „ Gradle ๋ฒ„์ „์—์„œ๋Š” implementation ํ‚ค์›Œ๋“œ๊ฐ€ ์—†์—ˆ๊ณ , ๋Œ€์‹  compile์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ ์šฉํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ Gradle 6.x ์ดํ›„ ๋ฒ„์ „์—์„œ๋Š” compile์ด deprecated ๋˜์—ˆ๊ณ , ๊ทธ ์ž๋ฆฌ๋ฅผ api ํ‚ค์›Œ๋“œ๊ฐ€ ๊ทธ ์ž๋ฆฌ๋ฅผ ๋Œ€์ฒดํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

 

 

api vs implementation

implementation์œผ๋กœ ์„ค์ •๋œ ์˜์กด์„ฑ์€ ์ „์ด๋˜์ง€ ์•Š์œผ๋ฉฐ, ํ•ด๋‹น ๋ชจ๋“ˆ ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ๋œ๋‹ค. ๋ฐ˜๋ฉด api๋กœ ์„ค์ •๋œ ์˜์กด์„ฑ์€ ์ „์ด๋˜์–ด ๋‹ค๋ฅธ ๋ชจ๋“ˆ์˜ ์ปดํŒŒ์ผ ํด๋ž˜์Šค ๊ฒฝ๋กœ(compileClasspath)์—๋„ ์ถ”๊ฐ€๋œ๋‹ค.

  • api ์˜์กด์„ฑ์€ ํ•ด๋‹น ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—๋„ ๋…ธ์ถœ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ˜„์žฌ ๋ชจ๋“ˆ์ด httpclient ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด, ์ด ๋ชจ๋“ˆ์„ ์˜์กดํ•˜๋Š” ๋‹ค๋ฅธ ๋ชจ๋“ˆ๋„ ์ž๋™์œผ๋กœ httpclient ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
  • ๋ฐ˜๋ฉด implementation ์˜์กด์„ฑ์€ ํ•ด๋‹น ๋ชจ๋“ˆ ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋ฉฐ, ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—๋Š” ๋…ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์˜์กด์„ฑ์„ ์บก์Šํ™”ํ•˜์—ฌ ๋‚ด๋ถ€ ๊ตฌํ˜„์„ ์™ธ๋ถ€์— ์ˆจ๊ธฐ๊ณ , ๋‹ค๋ฅธ ๋ชจ๋“ˆ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ฆ‰ implementation๋กœ ์„ค์ •๋œ ์˜์กด์„ฑ์€ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์˜ ์ปดํŒŒ์ผ ํด๋ž˜์Šค ๊ฒฝ๋กœ์— ํฌํ•จ๋˜์ง€ ์•Š์œผ๋ฉฐ, ์ด๋กœ ์ธํ•ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ธก(Producer)์—์„œ ์˜์กด์„ฑ์„ ๋ณ€๊ฒฝํ•˜๋”๋ผ๋„, ์‚ฌ์šฉํ•˜๋Š” ์ธก(Consumer)์€ ์žฌ์ปดํŒŒ์ผํ•˜์ง€ ์•Š์•„๋„ ๋œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์ปดํŒŒ์ผ ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•˜๊ณ  ์žฌ๋นŒ๋“œ ๋นˆ๋„๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค.

์•„๋ž˜์˜ ๋„ค ๊ฐ€์ง€ ๊ฒฝ์šฐ๋ฅผ ํ†ตํ•ด ์กฐ๊ธˆ ๋” ์ฐจ์ด์ ์„ ์ž์„ธํžˆ ์‚ดํŽด๋ณด์ž.

 

 

์˜ˆ์‹œ

1) ModuleB๊ฐ€ ModuleA๋ฅผ api๋กœ, Module C๊ฐ€ Module B๋ฅผ api๋กœ ์˜์กด

  • Module B๋Š” Module A๋ฅผ api๋กœ ์˜์กดํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ, Module B์—์„œ Module A์˜ Hello ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋˜ํ•œ Module C๋Š” Module B๋ฅผ api๋กœ ์˜์กดํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, Module A์— ๋Œ€ํ•œ ์˜์กด์„ฑ์ด ์ „์ด๋˜์–ด Module C์—์„œ๋„ Module A์˜ Hello ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

2) Module B๊ฐ€ Module A๋ฅผ api๋กœ, Module C๊ฐ€ Module B๋ฅผ implementation์œผ๋กœ ์˜์กด

  • Module B๋Š” Module A๋ฅผ api๋กœ ์˜์กดํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ, Module B์—์„œ Module A์˜ Hello ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Module C๋Š” Module B๋ฅผ implementation์œผ๋กœ ์˜์กดํ•˜๊ณ  ์žˆ์ง€๋งŒ, Module B๊ฐ€ Module A๋ฅผ api๋กœ ์˜์กดํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— Module C๋„ Module A์˜ Hello ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ฆ‰ implementation์œผ๋กœ ์˜์กดํ•˜๋”๋ผ๋„ api๋กœ ์—ฐ๊ฒฐ๋œ ์˜์กด์„ฑ์€ ์ „์ด๋œ๋‹ค.

 

3) Module B๊ฐ€ Module A๋ฅผ implementation์œผ๋กœ, Module C๊ฐ€ Module B๋ฅผ api๋กœ ์˜์กด

  • Module B๋Š” Module A๋ฅผ implementation์œผ๋กœ ์˜์กดํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, Module A์˜ ์˜์กด์„ฑ์€ Module B ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ๋œ๋‹ค. ์ฆ‰, Module B๋Š” Module A์˜ Hello ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๊ทธ ์˜์กด์„ฑ์€ ๋‹ค๋ฅธ ๋ชจ๋“ˆ๋กœ ์ „์ด๋˜์ง€ ์•Š๋Š”๋‹ค.
  • Module C๋Š” Module B๋ฅผ api๋กœ ์˜์กดํ•˜๊ณ  ์žˆ์ง€๋งŒ, implementation ์˜์กด์„ฑ์€ ์ „์ด๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— Module A์˜ Hello ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

 

4) Module B๊ฐ€ Module A๋ฅผ implementation์œผ๋กœ, Module C๊ฐ€ Module B๋ฅผ implementation์œผ๋กœ ์˜์กด

  • Module B๋Š” Module A๋ฅผ implementation์œผ๋กœ ์˜์กดํ•˜๋ฏ€๋กœ, Module B์—์„œ๋งŒ Module A์˜ Hello ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ์˜์กด์„ฑ์€ ์ „์ด๋˜์ง€ ์•Š๋Š”๋‹ค.
  • Module C๋Š” Module B๋ฅผ implementation์œผ๋กœ ์˜์กดํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, Module B์˜ ์˜์กด์„ฑ๋„ ์ „์ด๋˜์ง€ ์•Š์•„ Module C๋Š” Module A์˜ Hello ํด๋ž˜์Šค๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

 

์ฐธ๊ณ ๋กœ ์—ฌ๊ธฐ์„œ๋Š” ๋ชจ๋‘ Module A์— ์ž‘์„ฑ๋œ Hello ํด๋ž˜์Šค๋ฅผ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ์˜ˆ์‹œ๋กœ ๋“ค์—ˆ์ง€๋งŒ, Module A๊ฐ€ ํŠน์ • ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ api๋‚˜ implementation์œผ๋กœ ์˜์กดํ•˜๊ณ  ์žˆ์„ ๋•Œ, Module B์™€ Module C์—์„œ ๊ทธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋„ ๊ณ ๋ฏผํ•ด ๋ณด๋ฉด ์ข‹๋‹ค. ๋งŒ์•ฝ Module A๊ฐ€ httpclient ๊ฐ™์€ ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ implementation์œผ๋กœ ์˜์กดํ•˜๊ณ  ์žˆ์„ ๊ฒฝ์šฐ Module B์™€ Module C์—์„œ๋Š” Module A๋ฅผ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์˜์กดํ•˜๋”๋ผ๋„ ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค.

 

 

์ •๋ฆฌ

Gradle์€ ๊ฐ€๋Šฅํ•œ ํ•œ implementation์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜๋Š”๋ฐ, api๋Š” ์˜์กด์„ฑ์ด ๋‹ค๋ฅธ ๋ชจ๋“ˆ์— ์ „์ด๋˜์ง€๋งŒ implementation์€ ํ•ด๋‹น ๋ชจ๋“ˆ ๋‚ด๋ถ€์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๊ณ  ๋‹ค๋ฅธ ๋ชจ๋“ˆ์—๋Š” ๋…ธ์ถœ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. ๋ฌด๋ถ„๋ณ„ํ•˜๊ฒŒ api๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋ณด๋‹ค๋Š” ์ƒํ™ฉ์— ๋งž๊ฒŒ implementation์„ ์‚ฌ์šฉํ•˜์—ฌ ์˜์กด์„ฑ์„ ์บก์Šํ™”ํ•˜๊ณ , ์ด๋ฅผ ํ†ตํ•ด ์ปดํŒŒ์ผ ์‹œ๊ฐ„์„ ๋‹จ์ถ•ํ•˜์—ฌ ์žฌ๋นŒ๋“œ ๋นˆ๋„๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ์ด์ ์„ ์–ป๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.

ํŠนํžˆ ๋ชจ๋“ˆํ˜• ๋ชจ๋†€๋ฆฌ์‹ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์„ ๋•Œ๋Š” ์ด์ ์ด ๋”์šฑ ํฐ๋ฐ, ๋ชจ๋“ˆํ˜• ๋ชจ๋†€๋ฆฌ์‹ ๊ตฌ์กฐ์—์„œ๋Š” ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ์ด ํ•˜๋‚˜์˜ ํฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์„ฑํ•˜์ง€๋งŒ, ๊ฐ ๋ชจ๋“ˆ ๊ฐ„์˜ ๋…๋ฆฝ์„ฑ์ด ์ค‘์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. implementation์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“ˆ ๊ฐ„์˜ ๋ถˆํ•„์š”ํ•œ ์˜์กด์„ฑ ์ „์ด๋ฅผ ๋ง‰์•„ ๊ฐ ๋ชจ๋“ˆ์ด ๋ณ€๊ฒฝ๋  ๋•Œ ์ „์ฒด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์žฌ์ปดํŒŒ์ผํ•˜๋Š” ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค.

 

๋Œ“๊ธ€