스프링 부트 그래이들 플러그인
필자가 이번주 업무 중에 Lombok 을 사용하는 프로젝트에서, Jar 패키징 실패가 계속 발생하는 이슈가 있었다. 프로젝트 스프링 버전은 2.0.8 이었고, Lombok 은 스프링 의존성에 따라서 사용했다. 개발할 때는 전혀 문제가 없었는데, 배포를 위한 패키징 과정에서 에러가 발생을 했다. 원인을 찾아보니, 스프링 부트 2.0.8 버전의 자동 디펜던시로 추가된 Lombok 으로 인해서 패키징 오류가 발생했기 때문이다. 이번 기회에 Spring Boot Gradle Plugin 에 대해서 간략하게 정리를 해보겠다. 참고로, 2019년4월13일 기준으로 스프링부트 최신 버전은 2.1.4.RELEASE 이지만, 필자가 경험했던 상황을 설명하기 위해서 스프링 부트 2.0.8.RELEASE 버전 기준으로 글을 작성하였다.
이번 글은, 사실 별 내용 없습니다. 이번 주 삽질했던 이슈에 대한 기록입니다.. Gradle 잘 아시면 안보셔도 됩니다.
스프링 부트 Gradle Plugin은 스프링부트 디펜던시(의존성) 관리 및 애플리케이션을 패키징을 지원한다. 스프링 부트 2.0.8.RELEASE 에서는, Gradle 4.0 이후 버전이 필요하다.
플러그인을 추가하기 위해서는 먼저 아래와 같이 build.gradle 에 작성하면 된다.
buildscript 로 작성해도 된다. buildscript 에 대한 자세한 설명은 생략한다.
"io.spring.dependency-management" 플러그인을 적용하면 spring-boot-dependencies 를 사용해서 사용중인 스프링 부트 버전에서 자동으로 의존성을 가져오게 된다. 참고로, 스프링부트 1.X 에서는 디펜던시 관리 플러그인이 자동으로 적용이 되었는데, 스프링부트 2.X 부터는 build.gradle 에 아래와 같이 정의를 해줘야 한다. "io.spring.dependency-management" 플러그인 적용은 아래와 같이 작성하면 된다.
Lombok 라이브러리를 디펜던시 추가한다면, 아래와 같이 버전 정보 없이 작성을 해도 된다.
그렇다면, 이때 적용되는 lombok 버전은 뭘까? 필자의 테스트 환경은 스프링부트 2.0.8.RELEASE 이다. 해당 버전에서의 spring-boot-dependencies 를 확인해보자.
spring-boot-dependencies Github Repository 를 찾아가서, 스프링부트 버전 2.0.8 브랜치를 선택하자. 아래와 같이 lombok 버전을 확인할 수 있다. 스프링 부트 2.0.8.RELEASE 에서 자동으로 지정되는 Lombok 의 버전은 1.16.22 이다.
개발할때는 전혀 문제가 없었다. 하지만, jar 패키징을 생성하기 위해서 bootjar 를 실행하면 아래와 같은 오류 메시지가 발생한다.
오류가 발생하는 이유는, Lombok 버전 이슈이다. 필자는 그동안, 왠만해서는 spring-boot-dependencies 에서 제공하는 버전 그대로 사용했다. 스프링을 리딩하는 개발자들이 버전 의존성 테스트를 꼼꼼하게 했다고 믿기 때문이다. 하지만, 경우에 따라서는 위와 같이 버전 이슈로 에러가 발생할 수도 있다. 해당 문제를 해결하기 위해, Lombok 버전을 명시해보자.
커스텀하게 버전을 명시하기 위해서는 아래 구문을 추가하면 된다.
ext 를 사용해도 되지만, 아래와 같이 추가해도 된다. Lombok 버전을 1.18.2 로 변경하자.
패키징을 하면, 정상적으로 오류 없이 bootjar 가 실행될 것이다.
[필자의 의견]
현재 회사에서, 일부 팀원들이 스프링 부트 의존성을 따르지 않고 디펜던시 버전을 직접 명시해서 사용하고 있다. 하지만, 스프링 부트 각각 릴리스 버전은 의존성 테스트를 꼼꼼히 수행한 이후 출시되기 때문에 믿고 따르는게 좋겠다는 생각이다. 버전을 커스텀하게 변경하는 작업은 주의가 필요하다. 가능하면 spring-boot-dependencies 버전에 따라서 자동으로 적용되는 버전을 사용하고, 위와 같이 이슈가 있는 상황에서만 버전을 명시하는 방향으로 개발/운영하는 방향이 바람직하다는 생각이다.
bootJar Task 를 사용하면 배포 가능한 Jar 를 생성할 수 있다. 자세한 내용은 공식 레퍼런스를 참고하길 바란다.
https://docs.spring.io/spring-boot/docs/2.0.8.RELEASE/gradle-plugin/reference/html/
Gradle은 버전이 변경될 때마다 바뀌는 내용이 꽤 많아서, 필자 처럼 Gradle 에 아직 익숙하지 않은 개발자들은 가끔 혼란을 겪는 경우가 있다. 그래서인지, 일부 팀원들은 아직 Maven 을 선호하기도 한다. 필자도 솔직히 Gradle, Maven 뭐가 좋다나쁘다 말하기 어려운 상황이다. 평소에는 Gradle 을 우선으로 사용하지만, 경우에 따라서는 Maven 을 사용하는 것도 나쁘지 않은 것 같고 굳이 하나로 통일할 필요는 없어 보인다. 아무튼, 이번 글은 너무 기초적인 내용을 간단하게만 작성하였다. 시간이 된다면, 다음 글에서는 Gradle 에 대해서 좀 더 상세한 내용을 작성해보겠다. (시간이 될지 모르겠지만...)
https://docs.spring.io/spring-boot/docs/2.0.8.RELEASE/gradle-plugin/reference/html/