본문 바로가기
IT 정보

Gradle Compile과 implementation의 차이점

by 완기 2020. 11. 30.
728x90
반응형

Intelli J IDE에서 Spring boot + Gradle로 된 샘플 프로젝트로 Gradle에 관련된 프로젝트를 받았다.

 

기존에는 이클립스 + Maven으로 사용했는데, 사정 상 기존 조합을 버리고 

 

Intelli J + Gradle로 개발 환경을 변경했다.

 

일단 인텔리제이가 이클립스보다 최적화나 빌드 시, 속도가 더 빠른 것 같은 체감(?)이 든다.

 

그리고 인텔리제이를 사용하다보니 자연스레 gradle을 사용하게 됐는데,

 

maven은 intelli j 에서 더 이상 지원하지 않는다고 들었던 것 같다.

 

 

 


여하튼 본론으로 들어가 보면 Build.gradle을 열어서 dependency를 설정하려고 봤는데

 

어떤 건 compile 어떤 건 implementation이라서 상당히 곤혹스러웠다.... 이게 뭐지?

 

일단 추측컨데 compile은 말 그대로 컴파일 시 라이브러리를 다운로드하고 빌드하는 것으로 예상했다.

 

implementation은 java 인터페이스 상속시에 봤던 키워드 같아서, 종속된 오브젝트가 빌드될 때, 라이브러리도 같이 빌드되는 거라고 예상을 하고 레퍼런스를 뒤지기 시작했다.

일단 간단하게 발번역해보면 둘 다 사용을 위해 컴파일이 필요하지만 API의 노출 여부에 차이가 있다.

 

compile은 연결된 API 모두가 프로젝트에 의해 노출이 되고

implementation은 노출되지 않는다.

 

 

api가 노출이 되면, API로직에서 유효성 검사 및 기타 원하지 않는 형태의 데이터가 들어와 보안의 위협이 돼서 골치 아파진다.

 

#참고#

 

API 보안이란?

API 보안은 사용자가 소유하는 API와 사용하는 API 모두의 무결성을 보호합니다.

www.redhat.com

따라서 implementation이 더 합리적인 선택으로 보인다.

 

 

그리고 관련 내용을 더 찾아보니

 

A <- B <- C와 같이 B, C가 A라는 모듈을 의존하고 있다고 가정하자,

 

compile은 A가 수정이 되면, B, C와 같이 의존하고 있는 오브젝트들이 모두 다시 빌드되어야 한다.

 

반면 implementation은 A수정 시, 직접 의존하는 B만 다시 빌드를 하기 때문에 속도적인 측면에서  더 유리하다.

 

그리고 이는 프로젝트의 구조가 복잡할수록, 커질수록 더욱 많은 퍼포먼스상 차이를 보인다.

 

 

 

게다가 공식문서에서, gradle 3.0 이상부터는 compile을 사용을 권장하지 않는다.

 

 

기타 내용은 공식 문서를 참고하시면 더 좋습니다.

docs.gradle.org/current/userguide/dependency_management_for_java_projects.html#sec:configurations_java_tutorial

728x90
728x90

댓글