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로직에서 유효성 검사 및 기타 원하지 않는 형태의 데이터가 들어와 보안의 위협이 돼서 골치 아파진다.
#참고#
따라서 implementation이 더 합리적인 선택으로 보인다.
그리고 관련 내용을 더 찾아보니
A <- B <- C와 같이 B, C가 A라는 모듈을 의존하고 있다고 가정하자,
compile은 A가 수정이 되면, B, C와 같이 의존하고 있는 오브젝트들이 모두 다시 빌드되어야 한다.
반면 implementation은 A수정 시, 직접 의존하는 B만 다시 빌드를 하기 때문에 속도적인 측면에서 더 유리하다.
그리고 이는 프로젝트의 구조가 복잡할수록, 커질수록 더욱 많은 퍼포먼스상 차이를 보인다.
게다가 공식문서에서, gradle 3.0 이상부터는 compile을 사용을 권장하지 않는다.
기타 내용은 공식 문서를 참고하시면 더 좋습니다.
'IT 정보' 카테고리의 다른 글
Spring 실행시 콘솔에 나오는 글자 만들기 figlet (0) | 2020.11.30 |
---|---|
intelli j에서 jsp파일을 찾지 못할 때 (0) | 2020.11.30 |
Mac OS home brew 사용하기 (0) | 2020.11.30 |
클라우드 컴퓨팅이란? (0) | 2020.11.13 |
구직 활동에 선한 영향력을 끼친 것들 (0) | 2020.08.26 |
댓글