Maven 과 Gradle
manen
- xml 기반 프로젝트
- 의존성 관리 도구
- 해당 라이브러리를 사용하기 위한 다른라이브러리까지 저장소에서 다운받아 준다.
- 전체적인 라이프사이클 관리 도구
Maven Lifecycle
- Clean : 이전 빌드에서 생성된 파일들을 삭제하는 단계
- Validate : 프로젝트가 올바른지 확인학고 필요한 모든 정보를 사용할 수 있는 지 확인하는 단계
- Compile : 프로젝트의 소스코드를 컴파일하는 단계
- Test : 유닛(단위) 테스트를 수행하는 단계(테스트 실패시 빌드 실패로 처리, 스킵 가능)
- Package : 실제 컴파일된 소스 코드와 리소스들을 jar등의 배포를 위한 패키지로 만드는 단계
- Verify : 통합테스트 결과에 대한 검사를 실행하여 품질 기준을 충족하는지 확인하는 단계
- Install : 패키지를 로컬 저장소에 설치하는 단계
- Site : 프로젝트 문서를 생성하는 단계
- Deploy : 만들어진 Package를 원격 저장소에 release하는 단계
pom.xml -> Project Object model
pom은 이름그대로 Project 객체의 모델정보를 담고있는 파일입니다.
- 프로젝트 정보 : 프로젝트의 이름, 개발자 목록, 라이센스 등
- 빌드 설정 : 소스, 리소스, 라이프 사이클별 실행한 플러그인(goal)등 빌드와 관련된 설정
- 빌드 환경 : 사용자 환경 별로 달라질 수 있는 프로파일 정보
- POM연관 정보 : 의존 프로젝트(모듈), 상위 프로젝트, 포함하고 있는 하위 모듈 등
Gradle
- 빌드 배포 도구 구글에서 2013년에 안드로이드 공식 빌드시스템으로 지정, java, c/c++, python 등 지원
- Groovy 기반의 DSL(Domain Specific Language)을 통해서 사용할 어플리케이션 버전, 라이브러리등의 항목을 설정할 수 있다.
- xml 과 달리 간단하게 구현가능한 장점이 있다.
장점
- 라이브러리 관리 : 메이븐 레파지토리를 동일하게 사용할 수 있어서 설정된 서버를 통하여 라이브러리를 다운로드 받아 모두 동일한 의존성을 가진 환경을 수정할 수 있다. 자신이 추가한 라이브러리도 레파지토리 서버에 올릴 수 있다.
- 프로젝트 관리 : 모든 프로젝트가 일관된 디렉토리 구조를 가지고 빌드 프로세스를 유지하도록 도와준다.
- 단위 테스트 시 의존성 관리 : junit 등을 사용하기 위해서 명시한다.
그리고 그래들이 메이븐보다 비교적 최신에 나왔기때문에 더 빠른 빌드와 성능을 보여준다고 합니다.
1) 모든 Gradle Script는 하나 이상의 project로 구성되며, 모든 프로젝트는 하나 이상의 task로 구성된다.
- Project : 소스를 jar로 모으거나, 자바 프로젝트를 컴파일 하거나, 테스트를 실행하고, 어플리케이션을 배포하는 등의 업무로 구성된다.
- Task : 작업의 최소 단계이다
2) Gradle은 자바 6 버전 이상의 VM 환경에서 사용이 가능하며, 설치를 하거나 gradle wrapper를 이용하여 실행환경을 구성할 수 있다.
build.gradle
build.gradle이란 파일 자체가 Project 오브젝트 입니다. 이 Project오브젝트는 Project 인터페이스를 구현하는 구현체가 되고 Project 오브젝트는 Project 단위에서 필요한 작업을 수행하기 위해 모든 메서드와 프로퍼티를 모아놓은 슈퍼 객체이다.
Project 오브젝트는 내부에 수많은 메서드, 속성을 갖고 있다.
대표적인 것이 java application용 plugins, repositories, dependencies, application 메서드 이다.
Gradle Task를 이용해 java application을 빌드하면 build task는 이 메서드 들을 수행한다.
위그림에서 {} 로 감싸진 부분이 메서드의 인자로 받아들여지는 Grovy의 클로저Closure 다.
- 프로퍼티 정의
project.[프로퍼티명] = [값]
or
[프로퍼티명] = [값]
2. 프로퍼티 재정의
group = 'com.example'
project.group = "com.kotlinworld"
repositories {
println group
mavenCentral()
}
3. 커스텀 프로퍼티 만들기
커스텀 프로퍼티를 만들기 위해 project 객체의 extension에 넣는 방식을 사용한다.
project.ext를 통해 extension에 접근한다.
project.ext.[커스텀 프로퍼티명] = [값]
project.ext에 넣어진 변수는 Groovy의 특수한 문법을 사용해 project 객체에서 직접 접근이 가능하다.
project.[커스텀 변수명]
ex )
project.ext.blogName = 'kotlin world'
repositories {
println project.blogName
mavenCentral()
}
4. build.gradle의 메서드
대표적 메서드가 repositories, dependencies 이다.
## Gradle 사용
#### Build Lifecycle
1. 초기화 (Initializatio) - 빌드 대상 프로젝트를 결정하고, 각각에 대한 Project 객체를 생성
- settings.gradle 파일에서 프로젝트 구성(멀티프로젝트, 싱글프로젝트 구분)
2. 구성 (Configuration) - 빌드 대상이 되는 모든 프로젝트의 빌드 스크립트를 실행 (프로젝트 객체 구성)
- configured Task 실행
3. 실행 (Execution)
- 구성 단계에서 생성하고 설정된 프로젝트의 태스크 중에 실행 대상 결정
- gradle 명령행에서 지정한 태스크 이름 인지와 현재 디렉토리를 기반으로 태스크를 결정하여 선택된 Task들을 실행
#### Build 설정파일
1. settings.gradle
2. 프로젝트 구성설정.(싱글프로젝트의 경우 생략 가능)
3. Gradle은 멀티 프로젝트를 구성하여 프로젝트 간의 의존성 및 서브프로젝트, 교차 프로젝트를 구성할 수 있다.
4. build.gradle : 빌드에 대한 모든 기능 정의
#### plugin 설정
plugin은 미리 구성해 놓은 task들의 그룹이며, 특정 빌드 과정에 필요한 기본 정보를 포함하고, 필요에 따라 정보를 수정하여 목적에 맞게 사용할 수 있다.
spring initializer를 사용한 springboot 기본 프로젝트 생성에 따른 gradle 설정
plugins {
id 'org.springframework.boot' version '2.3.0.RELEASE'
id 'io.spring.dependency-management' version '1.0.9.RELEASE'
id 'java'
}
// project info
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'
#### 저장소 설정
다양한 저장소 지원
repositories {
mavenLocal() // maven 로컬캐시 저장소
mavenCentral() // maven 중앙저장소
maven { url "http://repo.company.com/maven" } // maven 원격저장소
}
#### 의존관계 설정
Gradle은 java의 의존성 관리를 위해 다양한 '구성'을 제공하고 있다.
1. implementation : 프로젝트 컴파일 과정에서 필요한 라이브러리.
2. providedCompile : compile 시에는 필요하지만, 배포시에 제외될 dependency를 설정한다.
(war plugin이 설정된 경우에만 사용 가능 하다)
3. providedRuntime : runtime 시에만 필요하고, 실행환경에서 제공되는 dependency를 설정한다.
(war plugin이 설정된 경우에만 사용 가능 하다)
4. testImplementation : test 시에 필요한 dependency 관리.
**
의존관계는 group, name, version 순으로 의존성을 기술한다.**
#### 테스팅
1) Gradle은 Test 시에 특정 테스트만 진행할 수도 있음.
2) 테스트의 결과를 따로 받아볼 수도 있음.
3) 테스트를 detection 하고 그룹화 하여 테스트 진행할 수 있도록 도움을 주고 있음.
아래 코드를 사용해서 jUnit5를 사용할 수 있다. 위 springboot starter test를 통해 dependency가 주입되어 테스트가 가능하다.
test {
useJUnitPlatform()
}
## 빌드 구성파일
#### 프로젝트 범위의 속성 구성
여러 모듈이 포함된 Android 프로젝트의 경우, 프로젝트 수준에서 특정 속성을 정의하고 이러한 속성을 모든 모듈에서 공유하는 것이 유용할 수도 있습니다.
이를 위해 최상위 build.gradle 파일의 ext 블록에 추가 속성을 추가하면 됩니다.
buildscript {
ext {
queryDslVersion = "5.0.0"
}
}
```
'Springboot' 카테고리의 다른 글
spring data JPA에서 Pk를 UUID로 관리해 보자 (0) | 2023.08.17 |
---|---|
Spring boot AOP 사용시 request, response 객체 사용하기 (0) | 2023.08.17 |
CSRF 보호가 작동하는 방식 (0) | 2023.08.17 |
Bucket4j 기본 개념 (Spring boot Rate Limiter (0) | 2023.08.17 |
Spring boot 백엔드 아키텍쳐 Infra Layer (0) | 2023.08.17 |