Build Gradle vs IntelliJ IDEA
작년에 처음 IntelliJ IDEA를 사용하기 시작하면서 이클립스와는 다른 단축키들을 익혔었다.
그 중 하나가 Gradle Project를 Gradle로 빌드 할건지 IntelliJ IDEA로 빌드할 것이지 설정이었다. 처음에는 기본 설정인 Gradle 빌드로 사용하다가 IntelliJ IDEA가 빠르다는 지인의 추천을 듣고 IntelliJ IDEA로 바꿔서 사용했다.
(참고로 이 설정은 IntelliJ Preferences(mac 단축키: command + ,) > Build, Execution, Deployment > Build Tools > Gradle에서 확인할 수 있다.)
잘 사용하던 중 Deprecated 처리 객체들을 정리하고 프로젝트를 실행시키니 갑자기 전에 지웠던 객체에서 내가 방금 지운 Deprecated 된 객체를 찾을 수 없다는 에러가 발생했다. 분명 Deprecated를 의존하는 객체는 전에 미리 지워둔 상태이고 그 객체를 지웠을 때 프로젝트는 인텔리제이에서 잘 빌드 되고 실행됐었다.
분명 다 지웠던 파일에서 갑자기 문제가 있다는 에러가 발생한다?
이상해서 에러 메시지를 잘 읽고 프로젝트 파일들을 확인해봤더니 빌드 된 결과물이 있는 out 폴더에 내가 전에 지웠던 파일이 그대로 남아 있었다. 그래서 out 폴더를 다 지우고 다시 빌드 및 실행을 해보니 이번에는 에러 없이 프로젝트가 잘 실행됐다.
분명히 전에는 out 폴더가 없었던 것 같은데 왜 갑자기 생긴건지 의아해 혹시 몰라 Gradle 빌드 방식을 IntelliJ IDEA > Gradle로 변경하니 out 폴더가 사라졌고 out 폴더를 지우지 않아도 똑같은 상황에서 같은 에러가 발생하지 않았다.
Build란 무엇인가?
우선 이 현상의 원인인 Gradle과 IntelliJ IDEA 빌드 방식을 비교하기 전에 빌드란 무엇인지에 대해 짚고 넘어가자.
빌드를 이야기하면 컴파일이라는 단어도 같이 정리되곤 하는데 컴파일은 빌드 안에 포함된다고 생각하면 된다. 인텔리제이와 같은 IDEA에서는 보통 프로젝트를 실행하면 자동으로 빌드를 수행한다.
Compile(컴파일)
우선 컴파일이란 자바와 같은 사람이 이해할 수 있는 프로그래밍 언어로 작성된 코드를 컴퓨터가 이해할 수 있는 더욱 저차원적인 코드 또는 기계어로 변환하는 것을 의미한다. 자바의 경우는 JVM(Java Virtual Machine)이 이 컴파일러 역할을 수행해주고 있다. 이와 같은 컴파일 과정을 거치면서 프로그래밍 언어로 작성된 코드가 문법적으로 이상은 없는지 또는 Checked Exception은 없는지 검사를 하고 그걸 알려준다.
Build(빌드)
빌드는 컴파일이 포함된 일종의 과정으로, 프로그래밍 된 코드를 컴파일하고 실행 가능한 결과물로 만드는 과정을 칭한다. IDEA에서는 보통 실행을 시키면 컴파일을 포함한 빌드 과정을 거쳐 실행 가능한 결과물을 만들고 그것을 실행시킨다.
Gradle Build vs IntelliJ IDEA Build
그렇다면 Gradle과 IntelliJ IDEA 빌드 설정은 실행하기 위해서 실행 가능한 결과물을 만드는 방식의 차이인데,
Gradle은 오픈 소스 빌드 자동화 도구이고 IntelliJ IDEA는 인텔리제이 자체에서 제공하는 빌드 자동화 도구이다.
(Gradle의 경우는 Maven과 자주 비교되곤 하는데 Maven과 비교는 다음에 해보도록 하겠다.)
여기서 Gradle 빌드 방식과 IntelliJ IDEA 빌드 방식의 제일 큰 차이는 증분 빌드냐 아니냐다.
증분 빌드(incremental build)란
증분 빌드는 용어 그대로 증분된 부분, 즉 변경된 부분만 빌드를 하는 방식으로 변경되지 않은 것에 대해서는 건너뛰고 빌드를 진행해서 빠른 빌드를 원할 경우 선택하는 방법이다. IntelliJ IDEA가 바로 증분 빌드이다. 그래서 IntelliJ IDEA가 Gradle 빌드 방식보다 빠르게 빌드를 수행할 수 있었던 것이다.
하지만 증분 빌드이므로 IntelliJ IDEA 빌드 방식은 최신이다라고 판단하고 건너뛰고 빌드를 진행해 이번에 겪었던 것과 같이 이미 삭제한 파일에 대해서 변경 사항이 없다라고 판단해 건너뛰고 빌드를 진행해 빌드를 진행하고 나온 결과물에 삭제됐던 파일이 그대로 포함된 상태로 빌드가 완료될 수 있다. 따라서 정확한 빌드를 원한다면 IntelliJ IDEA 빌드 방식이 아닌 Gradle 빌드 방식을 선택해야하는 것이다.
인텔리제이에서는 Build and run using, Run tests using 이렇게 두 가지 상황에 따라서 빌드 방식을 선택할 수 있어서 좀 더 유연하게 빌드 방식을 선택해서 사용할 수 있다. 예를 들어 실제 빌드하고 실행해야하는 것은 확실히 빌드하기 위해서 Gradle을 선택하고 테스트할 때는 빠른 빌드를 위해서 IntelliJ IDEA를 선택할 수 있다.
참고로 Gradle은 build 폴더로 빌드 결과물이 나오고 IntelliJ IDEA는 out 폴더로 빌드 결과물이 나오는 차이도 있다.
처음에 IntelliJ IDEA 빌드 방식이 더 빠르다는 것을 듣고 '오, 그렇구나.' 라고 바로 그냥 설정해서 사용하기만 했는데 확실히 이렇게 이슈가 생겨야지 그것이 다른 것과 어떻게 다르고 어떻게 동작하는지 등 상세하게 알아볼 생각을 하는 것 같다.
✋ IntelliJ Gradle settings
https://www.jetbrains.com/help/idea/gradle-settings.html
✋ incremantal build(MSBuild)
https://docs.microsoft.com/ko-kr/visualstudio/msbuild/incremental-builds?view=vs-2022