Gradle이란?
- Groovy를 이용한 빌드 자동화 시스템입니다.
(Spring에서 패키지 관련 내용 보완 필요)
빌드 자동화란?
- 소프트웨어 개발자가 반복해서 하는 코딩을 잘 짜여진 프로세스를 통해 자동으로 실행하여, 믿을 수 있는 결과물도 생산해낼 수 있는 일련의 작업 방식 및 방법을 말합니다.
Gradle을 사용한 프로젝트의 구조 이해하기
$ gradle init # gradle로 프로젝트 생성. 몇가지 설정들을 선택해주면 된다
$ tree # 기본 gradle 생성 자바 프로젝트는 다음과 같은 구조를 가진다
├── app # 기본 프로젝트 명
│ ├── build.gradle # 빌드 스크립트를 작성하는 곳
│ └── src # 소스 코드
│ ├── main # 프로그램 코드
│ │ ├── java
│ │ │ └── com
│ │ │ └── programmers
│ │ │ └── java
│ │ │ └── App.java
│ │ └── resources
│ └── test # 테스트 코드
│ ├── java
│ │ └── com
│ │ └── programmers
│ │ └── java
│ │ └── AppTest.java
│ └── resources
├── gradle # gradle 실행을 위한 런타임
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
└── settings.gradle # gradle 설정 파일
기본적으로 build.gradle 파일, src 디렉토리, gradle 디렉토리 등으로 구성됩니다.
prj/build.gradle 파일?
- 프로젝트의 빌드 설정을 정의합니다. 이 파일에서 의존성, 플러그인, 태스크 등을 설정할 수 있습니다.
prj/src 디렉토리?
- 소스코드를 저장합니다.
- 내부는 main, test 디렉토리로 구성되어 있는데, 각각 프로그램 코드와 테스트 코드로 구성됩니다.
prj/gradle 디렉토리?
- gradle을 실행하는데 필요한 Wrapper 파일, 그리고 Wrapper 설정 파일(properties)들로 구성되어 있습니다.
- 모든 개발자가 동일한 버전의 Gradle을 사용함으로써, 충돌 문제를 해결할 수 있습니다.
Gradle 의존성 관리
Gradle의 의존성 관리 시스템은 강력합니다. 프로젝트 라이브러리 의존성을 선언적으로 관리하고, 필요한 라이브러리를 자동으로 다운로드 받아줍니다.
의존성이란?
의존성은 프로젝트가 필요로 하는 외부 라이브러리를 의미합니다. 예를 들어, 웹 프로젝트에서는 Spring, Hibernate 등의 라이브러리가 필요합니다.
Gradle에서 어떻게 의존성을 관리하나요?
build.gradle 파일의 dependencies 블록 내에 선언합니다. Gradle은 선언된 의존성(외부 라이브러리)를 자동으로 다운로드 받고, 빌드와 테스트에 사용합니다.
파이썬에서 pip로 외부 라이브러리르 설치하는 것 처럼, Gradle에서는 build.gradle의 repositories와 dependencies 설정을 통해 설치할 수 있습니다.
repository 메서드
- 저장소 설정을 담당합니다.
- 클로저 내용은 RepositoryHandler를 통해 실행됩니다.
repositories {
mavenCentral()
maven { url "https://plugins.gradle.org/m2/" } /* QueryDSL 주석 프로세서 사용 */
maven { url "https://maven.icm.edu.pl/artifactory/repo/" }
}
ext 메서드
- ext 메서드는 그 인자를 buildScript에서 전역변수로 사용하기 위해 사용됩니다.
ext {
springBootVersion = '2.7.2'
lombokVersion = '1.18.4'
}
dependencies 메서드
- 사실 가장 익숙한 부분입니다.
- implementation: 의존 라이브러리(외부 라이브러리)수정 시 본 모듈까지만 재빌드 합니다.
- api: 의존 라이브러리 수정 시 본 모듈에 의존하는 모듈들을 전부 재빌드합니다.
- compileOnly: compile 시에만 빌드하고 빌드 결과물에는 포함하지 않습니다.
- testImplementation: 테스트 코드를 수행할 때만 적용합니다.
- annotationProcessor: annotationProcessor를 명시합니다.
- developmentOnly: Gradle의 developmentOnly는 개발환경에만 적용되는 설정입니다. 즉, 운영환경에 배포되는 jar, war 파일에는 developmentOnly로 설치된 라이브러리는 제외됩니다. 다만, Gradle 전체에 사용되는 부분은 아니고, SpringBoot 특유의 종속성 구성이라고 합니다.
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
classpath "io.spring.gradle:dependency-management-plugin:1.0.11.RELEASE"
classpath('net.ltgt.gradle:gradle-apt-plugin:0.18') /* QueryDSL 주석 프로세서 사용 */
}
dependencies {
// implementation: 의존 라이브러리 수정 시 본 모듈까지만 재빌드한다.
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation "org.springframework.boot:spring-boot-maven-plugin:${springBootVersion}"
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'org.springframework.boot:spring-boot-starter-actuator'
implementation 'org.springframework.boot:spring-boot-starter-security'
implementation 'org.springframework.security:spring-security-jwt:1.0.11.RELEASE'
implementation 'org.springframework.security.oauth.boot:spring-security-oauth2-autoconfigure:2.2.0.RELEASE'
implementation 'org.springframework.boot:spring-boot-starter-validation'
//mail send
implementation 'org.springframework.boot:spring-boot-starter-freemarker'
implementation 'org.springframework.boot:spring-boot-starter-mail'
implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:2.1.4'
// OAuth
implementation 'com.google.api-client:google-api-client:1.32.1'
// jwt
implementation 'io.jsonwebtoken:jjwt-api:0.11.5'
implementation 'io.jsonwebtoken:jjwt-impl:0.11.5'
implementation 'io.jsonwebtoken:jjwt-jackson:0.11.5'
implementation 'com.squareup.okhttp3:okhttp:4.10.0'
// Lombok
// compileOnly: 컴파일 시에만 빌드하고, 빌드 결과물에는 포함하지 않는다.
compileOnly 'org.projectlombok:lombok'
// developmentOnly: Gradle의 developmentOnly는 개발환경에만 적용되는 설정이다. 즉, 운영환경에 배포되는 jar, war 파일에는 developmentOnly로 설치된 라이브러리는 제외된다.
developmentOnly 'org.springframework.boot:spring-boot-devtools'
annotationProcessor 'org.springframework.boot:spring-boot-configuration-processor'
annotationProcessor 'org.projectlombok:lombok'
// testImplementation: 테스트 코드를 수행할때만 적용한다.
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
// QueryDSL
implementation "com.querydsl:querydsl-core:${queryDslVersion}"
implementation "com.querydsl:querydsl-jpa:${queryDslVersion}"
annotationProcessor (
"com.querydsl:querydsl-apt:${queryDslVersion}:jpa",
"javax.persistence:javax.persistence-api:2.2",
"javax.annotation:javax.annotation-api:1.3.2",
)
// Java Utils
implementation 'org.apache.commons:commons-text:1.8'
implementation 'org.apache.commons:commons-collections4:4.1'
implementation 'org.apache.tika:tika-core:1.13' // content type 으로 file extension 가져오기
implementation group: 'org.apache.httpcomponents', name: 'fluent-hc', version: '4.2.1'
implementation 'com.google.code.gson:gson:2.8.5'
// Swagger
implementation 'org.springdoc:springdoc-openapi-ui:1.6.9'
// AWS
implementation 'com.amazonaws:aws-java-sdk-s3:1.11.238'
implementation 'com.amazonaws:aws-java-sdk-sns:1.12.580'
}
}
Gradle 태스크 이해하기
태스크란?
우선 저희 프로젝트에서 사용하진 않아서 추후 학습할 예정입니다.
간략하게는, 빌드, 테스트, 배포 등의 단계를 수행하는 작업 단위입니다.
Gradle 태스크는 build.gradle 파일의 task 블록에서 정의됩니다. 각 태스크는 이름, 설명, 그리고 실행할 동작을 포함합니다.
'Software Development > Spring' 카테고리의 다른 글
HTTP, REST API 이해하기 (1) | 2024.01.05 |
---|---|
[Spring] Controller, Service, Repository 구조 (0) | 2024.01.05 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!