JAVA/gradle

[ 설정 ] - 플러그인 디펜던시 차이?

algml0703 2024. 12. 28. 00:03
반응형

플러그인(plugin)과 디펜던시(dependency)의 차이?

플러그인(Plugin)?

플러그인은 gradle을 통한 빌드 시에 기능이나 새로운 작업을 추가해주는 역할을 한다. 주로 빌드, 테스트, 배포와 같은 빌드 작업을 정의하고 설정을 자동화한다.

ex) build.gradle

  • id("java")
  • compileJava, test, jar 등과 같은 작업을 자동으로 수행하도록 해주는 플러그인이다. (java의 경우 gradle 자체 내장 플러그인으로 버전을 명시해주지 않아도 된다. 외부 플러그인의 경우에는 반드시 버전을 명시하여 주어야 한다. ) 
  • id("org.springframework.boot")
  • bootRun, bootJar를 등의 작업을 자동화해주어, 최소한의 설정만으로 스프링 어플리케이션을 실행시킬 수 있도록 돕는 플러그인이다.
  • id("io.spring.dependency-management")
  • 디펜던시를 관리하여 주는 플러그인이다.
  •  

* jar란

Java 애플리케이션이나 라이브러리를 JAR(Java Archive) 파일로 패키징하는 작업을 의미한다. 즉 Java 클래스 파일과 리소스 파일을 포함하는 압축 형식의 파일이다. 기본적으로 src/main/java 디렉토리 하위에 있는 java 소스 파일을 컴파일하여 .class 파일로, src/main/resource 디렉토리 하위의 파일들에 대해 jar로 만들어 build/libs에 생성한다. jar를 이용함으로써 Java 어플리케이션을 배포하거나, 라이브러리로써 활용이 가능하다. 즉 jar는 Java 환경에서 특별히 동작하도록 설계된 구조와 메타데이터를 포함하는 일종의 압축 파일이라 할 수 있다. 

* java -jar [jar 파일]

해당 jar로 구성된 애플리케이션을 실행시켜 준다.  ex )java -jar ./board/build/libs/board-0.0.1-SNAPSHOT.jar 

** gradle은 java 뿐 아니라 Kotlin, Groovy 등의 다양한 프로젝트 언어를 지원한다. 때문에 플러그인 설정을 통해 다양한 언어를 지원할 수 있게 된다. 예를 들어 코틀린을 사용하는 경우 플러그인으로 id("org.jetbrains.kotlin.jvm")를 추가하면 코틀린 적용 가능하다.

# https://plugins.gradle.org/  


디펜던시(Dependency)?

프로젝트에서 사용하는 외부 라이브러리를 의미한다. 아래와 같이 디펜던시를 추가하면 원격저장소에서 라이브러리를 다운받아와 준다. 플러그인이 빌드, 테스트, 배포 등 gradle 자체의 프로세스와 기능을 자동화하거나 확장해주는 역할이라면, 디펜던시의 경우 해당 프로젝트 내에서 사용되는 실제 기능이나 코드를 제공하여 주는 코드 모음이라 할 수 있다.

# https://yooverd.tistory.com/19 (라이브러리 버전 관리 관련 설명 블로그)

디펜던시를 추가할 때는 아래와 같이 implementation, testImplementation, runtimeOnly 등이 있다.

  • implementation
  • 컴파일과 런타임 모두에 사용되는 의존성 라이브러리 추가 시 사용, implementation으로 추가한 디펜던시의 경우 해당 모듈에서만 적용되고, 상위 모듈로 전파되지 않는다.
  • api
  • implementation과 유사하게 컴파일과 런타임 모두에 사용되는 의존성 라이브러리 추가 시 사용되지만, 차이점은 api를 통해 추가한 디펜던시의 경우 해당 모듈 뿐 아니라 상위 모듈에도 전파되어 사용 가능하다.
  • testImplementation
  • 테스트 실행 시 사용되는 의존성 라이브러리 추가 시
  • compileOnly 
  • 컴파일 시에만 필요한 의존성 라이브러리 추가 시
  • runtimeOnly
  • JDBC나 로그 구현체 관련한 디펜던시 등 런타임 시에만 필요한 의존성 라이브러리 추가 시 
  • AnnotationProcessor
  • Lombok과 같이 컴파일 시에 어노테이션 관련한 의존성 라이브러리 추가 시 (컴파일 시에 Lombok을 사용해 코드 생성, 런타임시에는 필요하지 않다.)

build.gradle 설정 관련

하나 이상의 모듈로 구성된 프로젝트 구조를 갖춘 경우 기본적으로 루트 프로젝트와 서브프로젝트라는 개념이 존재한다. 여러 모듈이 모인 가장 최상단이 루트 프로젝트가 되고, 그 안의 각각의 모듈이 하나의 서브프로젝트가 된다. 예를들어 아래의 구조를 보면 market이 루트 프로젝트가 되고, 그 안의 market-boot, market-controller, market-domain, market-service 가 각각의 서브 프로젝트가 된다.

[ plugins ]

이때에 build.gradle 설정 시에는 공통적인 플러그인 설정은 plugins 스코프 안에, 모든 서브 프로젝트에 적용하려는 플러그인의 경우 subprojects 스코프 안에 넣어준다. 또 한 가지 다른 점은 플러그인 적용 시에 subprojects에서 적용되는 플러그인은 apply plugin: '[플러그인]' 이와 같은 식으로 적용된다. 아래의 코드를 보면 디펜던시의 경우에도  공통적으로 모든 서브프로젝트에서 사용되는 경우에는 해당 디펜던시를 추가해줌

또한 각각의 모듈은 모듈 내부의 build.gradle 파일을 통해 각 모듈에 독립적인 플러그인 설정도 가능하다. 

[ ext ]

ext의 경우 gradle에서 사용할 속성을 사용자가 추가적으로 정의하여 할 때 사용한다. 예를 들어 아래 build.gradle 설정에서는 ext { lombokVersion = '1.18.24'} 명시해줌으로서 lombok 버전을 전역적으로 관리하게 된다. 이를 통해 공통적인 속성 값에 대한 관리가 편리해진다.

[ allprojects ]

루트 프로젝트와 서브 프로젝트 모두에서 공통적으로 적용되는 설정을 추가하려 할 때 사용한다.

[ configurations ]

디펜던시 관련한 설정을 하려 할 때 사용한다. 위에서 디펜던시 부분에서 언급하였던 것처럼 implementation, compileOnly, runtimeOnly 등의 각각의 디펜던시 그룹별로 적용할 설정을 할 수 있고, configurations { all { .. } }을 통해 모든 의존성 그룹에 대해 적용하는 설정을 하는 것도 가능하다. 

      • allprojects : 루트프로젝트와 서브프로젝트 모두에 적용
      • configurations : 의존성 관련한 설정을 하려는 부분
      • configurations { all {} } : 모든 의존성 그룹에 대해 설정 적용
      • resolutionStrategy : 의존성 전략 관련 설정 (버전이나 캐싱 설정 등)
      • resolutionStrategy.cacheChanginModulesFor : SNAPSHOT 버전의 디펜던시에 대한 캐싱 지속 시간 설정
      • resolutionStrategy.cacheChanginModulesFor 0, 'seconds' : 캐싱 시간을 0초로 설정, 즉 gradle 빌드 실행 시에 원격 저장소에서 항상 최신 버전의 라이브러리를 가져온다. 
      • resolutionStrategy.cacheChanginModulesFor 1, 'hours'  : 이과 같이 설정 시에는 1시간 동안 로컬캐시를 사용하다가, 이후에 원격저장소를 확인하여 버전이 업데이트 된 경우, 가장 최신 버전을 받아온다.

** https://docs.gradle.org/current/dsl/org.gradle.api.artifacts.ResolutionStrategy.html (resolutionStrategy 관련)

gradle이 모든 프로젝트에 대해 추가된 SNAPSHOT 버전의 라이브러리에 대해 캐시하지 않고 원격 저장소에서 항상 최신 버전으로 가져옴. 해당 설정을 해주지 않으면 SNAPSHOT 버전의 라이브러리는 기본적으로 24시간 캐싱되기 때문에,  추가적으로 개발이 진행되어 라이브러리가 업데이트 되어도 이전 버전의 라이브러리를 그대로 사용하게 된다. (반면 라이브러리 사용이 많은 프로젝트에서 매번 새로 라이브러리르 받아오면 빌드 속도가 저하될 수 있다.)

** SNAPSHOT : 기본적으로 지속적으로 업데이트가 발생할 가능성이 있는 개발 중인 디펜던시에 대해 SNAPSHOT을 붙인다.

** release : SNAPSHOT과 반대로 1.0.0, 1.0.1 등과 같이 개발이 완료되어 정식으로 배포된 고정된 버전을 의미한다. 

[ dependencyManagement ]

io.spring.dependency-management 플러그인과 함께 사용되어 의존성의 버전을 전역적으로 관리할 수 있게 도와주는 설정이다.

'io.spring.dependency-management' 플러그인은 maven에서 사용하는 BOM 기능을 gradle에서 사용 가능하도록 해준다.

* * BOM : 의존성 버전 목록을 정의한 파일.  라이브러리들의 버전을 BOM 파일에 정의하여, 별도로 각각의 라이브러리에 버전을 설정하여 주지 않아도 된다.

위의 설정을 spring-boot-starter-web의 경우 버전을 명시해주지 않았지만, dependencyManagement 설정에 의해 BOM이 제공하여 주는 버전을 다운받게 된다. (모든 라이브러리에 대한 버전 정보를 가지고 있는 것은 아니기 때문에 BOM에 정의되지 않은 경우에는 별도로 라이브러리 버전을 명시해주어 관리해야 한다.)

즉  dependencyManagement -> 디펜던시에 대한 버전을 spring-boot-dependencies BOM에서 가져와서 각각의 라이브러리 버전을 자동으로 설정해주는데, 이때 각 스프링부트 버전별로 라이브러리 버전도 달라지기 때문에 어떤 버전으로 가져올 지 설정해주어야 한다. 

반응형

'JAVA > gradle' 카테고리의 다른 글

gradle.properties 파일 설정하기  (0) 2023.02.18
[ Spring boot ] - gradle multi project 생성 방법  (0) 2023.01.10