본문 바로가기

Programming/Java & JSP & Spring

Gradle & Build 그리고 IntelliJ의 Build

gradle을 알아보기 전에 컴파일, 빌드의 개념을 알아보자

컴파일과 빌드

요즘엔 IDE가 워낙 좋아져서 컴파일과 빌드의 차이를 모르는 경우가 많다. 왜냐하면 대부분 툴에서 그 둘을 동시에 Run하나로 퉁치기 때문이다.

  • 컴파일 : 소스의 문법을 분석해 기계어로 번역, 자바의 경우 JVM에서 실행 가능한 바이트코드 형태의 클래스 파일이 생성된다.
  • 링크 : 소스 파일이 여러 개가 생성이 되고, 소스 파일에서 각각의 함수를 호출하는 경우가 있으므로, 연결작업을 해주는데 이작업을 링크라고 한다.
  • 빌드 : 실행 가능한 파일을 만드는 것을 의미한다. 하나의 실행 파일로 생성되기 위해서는 컴파일 과정과 링크 과정을 거쳐야 하므로, 컴파일과 링크가 빌드 안에 포함되는 개념이라고 볼 수 있다.

컴파일은 번역 하나만을 담당하지만, 빌드는 소스와 그림, 아이콘 같은 것도 연결해줘야하고, 라이브러리도 가져와서 관리하는 등 훨씬 복잡하므로 따로 Gradle같은 빌드 자동화 툴이 나왔다.

Spring에서 빌드와 Run

IntelliJ를 보면 Build Project와 Run을 볼 수 있다.

Build Project는 말그대로 Build해주는 것을 말한다. (실행파일까지 로컬에 생성함)

Run은 실행파일을 실제로 실행시켜주는 것을 말하는데, Spring은 Runtime때 빈을 주입하고 여러가지 일을 하므로 Build시간보다 상당히 오래걸린다.

Build Project를 누르면 금방 끝나는 것을 볼 수 있는데, 이는 변경된 사항만 컴파일하고 빌드를 하기 때문이다.

Clean을 하고 Build를 하면 꽤 오래 걸린다.

빌드 자동화란?

코드를 작성하고 컴파일을 하면 오브젝트 파일, 혹은 실행 파일 또는 라이브러리 파일을 생성한다. 이런 작업들을 자동화하는 것이 빌드 자동화이다.

빌드 자동화를 위한 툴은 언어마다 매우 다양한데, 여러가지 언어의 빌드 환경을 구성할 수 있는 오픈 소스 Gradle이 등장한다.

과거 안드로이드 스튜디오가 이클립스로 되어 있을 때는 프로젝트 빌드를 이클립스가 담당했지만, 인텔리제이 기반으로 바뀌면서 빌드 시스템이 IDE와 독립적으로 분리되었다.

Gradle

gradle은 빌드 자동화 툴이다. 엄밀히 말하면, gradle은 빌드 툴이 아니라 확장 가능한 자동화 툴이라 부르는 것이 적절하다.

그 예로 Java플러그인을 사용하는 것이다.

Java 프로젝트에 Gradle을 붙일 때, apply plugin: 'java' 를 명시하는데, 이는 자바 프로젝트를 빌드하기 위해 플러그인을 명시해줘야한다는 뜻이 된다.

Java 플러그인

Gradle에 Java 플러그인을 사용한다고 명시하면 다음과 같은 컴포넌트가 주어진다.

  • 소스세트
  • 속성
  • 태스크
  • 규칙

소스 세트는 동시에 컴파일해야 할 자바코드와 리소스를 논리적으로 그룹화한 개념이다.

태스크는 일반적으로 자바를 빌드할 때 필요한 작업을 태스크로 정의한 것이다.

  • 코드 파일 컴파일
  • 테스트
  • Javadoc 생성
  • JAR 파일로 압축

규칙은 해당 자바 프로젝트의 규약사항을 정의한다.

속성은 각종 값을 설정해줄 수 있는 것을 말한다. 예를 들어, 소스 컴파일을 Java의 어떤 버전으로 컴파일할 것인지 등등

Gradle Wrapper를 사용하는 목적

이미 존재하는 프로젝트를 새로운 환경에 설치할 때, 별도의 설치나 설정 과정 없이 곧 바로 빌드할 수 있게 하기 위함이다.

(Java나 Gradle도 설치할 필요가 없고, 기존 로컬에 설치된 Gradle 또는 Java의 버전도 신경 쓸 필요가 없음.)

gradlew

유닉스용 실행 스크립트이다.

> gradle build

위와 같이 하면 로컬에 설치된 gradle을 사용.

이 경우에 Java나 Gradle이 설치되어 있어야하고, 새로받은 프로젝트의 Gradle 버전과 로컬에 설치된 Gradle 버전이 호환되지 않으면 문제가 발생할 수 있다.

> ./gradlew build

위와 같이 하면 Gradle Wrapper를 사용해서 위에서 언급한 문제가 발생하지 않는다.

gradle/wrapper/gradle-wrapper.jar

Wrapper 파일

gradlew이 이 파일을 이용해서 gradle task를 실행하기 때문에 로컬 환경의 영향을 받지 않는다.

gradle/wrapper/gradle-wrapper.properties

Wrapper 설정 파일

build.gradle

의존성이나 플로그인 설정 등을 위한 스크립트 파일

 

gradle build와 Intellij build project의 차이

intelliJ의 build project가 gradle의 build를 사용하는줄 알았는데 아니였다.

빌드 프로젝트를 누르면 intellij는 자기 자신만의 빌드시스템으로 빌드를 한다. (JPS라고도 불린다.)

이는 incremental 빌드를 지원한다. (수정된 것만 빌드)

 

하지만 IDE의 빌드시스템은 단순한 빌드만을 한다.

예를 들어, gradle로 라이브러리를 추가했다면 gradle build는 실제로 이 라이브러리를 다운받고 build를 실행하지만,

IDE는 이미 있는 라이브러리만을 assemble정도 하는 정도이므로 따로 다운을 받고 build를 하지 않기 때문에 에러가 발생한다.

 

gradle의 build는 더 복잡하고 많은 것을 지원하고 빌드한다.

자바 플러그인 태스크에 등록된 것을 모두 수행한다.

 

참고링크

https://medium.com/@goinhacker/운영-자동화-1-빌드-자동화-by-gradle-7630c0993d09