Gradle
- 2012년에 출시된 Groovy를 기반으로 한 오픈소스 빌드 도구
- 거의 모든 타입의 소프트웨어를 빌드할 수 있는 빌드 자동화 시스템
Groovy
- JVM 상에서 실행되는 스크립트 언어
- Java와 유사한 문법 구조를 가지며, 호환성이 좋은 것이 특징
빌드

- 소스 코드를 컴파일, 테스트, 정적분석 등을 실행하여 실행 가능한 애플리케이션으로 만들어주는 과정
- 다양한 라이브러리의 등장으로 여러가지 문제점이 생김
- 라이브러리를 다운로드 및 추가하는 번거로움
- 개발자들 간의 버전관리 어려움
- 다운받은 Jar파일의 보안 위험
빌드 도구
- 위의 문제를 한번에 해결할 수 있는 도구, Gradle은 빌드 도구의 하나.
- 계속해서 늘어나는 라이브러리를 자동 추가 및 관리
- 프로젝트를 진행하며 라이브러리의 버전을 쉽게 동기화
Gradle의 장점
- 프로젝트를 설정 주입(Configuration Injection) 방식으로 정의
- Maven의 상속 구조보다 재사용에 용이
- 프로젝트의 조건을 체크할 수 있어서 프로젝트별로 주입되는 설정을 다르게 할 수 있음. (동적 빌드)
- 멀티 프로젝트 빌드

Gradle이 빌드 속도가 빠른 이유

-
점진적 빌드 (Increamental Builds)
- Gradle은 빌드 실행 중 마지막 빌드 호출 이후에 task의 입력, 출력 혹은 구현이 변경됐는지 확인한다.
- 변경되지 않은 부분에 있어 불필요한 중복 빌드가 일어나지 않는다

-
빌드 캐시 (Build Cache)
- 빌드 결과물을 캐싱해두었다가, 하나의 빌드에서 사용되는 파일들이 다른 빌드들에 사용된다면 Gradle은 빌드 캐시를 이용해 재사용함.

- 데몬 프로세스: 서비스의 요청에 응답하기 위해 오래동안 살아있는 프로세스
- Gradle의 데몬 프로세스는 메모리 상에 빌드 결과물에 보관
- 이로 인해 한 번 빌드된 프로젝트는 다음 빌드에서 매우 적은 시간만 소요된다.
- 점진적 빌드와 차이점은 빌드 사이에 다음 빌드를 유지하고 있음. -> Gradle을 빌드할 때 마다 빌드 캐싱을 보다 효과적으로 허용할 수 있음.
- 이러한 이유 때문에 Maven보다 두 배 이상, 최대 100배 빠르다.
Gradle 사용 방법 (dependency)
- api: 내부 의존성을 컴파일과 런타임 모두에 보이는 API 의존성
- implementation: 내부 의존성을 런타임에서만 보이는 구현 의존성
- compileOnly: 컴파일에만 사용되는 의존성 정의
- runtimeOnly: 런타임에만 사용되는 의존성 정의
- test + implementation, compileOnly, runtimeOnly: 해당 의존성을 테스트 시에만 사용하도록 정의
Runtime, CompileTime
- 런타임(Runtime)과 컴파일타임(Compiletime)은 소프트웨어 프로그램개발의 서로 다른 두 계층의 차이를 설명하기 위한 용어이다.
- 프로그램을 생성하기 위해 개발자는 첫째로 소스코드를 작성하고 컴파일이라는 과정을 통해 기계어코드로 변환 되어 실행 가능한 프로그램이 되며, 이러한 편집 과정을 컴파일타임(Compiletime) 이라고 부른다.
- 컴파일 과정을 마친 프로그램은 사용자에 의해 실행되어지며, 이러한 응용프로그램이 동작되어지는 때를 런타임(Runtime)이라고 부른다.
Error 유형
- 컴파일 타임 오류
- 런타임 에러
- Null 참조 에러
- 메모리 부족 에러
- 0나누기 에러
내부 의존성

- 일반적인 의존성(dependency)에서 B가 A를 의존한다는 말은, B 객체가 A 객체를 사용한다는 의미한다.
- 내부 의존성은 B가 A를 라이브러리로 사용한다고 했을 때 이것을 C가 볼 수 있는지의 여부
- api는 컴파일과 런타임 둘다 보임. 그래서 A가 수정되었을 시 B와 C가 모두 재빌드 되어야한다.
- implemantation는 컴파일 시 보이지 않게 하여 A가 수정되었을 시 B만 재빌드된다.
정리하자면
dependencies {
implementation("org.springframework.boot:spring-boot-starter")
implementation("org.springframework.boot:spring-boot-starter-actuator")
implementation("org.springframework.boot:spring-boot-starter-data-jpa")
implementation("org.springframework.boot:spring-boot-starter-security")
implementation("org.springframework.boot:spring-boot-starter-web")
compileOnly("org.springframework.boot:spring-boot-configuration-processor")
runtimeOnly("mysql:mysql-connector-java")
testImplementation("org.springframework.boot:spring-boot-starter-test")
}
- Spring 관련 의존성을 컴파일과 런타임 모두에 사용된다.
- implementation
- Spring Boot Configuration Processor 컴파일시에만 사용된다. (즉 빌드 결과물에는 포함하지 않는다)
- compileOnly
- mysql 커넥터는 런타임시에만 사용된다.
- runtimeOnly
- spring-boot-starter-test는 테스트에서만 사용한다
- testImplementation