개인적으로 Spring boot 프로젝트 세팅을 하면서
Could not find method compile() for arguments [org.slf4j:slf4j-api] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler.
에러를 마주쳤다.
예전 프로젝트를 참고해서 만들던 탓일까..
구글링을 해보니 compile -> implementation 으로 수정하면 된다는 글을 보고..
두 개의 차이점이 뭐지..?
나는 gradle을 알고 사용하고 있는가?
라는 생각이 들어.. 급하게 공부를 시작했다.
(이럴 때 진짜 즉흥적인 걸 보면 나는 정말 P다.. 라는 생각이 들곤 한..)
Gradle이란, Groovy 기반으로 한 BUILD TOOL이다.
Gradle은 CI / CD 를 위한 아래의 TASK들을 자동화 시켜준다.
Maven과 같은 이전 세대 빌드 도구의 단점을 보완하여 구성되어졌다.
DSL(Domain Specific Language)이란?
관련 특정 분야에 최적화된 프로그래밍 언어
gradle은 다른 빌드 도구에 비해 빌드 속도가 빠른 편이다.
그 이유에 대해서 알아보자
점진적 빌드란, 이미 빌드된 파일말고 변경된 파일만 빌드하는 것을 말한다.
빌드 속도가 빠른 가장 큰 이유라고 할 수 있다.
빌드가 정상적으로 진행되지 않을 경우 cache를 clean 해준 뒤 다시 진행한다.
먼저 빌드된 파일이 있을 경우, 빌드 캐시를 이용해 해당 내용을 공유한다.
이로 인해 같은 파일이 다시 빌드되지 않아 빌드 시간이 줄어든다.
Daemon Process란, 서비스의 요청에 응답하기 위해 오랫동안 살아있는 프로세스
Daemon Process는 메모리 상에 빌드 결과물을 보관한다.
이로 인해 한 번 빌드된 프로젝트는 다음 빌드에서 적은 시간만 소요된다.
gradle 기반의 Spring Boot나 안드로이드 를 실행해본 사람들은 이해할 것이다.
첫 번째 실행보다 두 번째 실행이 훨씬 적응 시간이 소요된다.
Gradle에서 데몬 프로세스를 지원하기 때문에 빌드 시간이 줄어든다.
compile : 의존 라이브버리 수정 시 모든 모듈이 재빌드된다.
본 모듈을 의존하는 모듈은 해당 라이브러리의 api 를 사용할 수 있다.
implementation: 의존 라이브러리 수정시 본 모듈까지만 재빌드한다.
본 모듈을 의존하는 모듈은 해당 라이브러리의 api 를 사용할 수 없음
api: 의존 라이브러리 수정시 본 모듈을 의존하는 모듈들도 재빌드
본 모듈을 의존하는 모듈들도 해당 라이브러리의 api 를 사용할 수 있음
compileOnly: 이름에서 알 수 있듯이 compile 시에만 빌드하고 빌드 결과물에는 포함하지 않는다.
runtime 시 필요없는 라이브러리인 경우 (runtime 환경에 이미 라이브러리가 제공되고 있는가 하는 등의 경우)
runtimeOnly: runtime 시에만 필요한 라이브러리인 경우
annotationProcessor: annotation processor 명시 (ex:lombok)
testImplementation : 테스트 코드를 수행할 때만 적용.
build.gradle이라는 파일을 보면
의존성 옵션 compile(), implementation()을 자주 보게된다.
compile 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-web'
출처 : https://bluayer.com/13
compile : A모듈을 수정하게 되면 A를 의존하는 모든 모듈이 rebuild 된다. (해당 사진에서 A,B,C가 모두 재빌드되어 시간이 오래걸린다)
gradle의 장점인 빠른 빌드를 방해하기 때문인지..
gradle 3.0부터 deprecated 되었다. (gradle 3.0 이상 버전 사용불가)
implementation. : A모듈을 수정하게 되면 A를 직접적으로 의존하는 모듈까지만 rebuild 한다.(해당 사진에서 A,B가 재빌드되어 compile보다 빠르다)
아직은 너무 공부할 내용이 많은 것 같다..😭
앞으로 gradle에 대해서 조금씩 더 다가가 보는.. 시간을 가져야겠다...
다음에는 build script를 작성하는 방법에 대해서 더 집중적으로 해봐야겠다.
감사합니다 :)
compile과 implementation 차이점을 모르고 무지성으로 썼었는데 확실히 알고 가네요 😀
gradle 3.0 이상부터는 compile을 사용을 권장하지 않는다는 사실도 처음 알았네요
저도 개인적으로 spring boot를 다루면서
같은 궁금증이 있었지만 모르고 넘어갔던 부분이 였는데,
정리해주신 내용이 유익했습니다. 감사합니다 !!
Thank you for sharing a very meaningful article, I think it will be very helpful for me and everyone.
Play game the baby in yellow online.
헐 이건 진짜 궁금했던 내용인데 :! 유니짱 ჱ̒ ー̀֊ー́ )