๐Ÿ

Maven & Gradle

Person
์™„๋ฃŒ์œจ%
์ƒํƒœ
์ž‘์„ฑ์ค‘
๋‚˜์˜ ๋ธ”๋กœ๊ทธ
Think Sharing (TS)
 

Maven

  • Maven ๋ช…๋ น์–ด ๋ชจ์Œ
//== Maven ๋ช…๋ น์–ด ==// // ๋นŒ๋“œ๋ฅผ ํ•˜๊ธฐ์ „ ๋นŒ๋“œ ๊ฒฐ๊ณผ ์œ„์น˜๋ฅผ ๋น„์šฐ๋Š” ๋ช…๋ น์–ด, ์ฝ˜์†” ๋ช…๋ น์ฐฝ์—์„œ ์ˆ˜ํ–‰ mvn clean // compile ์ˆ˜ํ–‰ ๋ช…๋ น์–ด // compile ํ›„ target ๋””๋ ‰ํ† ๋ฆฌ๊ฐ€ ์ƒ์„ฑ๋˜๋ฉฐ ์ปดํŒŒ์ผ๋œ ๊ฒฐ๊ณผ๋ฌผ์ด ๋งŒ๋“ค์–ด์ง // target/classes/HelloWorld.class ํŒŒ์ผ ํ™•์ธ ๊ฐ€๋Šฅ mvn compile // ?? ์ด๊ฑด ๋ญ์—ฌ?? // ์•„๋ž˜์˜ ๋ช…๋ น์–ด๋กœ ์‹คํ–‰ํ•˜๋ฉด Maven Hello World! ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ฐํžŒ๋‹ค. // -cp : ํด๋ž˜์Šค ํŒจ์Šค ๊ฒฝ๋กœ java -cp tartget/classes HelloWorld // java ํŒจํ‚ค์ง• ๋ช…๋ น์–ด // target/HelloWorld-1.0-SNAPSHOT.jar ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค. mvn package java -jar target/HelloWorld-1.0-SNAPSHOT.jar HelloWorld

pom.xml ํŒŒ์ผ ๊ตฌ์กฐ

  • ํ”„๋กœ์ ํŠธ ์ •๋ณด
    • modelVersion
    • groupId
    • artifactId
    • version
    • packaging
  • properties
    • maven ๋‚ด๋ถ€์—์„œ ๋ฐ˜๋ณต์ ์œผ๋กœ ์‚ฌ์šฉ๋  ์ƒ์ˆ˜ ๊ฐ’์„ ์ •์˜ํ•  ๋•Œ ์‚ฌ์šฉ
  • Dependencies(์˜์กด์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ •๋ณด)
    • project ํƒœ๊ทธ ๋ฐ”๋กœ ํ•˜์œ„
    • ์˜์กด์„ฑ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ •๋ณด๋ฅผ ํฌํ•จํ•จ
    • ์ตœ์†Œ groupId, artifactId, version ์ •๋ณด๊ฐ€ ํ•„์š”ํ•จ
    • dependencies ์ƒ‰์…˜ ์•„๋ž˜ ์ƒˆ๋ถ€ โ€˜dependencyโ€™๊ฐ€ ๊ธฐ์ˆ ๋จ
  • ๋นŒ๋“œ(<build>) ์ •๋ณด
    • project ํƒœ๊ทธ ๋ฐ”๋กœ ํ•˜์œ„
    • plugins: ๋นŒ๋“œ์—์„œ ์‚ฌ์šฉํ•  ํ”Œ๋Ÿฌ๊ทธ์ธ
    • ๋””๋ ‰ํ† ๋ฆฌ ๊ตฌ์กฐ
  • Repository
    • ์˜์กด์„ฑ์„ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์„ ์œ„์น˜์˜ repository
    • ๊ธฐ์ˆ ๋˜์ง€ ์•Š์„ ์‹œ ๊ธฐ๋ณธ์ ์ธ ์œ„์น˜
    • ๋‹ค์ˆ˜์˜ <repository> ๊ธฐ์ˆ  ๊ฐ€๋Šฅ
    • ํšŒ์‚ฌ ๋‚ด๋ถ€์˜ repository๋ฅผ ๊ธฐ์ˆ  ํ•˜๊ธฐ๋„ ํ•œ๋‹ค.
      • nexus
      • artifactory๋ฅผ ์ด์šฉ
  • Plugin Repository
    • maven plugin์„ ๋‹ค์šด๋กœ๋“œ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์ €์žฅ์†Œ ์œ„์น˜๋ฅผ ๊ธฐ์ˆ 
  • ๋ฐฐํฌ
    • deploy goal์„ ์‹คํ–‰ํ–ˆ์„ ์‹œ, ๋ฐฐํฌ๋˜๋Š” ์œ„์น˜๋ฅผ ๊ธฐ์ˆ ํ•จ
    • url ํ•ญ๋ชฉ์—๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํšŒ์‚ฌ ๋‚ด๋ถ€์— ์„ค์น˜ํ•œ repository url์ด ๊ธฐ์ˆ ๋œ๋‹ค.(nexus, artifactory ๋“ฑ์œผ๋กœ ์„ค์น˜๋œ..)
    • <distributionManagement> <repository> <id>releases-repo</id> <name>Releases Repository</name> <url>์ผ๋ฐ˜์ ์ธ ํšŒ์‚ฌ ๋‚ด๋ถ€ repository url</url> </repository> <snapshotRepository> <id>snapshots-repo</id> <name>Snapshots Repository</name> <url>์ผ๋ฐ˜์ ์ธ ํšŒ์‚ฌ ๋‚ด๋ถ€ repository url</url> </snapshotRepository> </distributionManagement>

Goal ์ •๋ฆฌ

  • Goal
    • Maven์ด ํ–‰ํ• ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ช…๋ น์„ Goal์ด๋ผ๊ณ  ํ•จ.
    • ์‹คํ–‰๋ฐฉ์‹, ์ฒด์ธ ํ˜•ํƒœ๋กœ ์‹คํ–‰ ๊ฐ€๋Šฅ
    • mvn [goal๋ช…๋ น์–ด] [goal๋ช…๋ น์–ด] [goal๋ช…๋ น์–ด]

goal ์ข…๋ฅ˜

  • clean : ์ปดํŒŒ์ผ ๊ฒฐ๊ณผ๋ฌผ์ธ target ๋””๋ ‰ํ† ๋ฆฌ ์‚ญ์ œ
  • compile : ๋ชจ๋“  ์†Œ์Šค ์ปดํŒŒ์ผ, ๋ฆฌ์†Œ์Šค ํŒŒ์ผ์„ target/classes ๋””๋ ‰ํ† ๋ฆฌ์— ๋ณต์‚ฌ
  • package : compile ์ˆ˜ํ–‰ ํ›„, ํ…Œ์ŠคํŠธ ์ˆ˜ํ–‰, <packaging> ์ •๋ณด์— ๋”ฐ๋ผ ํŒจํ‚ค์ง• ์ˆ˜ํ–‰
  • install : package
  • deploy : install ์ˆ˜ํ–‰ ํ›„, ๋ฐฐํฌ ์ˆ˜ํ–‰, ์—ฌ๊ธฐ์„œ ๋ฐฐํฌ๋Š” ์›น์„œ๋ฒ„์— ๋ฐฐํฌ๊ฐ€ ์•„๋‹ˆ๋‹ค. ํšŒ์‚ฌ repo์— ๋ฐฐํฌ๋‹ค.
    • ์•„๋ž˜์™€ ๊ฐ™์ด distributionManagement ํ•ญ๋ชฉ์ด ๊ธฐ์ˆ ๋˜์–ด์•ผ ํ•œ๋‹ค.
...์ƒ๋žต <distributionManagement> <repository> <id>releases-repo</id> <name>Releases Repository</name> <url>ํšŒ์‚ฌrepository์ฃผ์†Œ(๋„ฅ์„œ์Šค)</url> </repository> <snapshotRepository> <id>snapshots-repo</id> <name>Snapshots Repository</name> <url>ํšŒ์‚ฌrepository์ฃผ์†Œ(๋„ฅ์„œ์Šค)</url> </snapshotRepository> </distributionManagement>

Version

  • SNAPSHOT
    • ex) 1.0-SNAPSHOT
    • ๊ฐœ๋ฐœ์ง„ํ–‰ ์ค‘์ž„์„ ๋‚˜ํƒ€๋‚ธ๋‹ค.
    • version์ด ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์•˜๋”๋ผ๋„ ํ•ญ์ƒ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋‹ค์šด๋กœ๋“œ ํ•œ๋‹ค.
    • ์†Œ๋ฌธ์ž๋กœ๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  • ํŠน๋ณ„ ๋„ค์ด๋ฐ์ด ์—†๋Š” ๊ฒฝ์šฐ
    • ex) 1.0.1
    • ํŠน๋ณ„ ๋„ค์ด๋ฐ์ด ์—†๋Š” ๊ฒฝ์šฐ๋Š” release ์ƒํƒœ๋ฅผ ์˜๋ฏธ
  • ์ผ๋ฐ˜์ ์ธ ๊ด€์šฉ์–ด๊ตฌ๋Š” maven์— ํŠน๋ณ„ํ•œ ๊ธฐ๋Šฅ์„ ๋ถ€์—ฌํ•˜์ง€ ์•Š๋Š”๋‹ค. ์ฆ‰ SNAPSHOT์—๋งŒ ํŠน๋ณ„ํ•œ ๋™์ž‘์„ ํ•œ๋‹ค.
    • ex) 1.0-RC1 (release candidate)
    • ex) 1.0-M1 (milestone release)
    • ex) 1.0-RELEASE (release)

Scope

  • dependency ํ•˜์œ„์— ํฌํ•จ๋˜๋Š” ํ•ญ๋ชฉ
  • ํ•ด๋‹น dependency๊ฐ€ ํฌํ•จ๋˜๋Š” ๋ฒ”์œ„์— ๋Œ€ํ•œ ํƒ€์ž…
  • scope ์ข…๋ฅ˜
      1. compile :
          • ๊ธฐ๋ณธ scope. ๋ฏธ์ž…๋ ฅ์‹œ์—๋„ ๊ธฐ๋ณธ ์ ์šฉ
          • ๋ชจ๋“  ์ƒํ™ฉ์—์„œ ํฌํ•จ๋จ
      1. provided :
          • compile๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ๋ชจ๋“  ์ƒํ™ฉ์—์„œ ์ˆ˜ํ–‰๋œ๋‹ค
          • ํ•˜์ง€๋งŒ, ๋‹ค๋ฅธ ์™ธ๋ถ€ ์ปจํ…Œ์ด๋„ˆ์—์„œ ๊ธฐ๋ณธ ์ œ๊ณต๋˜๋Š” API์ธ๊ฒฝ์šฐ provided๋กœ ์ง€์ • ์‹œ ๋งˆ์ง€๋ง‰ ํŒจํ‚ค์ง•ํ•  ๋•Œ ํฌํ•จ๋˜์ง€ ์•Š์Œ
          • ์˜ˆ๋ฅผ ๋“ค๋ฉด tomcat์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ servlet api๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ๋•Œ๋ฌธ์— servlet api๋ฅผ provided๋กœ ์ง€์ •ํ•˜๋ฉด ํŒจํ‚ค์ง•์‹œ ์ œ์™ธ๋œ๋‹ค.
      1. runtime :
          • ์ปดํŒŒ์ผ ์‹œ์—๋Š” ๋ถˆํ•„์š” ์‹คํ–‰์‹œ์— ํ•„์š”ํ•œ ๊ฒฝ์šฐ.
          • ๋Ÿฐํƒ€์ž„ ๋ฐ ํ…Œ์ŠคํŠธ ์‹œ classpath์— ์ถ”๊ฐ€ ๋˜์ง€๋งŒ, ์ปดํŒŒ์ผ์‹œ์—๋Š” ์ถ”๊ฐ€ ๋˜์ง€ ์•Š์Œ
      1. test : ํ…Œ์ŠคํŠธ์‹œ์—๋งŒ ์‚ฌ์šฉ
      1. system :
          • provided์™€ ์œ ์‚ฌ
          • system์˜ ํŠน์ • path๋ฅผ ์ฐธ์กฐํ•˜๋„๋ก ์ง€์ •
          • Maven์˜ central repository๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Œ
      1. import :
          • scope๋Š” dependencyManagement ์„น์…˜์—์„œ pom์˜ ์˜์กด๊ด€๊ณ„์— ๋Œ€ํ•ด ์‚ฌ์šฉ
 

Gradle

notion image
java-library ํ”Œ๋Ÿฌ๊ทธ์ธ์ด gradle์— ์ ์šฉ๋  ๋•Œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ตฌ์„ฑ. ์ถœ์ฒ˜: Gradle Java Library Plugin

implements

  • ์˜์กด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ˆ˜์ • ์‹œ ํ•ด๋‹น ๋ชจ๋“ˆ์„ ์˜์กดํ•˜๊ณ  ์žˆ๋Š” ๋ชจ๋“ˆ๋“ค ๋˜ํ•œ ์žฌ๋นŒ๋“œ
    • notion image
      A โ† B โ† C ์ผ ๋•Œ, A์—์„œ C ์ ‘๊ทผ ๋ถˆ๊ฐ€๋Šฅ
      B ์ˆ˜์ • ์‹œ, A๊นŒ์ง€ ์žฌ๋นŒ๋“œ

api, compile(deprecated)

  • ์˜์กด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ˆ˜์ • ์‹œ ํ•ด๋‹น ๋ชจ๋“ˆ์„ ์˜์กดํ•˜๊ณ  ์žˆ๋Š” ๋ชจ๋“ˆ๋“ค ๋˜ํ•œ ์žฌ๋นŒ๋“œ ๋ชจ๋“ˆ์—์„œ api๋‚˜ compile์„ ์‚ฌ์šฉํ•ด์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์˜ค๋ฉด, ์˜์กดํ•˜๋Š” ๋ชจ๋“ˆ์—๋„ ๊ฐ€์ ธ์™€ ์ง„๋‹ค.
    • notion image
      A(api) โ† B(api) โ† C B๋งŒ ๋…ธ์ถœ๋˜์–ด์•ผ ๋˜๋Š”๋ฐ, C์˜ ์ธํ„ฐํŽ˜์ด์Šค๊นŒ์ง€ ๊ฐ™์ด ๋…ธ์ถœ
  • C ์ˆ˜์ • ์‹œ, A์™€ B ๋ชจ๋‘ ์žฌ๋นŒ๋“œ
  • api ์ข…์†์„ฑ์ด ๋งŽ์ด ์žˆ์œผ๋ฉด ๋นŒ๋“œ ์‹œ๊ฐ„์ด ์ƒ๋‹นํžˆ ์ฆ๊ฐ€
  • ์ข…์†์„ฑ์˜ API๋ฅผ ๋ณ„๋„์˜ ๋ชจ๋“ˆ์— ๋…ธ์ถœ์‹œํ‚ค๊ณ  ์‹ถ์€ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ๋ฉด implementation ์ถ”์ฒœ
  • Leak ๋ฐœ์ƒ โ†’ B๋ฅผ ๋นŒ๋“œํ•˜๋ฉด์„œ ์ด๋ฏธ ๋“ค์–ด๊ฐ„ C๊ฐ€ ์ค‘๋ณต์œผ๋กœ A์—๋„ ์ถ”๊ฐ€๋˜๊ธฐ ๋•Œ๋ฌธ

compileOnly

  • ์ปดํŒŒ์ผ ์‹œ์—๋งŒ ํ•„์š”ํ•˜๊ณ , ๋Ÿฐํƒ€์ž„ ์‹œ์—๋Š” ๋ถˆํ•„์š”ํ•œ ๊ฒฝ์šฐ
  • ์ปดํŒŒ์ผํ•  ๋•Œ๋Š” ํ•ด๋‹น ์ข…์†์„ฑ์„ ์‚ฌ์šฉํ•˜๊ณ  build ์—์„œ๋Š” ์ œ์™ธ
  • build ํฌ๊ธฐ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ 
  • compileClassPath์—๋งŒ ์‚ฌ์šฉ๋˜๊ณ  ์†Œ๋น„์ž์—๊ฒŒ ๋…ธ์ถœ๋˜์ง€ ์•Š๋Š”๋‹ค.
    • (compileClassPath : ์ปดํŒŒ์ผ ์‹œ์—๋งŒ ํ•„์š”ํ•œ class path)
  • ์˜ˆ์‹œ๋กœ Lombok : ์ปดํŒŒ์ผ ๋•Œ ๋งŒ๋“ค์–ด์ง€๊ณ  ๋Ÿฐํƒ€์ž„ ๋•Œ๋Š” ์‚ฌ์šฉ๋˜์ง€ ์•Š์Œ

runtimeOnly

  • ์ปดํŒŒ์ผ ์‹œ์—๋Š” ๋ถˆํ•„์š” ํ•˜๊ณ , ๋Ÿฐํƒ€์ž„ ์‹œ์—๋งŒ ํ•„์š”ํ•œ ๊ฒฝ์šฐ
  • ์ปดํŒŒ์ผ ์‹œ๊ฐ„์ด ๋นจ๋ผ์ง€๋Š” ์žฅ์ 
  • runtimeClassPath์—๋งŒ ์‚ฌ์šฉ๋˜๊ณ  ์†Œ๋น„์ž์—๊ฒŒ๋„ ๋…ธ์ถœ ๋œ๋‹ค.
    • runtimeClassPath : ๋Ÿฐํƒ€์ž„ ์‹œ์— ํ•„์š”ํ•œ class path
  • ์˜ˆ์‹œ๋กœ h2, mysql, log4j
 
 

๐Ÿ”– ๋ด์•ผ๋  ์‚ฌ์ดํŠธ