프로젝트 세팅을 하다가 QueryDSL 설정 글들을 몇 개 찾아봤는데, 글마다 설정이 조금씩 달랐습니다.
어떤 글은 annotationProcessor 설정이 있었고, 어떤 글은 플러그인 버전 이야기를 먼저 했습니다. 그러다 보니 자연스럽게 이런 생각이 들었습니다.
왜 Spring이나 QueryDSL을 쓰는데 Gradle 버전까지 같이 봐야 하지?
처음에는 저도 Spring이 Gradle에 직접 의존하는 줄 알았는데, 정리해보니 그건 아니었습니다.
이 글은 그때 헷갈렸던 내용을 제가 이해한 기준으로 간단히 정리한 기록입니다.
Gradle은 결국 뭘 해주는 걸까?#
Gradle은 빌드 도구입니다.
Java 프로젝트를 실행 가능하게 만들기까지 필요한 작업을 대신 처리해 줍니다.
제 기준에서는 라이브러리 받아오고, Java 코드를 컴파일하고, 테스트를 돌리고, 마지막에 jar 같은 결과물로 묶는 것까지 맡는 도구라고 이해하니까 조금 정리가 됐습니다.
예를 들어 build.gradle에 아래처럼 적어두면
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
}Gradle이 저장소에서 해당 라이브러리를 받아오고, 필요한 하위 의존성까지 같이 가져옵니다.
그리고 아래 명령어를 실행하면
./gradlew test테스트도 알아서 실행해 줍니다.
결국 개발자가 매번 수동으로 하던 작업을 순서에 맞게 실행해 주는 도구라고 보면 이해하기 편했습니다.
왜 설정 글마다 Gradle 버전 이야기가 같이 나올까?#
제가 헷갈렸던 지점은 여기였습니다.
애플리케이션은 Spring Boot로 만들고 있는데, 왜 Gradle 버전 호환성 이야기가 같이 나오는 걸까 싶었습니다.
이유는 애플리케이션이 Gradle에 의존하는 게 아니라, 빌드 과정에서 사용하는 플러그인과 설정이 Gradle 버전에 영향을 받기 때문입니다.
예를 들어 Spring Boot를 Gradle에서 사용할 때는 보통 플러그인을 추가합니다.
plugins {
id 'org.springframework.boot' version '3.2.0'
}이 플러그인은 Gradle 위에서 동작합니다.
즉, Gradle이 제공하는 기능과 방식에 맞춰서 만들어져 있습니다. 그래서 Gradle 메이저 버전이 바뀌면, 예전 방식으로 작성된 플러그인이나 설정 코드가 더 이상 동작하지 않는 경우가 생깁니다.
그래서 Spring Boot 공식 문서에서도 지원하는 Gradle 버전을 같이 확인하게 되는 것 같습니다.
QueryDSL은 왜 더 민감해 보였을까?#
QueryDSL은 특히 설정 글마다 차이가 더 크게 느껴졌습니다.
이유는 QueryDSL이 단순히 라이브러리만 추가해서 끝나는 게 아니라, 빌드 시점에 QClass를 생성하는 과정이 들어가기 때문입니다.
예를 들면 Member 엔티티가 있으면 빌드할 때 QMember 같은 클래스가 생성됩니다.
이 작업은 보통 annotation processing 과정에서 처리되는데, 이 부분이 Gradle 버전에 따라 설정 방식이 조금씩 달라집니다.
그래서 예전에 작성된 글을 그대로 따라 하면 현재 프로젝트에서는 동작하지 않는 경우가 생깁니다.
실제로 제가 찾아본 글들도 Gradle 버전이 다르다 보니 설정 코드가 조금씩 달랐습니다.
마무리#
결국 제가 이해한 건 이렇습니다.
Spring이나 QueryDSL이 실행 중에 Gradle을 쓰는 것은 아닙니다. Gradle은 어디까지나 빌드할 때 필요한 도구입니다.
다만 빌드 과정에 들어가는 플러그인이나 annotation processing 설정은 Gradle 버전에 영향을 받습니다. 그래서 프로젝트 세팅할 때 라이브러리 버전만 볼 게 아니라 Gradle 버전도 같이 봐야 했던 것이었습니다.
결국 배포된 jar 파일 안에 Gradle이 들어가는 것은 아닙니다.
Gradle은 빌드가 끝나면 역할이 끝나고, 실제 실행은 Spring 애플리케이션이 담당합니다.
저는 이걸 이해하고 나서야 왜 공식 문서나 설정 글에서 “Spring Boot 버전”, “Gradle 버전”, “Java 버전"을 같이 보라고 하는지 조금 감이 왔습니다.
