3 minute read

자바 프로젝트 개발을 하다보면, 사실 build 와 프로젝트 관리에서 엄청난 삽질을 많이 하는것 같다,,

지금 사내 프로젝트들을 모듈별로 쪼개고 또 패키징 하는 단계에서 내 짧은 지식으로 뭔가를 해보려 하다보니,,,, 완전 맨붕

그리고,, 난 메이븐을 즐겨 썼는데, 이번 패키징에선 gradle을 써서 관리하게 되었다.

그래서 일할겸 여기다 gradle에 대한 기초 지식을 남겨보자 한다,

코끼리 뿌우!!

0. 목차

  1. Java build
  2. build 자동화
  3. Gradle
  4. Gradle Script
  5. dependency 관리 예제

1. Java build

2. build 자동화?

프로젝트 개발전 우리는 개발 환경 세팅을 하게 된다. 보통 그 설정중 빌드환경이 가장 먼저일텐데, 타이핑 언어 코드를 작성하여 컴파일을 해서 오브젝트 파일을 생성하고, 링킹이라는 작업을 통해 실행파일 또는 jar와 같은 라이브러리 파일을 생성한다. 언어마다 차이가 있지만 이러한 작업을 자동화 하는 작업을 빌드 자동화 라고 한다.

빌드 자동화를 위한 툴은 언어마다 다르지만, Java에서는 보통 Ant, Maven, Scala sbt를 사용하였고, 최근에는 여러 가지 언어의 빌드 환경을 구성할 수 있는 오픈소스인 Gradle을 많이 사용하는 추세이다.

3. Gradle

Gradle 은 프로젝트를 위한 범용 빌드 도구 이다.

Gradle은 구글이 안드로이드의 기본 빌드 시스템으로 체택함으로써 큰 인기를 끌게 되었다. 이러한 Gradle의 특장점에 대해 알아보자

3-1 Gradle 장점

  1. 간결함 Gradle은 기본적으로 Groovy라는 언어를 활용한 dsl을 스크립트로 사용한다. 사실상 플로그인을 직접 작성할 것이 아니라면 Groovy라는 언어를 몰라도 Gradle 스크립트를 사용하는데 문제는 없다. 또한 xml을 사용하지 않아, 장황하지 않다, Groovy언어를 사용하여 변수선언과, if, else, for등의 로직 구현또한 가능하다.

  2. 속도 Gradle은 성능 향상을 위한 다양한 기능을 제공한다. 빌드 시스템에서 빌드 속도는 굉장히 중요하다. 개발을 할때, 우리는 빌드를 굉장히 자주 하고한다. 빌드 속도는 개발 생성성에 지대한 영향을 미친다. Gradle은 성능 향상을 위해 증분 빌드, 작업 결과 캐싱, 증분 하위작업, 데몬 프로세스 재사용, 병렬 실행, 병렬 다운로등의 기능을 지원한다.

  3. 멀티프로젝트 Gradle은 멀티 프로젝트 구성이 가능하다. 하나의 repository 내에 여러개의 하위 프로젝트를 구성할 수 있다. 하나의 jar를 만들기 위해 별도의 프로젝트를 만들어 Repository를 구성할 필요가 없다. 또한 상위 프로젝트의 의존성 및 설정을 하위 프로젝트에서 상속을 받아 사용할 수 있기 때문에 중복 설정이 불필요 하다!

  4. 유연성 + 확장성 Groovy 기반 스크립팅을 통해 다양한 기능을 스크립트안에 직접 구현이 가능하다.

3-2 기본 설정

  • 3-2-1 Gradle wrapper
    1. 이미 존재하는 프로젝트를 새로운 환경에 설치할때 별도의 설치나 설정없이 곧바로 빌드할 수 있게 함 (Java나 Gradle 설치 필요 x, Java version 필요 x)
    2. wrapper는 Gradle이 설치되어 있지 않아도 Gradle task를 실행할 수 있도록 해주는 script, jar 정보 파일이다.
    3. wrapper를 생성하면 사용자가 프로젝트를 만든 사람과 동일한 버전의 Gradle을 사용할 수 있음
  • gradle wrapper 실행 방법
    $ gradle wrapper
    

그러면 아래와 같이 파일들이 만들어 진다.

.
├── build.gradle
├── gradle
│   └── wrapper
│       ├── gradle-wrapper.jar
│       └── gradle-wrapper.properties
├── gradlew
└── gradlew.bat

Wrapper를 사용하면 아래와 같이 사용이 가능하다.

$ ./gradlew build
$ gradle build

위 기본 사용법인 경우 Java나 Gradle이 설치가 되어 있어야 하고, 새로받은 프로젝트의 Gradle버전과 로컬의 Gradle의 버전이 호환되지 않으면 문제가 발생하기도 한다. 또한 Gralde 명령어로 컴파일이나 빌드 등을 할때, 위의 명령어로 실행한다면 로컬 gradle을 사용하게 된다.

  • build 후에는 test, compile 후 jar파일을 생성한다 (이건 설정 가능)
  • gradlew라는 UNIX script와 gradlew.bat이라는 Window 명령어 jar 파일 속성 파이로가 함께 생성된다.

따라서

$ ./gradlew build

방법을 사용하도록 하자.

  • gradlew.bat 파일은 윈도우용 실행 배치 스크립트다. 위도우에서 실행 가능하다는 점만 제외하면 gradlew와 동일.
  • build.gradle 파일은 의존성이나 플로그인 설정들을 위한 스크립트 파일.
  • settings.gradle 파일은 프로젝트의 구성 정보를 기록하는 파일, 어떤 하위 프로젝트들이 어떤 관계로 구성되는지를 기술, Gradle은 이 파일에 기술된대로 프로젝트를 구성

3-3 멀티프로젝트 구성

본격적으로 내가 필요한 멀티프로젝트를 구성해보자. 먼저 setting.gradle 에서 아래와 같이 셋팅한다.

rootProject.name = 'parentProject'

include 'childProject1'
include 'childProject2'

rootProject.name은 최상위 프로젝트의 이름이다. 기본적으로는 프로젝트 폴더명으로 만들어진다. 그리고 parentProject 프로젝트의 하위프로젝트로는 childProject1, childProject2 를 포함 시킨다. 여기서 또 하위프로젝트 childProject의 하위 프로젝트를 만드려면

include 'java::sub'와 같이 한다.

3-4 모든 하위프로젝트에 공통적으로 사용되는 설정 적용

subprojects {
    group = "funfunstudy"    // 생성될 아티팩트의 그룹명

    repositories {
        mavenCentral()
    }
    dependencies {
    }
}

상위 프로젝트를 포함한 모든 하위 프로젝트에 공통으로 사용되는 설정을 적용하려면 allprojects를 사용할 수 있다.

3-5 의존성 관리

Gradle의 의존성 설정 방법에 대해 자세히 알아보자

아래와 같이 repositories를 상요하여 의존성을 가져올 주소를 설정한다. dependencies를 사용하여 설정된 Repository에서 가져올 아티팩트들을 설정한다 .

allprojects {
    repositories {
        mavenCentral()
        jcenter()
        maven {
            url "http://repo.mycompany.com/maven2"
        }
        ivy {
            url "../local-repo"
        }
    }
    dependencies {
        // 로컬 jar 파일의 의존성 설정
        compile fileTree(dir: 'libs', include: '*.jar')
        // 로컬 프로젝트간 의존성 설정
        compile project(':shared')
        // 컴파일 타임에 의존성을 받아옴 
        compile 'com.google.guava', name: 'guava:23.0'
        // 테스트시만 의존성을 받아옴 
        // 마이너 버전을 '+'로 설정해서 항상 4점대 최신 버전을 사용
        testCompile group: 'junit', name: 'junit', version: '4.+'
        // 컴파일할때는 사용하고, 아티팩트를 만들때는 포함하지 않음
        compileOnly 'org.projectlombok:lombok:1.16.18'
        // 실행할때 의존성을 받아옴(기본적으로 컴파일을 모두 포함)
        runtime('org.hibernate:hibernate:3.0.5')
    }
}

4. Gradle Script

5. dependency 관리 간단 예제

Categories:

Updated: