[퍼비톡] Gradle

Song Chae Won·2023년 9월 19일

퍼비톡

목록 보기
7/10
post-thumbnail

Gradle

2012년에 출시된 Grovvy를 기반으로 한 오픈소스 빌드 도구로,
거의 모든 타입의 스프트웨어를 빌드할 수 있는 빌드 자동화 시스템

잠깐! Groovy란?

  • JVM 상에서 실행되는 스크립트 언어
  • JAVA와 유사한 문법 구조를 가지며, 호환성이 아주 좋다.

장점

  • 프로젝트를 설정 주입 (configuration injection) 방식으로 정의
  • 멀티 프로젝트 빌드
  • 빌드 속도가 빠름

프로젝트를 설정 주입(configuration injection) 방식으로 정의

  • maven의 상속 구조보다 재사용에 용이
  • 프로젝트의 조건을 체크할 수 있어서 프로젝트별로 주입되는 설정을 다르게 할 수 있다.

멀티 프로젝트 빌드

  • 하나의 레포지토리 내에 여러 하위 프로젝트 구성이 가능
  • ex) 관리자 서버와 사용자 서버를 분리해서 진행해야될 경우
    하나의 모듈 : 많은 코드를 복붙해야 한다.
    gradle : 중복을 피할 수 있다.

빌드 속도가 빠름
점진적 빌드(Incremental Builds)

  • Gradle은 빌드 실행 중 마지막 빌드 호출 이후에 task의 입력, 출력 혹은 구현이 변경됐는지 확인한다.
  • 최신 상태로 간주하지 않는다면 빌드는 실행되지 않는다.
  • 빌드 캐시(Build Cache)
    - 두 개 이상의 빌드가 돌아가고, 하나의 빌드에서 사용되는 파일들이 다른 빌드에 사용된다면 Gradle은 빌드 캐시를 이용해 이전의 빌드 결과물을 다른 빌드에서 사용할 수 있다.
    - 다시 빌드하지 않아도 되므로 빌드 시간이 줄어들게 된다.
  • 데몬 프로세스
    - 정의 : 서비스의 요청에 응답하기 위해 오랫동안 살아있는 프로세스
    - Gradle의 데몬 프로세스는 메모리 상의 빌드 결과물을 보관
    - 이로 인해 한 번 빌드된 프로젝트는 다음 빌드에서 매우 적은 시간만 소요된다.

Gradle의 기본구조

모든 Gradle script는 하나 이상의 project로 구성되며, 모든 프로젝트는 하나 이상의 task로 구성된다.
Project : 소스를 jar로 모으거나, 자바 프로젝트를 컴파일하거나, 테스트를 실행하고, 어플리케이션을 배포하는 등의 업무로 구성된다.
Task : 작업의 최소단위이다. Task 간 의존관계 설정과 함께 흐름에 따른 구성이 가능하며, 동적인 테스크의 생성도 가능하다.

Build 3단계

1) 초기화 initialization : 빌드 대상 프로젝트를 결정하고 각각에 대한 project 객체를 생성
settings.gradle 파일에서 프로젝트 구성 (멀티 프로젝트, 싱글 프로젝트 구분)

2) 구성 configuration : 빌드 대상이 되는 모든 프로젝트의 빌드 스크립트 실행 (프로젝트 객체 구성) – configured Task 실행

3) 실행 execution : 구성 단계에서 생성하고 설정된 프로젝트의 테스크 중에 실행 대상 결정. Gradle 명령행에서 지정한 테스크 이름 인지와 현재 디렉토리를 기반으로 테스크를 결정하여 선택된 task들을 실행

Plugin 설정

Plugin은 미리 구성해놓은 task들의 그룹이며, 특정 빌드 과정에 필요한 기본정보를 포함하고, 필요에 따라 정보를 수정하여 목적에 맞게 사용할 수 있다.

저장소 설정

Gradle은 Maven repository, Jcenter repository, Ivy directory 등 다양한 저장소를 지원한다.
Repositories로 다운받은 jar는 $USER_HOME/.gradle/caches/modules-2/files-2.1/ 경로에 캐시된다.

의존관계

  • Spring 관련 의존성은 컴파일과 런타임 모두에 사용된다.
  • Lombok은 컴파일 시에만 사용된다.
  • h2 database는 런타임시에만
  • Spring-boot-starter-test는 테스트에서만 사용한다.

의존관계 설정

api
- 내부 의존성을 컴파일과 런타임 모두에 보이게 함.
implementation
- 내부의존성을 런타임에서만 보이게 함.
compileOnly
- 컴파일에만 사용되는 의존성 정의
RuntimeOnly
- 런타임에만 사용되는 의존성 정의
Test + implementation, compileOnly, RuntimeOnly
- 해당 의존성을 테스트 시에만 사용하도록 정의!

테스팅

  • Gradle을 통해서 테스트 또한 간편하게 할 수 있다.
  • Gradle은 Test 시에 특정 테스트만 진행할 수 있다.
  • 테스트의 결과를 따로 받아볼 수도 있다.
  • 테스트를 detection하고 그룹화하여 테스트 진행할 수 있도록 도움을 주고 있다.

아래 코드를 사용하여 jUnit5를 사용할 수 있다. 위에 springboot stater test를 통해서 dependency 주입되어 테스트가 가능하다.

profile
@chhaewxn

0개의 댓글