코딩못하는사람

Gradle 의존성 옵션 정리(Compile VS implementation,옵션) 본문

스프링부트(SpringBoot)/활용

Gradle 의존성 옵션 정리(Compile VS implementation,옵션)

공부절대안함 2021. 6. 5. 02:12

Gradle 이란?

그래들(이하 Gradle)은 그루비(Groovy)를 기반으로 한 빌드 도구.

Ant Maven과 같은 이전 세대 빌드 도구의 단점을 보완하고 장점을 취합하여 만든 오픈소스로 공개된 빌드 도구.

 

처음 SpringBoot로 프로젝트를 만든다면 프로젝트에 필요한 의존성들을 체크하고 Build Tool을 고르게 되면

프로젝트에 의존성 주입이 완료된다.

이렇게 의존성을 주입받아 프로젝트를 진행하다가 필요한 라이브러리를 검색하다 보니 크게 두가지 형태로 나누어져있는 것을 보고 차이점이 궁금했다.

Compile VS implementation

compile group: 'org.apache.logging.log4j', name: 'log4j-api', version: '2.14.1'

implementation 'org.springframework.boot:spring-boot-starter-security'

의존성 주입이라는 것은 같지만 다른 모습을 보인다, 차이점을 알아보자.

 

https://bluayer.com/13

 

첫번째 그림을 보면 모듈 B,C가 A에 의존하고 있는 그림이다.

1.compile을 사용하는 경우

A모듈을 수정하게 되면 A를 의존하는 모든 모듈이 rebuild 된다. (시간이 오래걸린다)

 

2.implementation을 사용하는 경우

A모듈을 수정하게 되면 A를 직접적으로 의존하는 모듈까지만 rebuild 한다.(빠르다)

 

나는 이유없이 implementation을 사용하고 있었지만 다음과 같은 장점이 있다.

1.빠르다.

직접적으로 의존하는 모듈까지만 rebuild해주기 때문에.

2.API 노출을 막는다.

사용자에게 필요이상의 API를 노출하는 것은 불필요하다.(Facade 패턴)

compile을 사용하면 연결된 모든 모듈의 API가 노출된다.

 

2.의존성 옵션들

implementation: 의존 라이브러리 수정시 본 모듈까지만 재빌드한다.
본 모듈을 의존하는 모듈은 해당 라이브러리의 api 를 사용할 수 없음


api: 의존 라이브러리 수정시 본 모듈을 의존하는 모듈들도 재빌드
본 모듈을 의존하는 모듈들도 해당 라이브러리의 api 를 사용할 수 있음


compileOnly: 이름에서 알 수 있듯이 compile 시에만 빌드하고 빌드 결과물에는 포함하지 않는다.
runtime 시 필요없는 라이브러리인 경우 (runtime 환경에 이미 라이브러리가 제공되고 있는가 하는 등의 경우)

runtimeOnly: runtime 시에만 필요한 라이브러리인 경우


annotationProcessor: annotation processor 명시 (ex:lombok)

 

testImplementation : 테스트 코드를 수행할 때만 적용.

 

 

 

너무 자주 볼 설정들 같아서 정리했다.

공부한 곳 및 출처

https://bluayer.com/13

https://writemylife.tistory.com/57

Comments