[Kotlin] 18. 빌드와 배포 - Gradle, APK, JAR
Kotlin 프로젝트를 빌드하고 배포하는 방법을 배웁니다.
Gradle 기본
build.gradle.kts 구조
plugins {
kotlin("jvm") version "1.9.0"
application
}
group = "com.example"
version = "1.0.0"
repositories {
mavenCentral()
}
dependencies {
implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3")
testImplementation(kotlin("test"))
}
application {
mainClass.set("com.example.MainKt")
}
tasks.test {
useJUnitPlatform()
}
// Fat JAR (의존성 포함)
tasks.jar {
manifest {
attributes["Main-Class"] = "com.example.MainKt"
}
from(configurations.runtimeClasspath.get().map { if (it.isDirectory) it else zipTree(it) })
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
}
주요 Gradle 명령어
| 명령어 | 설명 |
|---|---|
./gradlew build |
빌드 (컴파일 + 테스트) |
./gradlew run |
실행 |
./gradlew test |
테스트만 실행 |
./gradlew jar |
JAR 파일 생성 |
./gradlew clean |
빌드 캐시 삭제 |
./gradlew dependencies |
의존성 트리 확인 |
JVM 애플리케이션 배포
JAR 파일 생성
# 빌드
./gradlew build
# JAR 생성
./gradlew jar
# 실행
java -jar build/libs/my-app-1.0.0.jar
Shadow JAR (Fat JAR)
모든 의존성을 하나의 JAR에 포함:
// build.gradle.kts
plugins {
id("com.github.johnrengelman.shadow") version "8.1.1"
}
tasks.shadowJar {
archiveBaseName.set("my-app")
archiveVersion.set("1.0.0")
archiveClassifier.set("")
manifest {
attributes["Main-Class"] = "com.example.MainKt"
}
}
./gradlew shadowJar
java -jar build/libs/my-app-1.0.0.jar
Spring Boot 배포
# 실행 가능한 JAR 생성
./gradlew bootJar
# 실행
java -jar build/libs/my-app-0.0.1-SNAPSHOT.jar
# 프로파일 지정
java -jar my-app.jar --spring.profiles.active=prod
Docker 배포
# Dockerfile
FROM eclipse-temurin:17-jre-alpine
WORKDIR /app
COPY build/libs/my-app-*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
# 빌드 & 실행
docker build -t my-kotlin-app .
docker run -p 8080:8080 my-kotlin-app
Android 빌드
서명 키 생성
keytool -genkey -v -keystore my-release-key.jks \
-keyalg RSA -keysize 2048 -validity 10000 \
-alias my-key-alias
서명 설정
// app/build.gradle.kts
android {
signingConfigs {
create("release") {
storeFile = file("my-release-key.jks")
storePassword = "비밀번호"
keyAlias = "my-key-alias"
keyPassword = "비밀번호"
}
}
buildTypes {
release {
isMinifyEnabled = true // 코드 축소
isShrinkResources = true // 리소스 축소
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
signingConfig = signingConfigs.getByName("release")
}
}
}
APK / AAB 빌드
# Debug APK
./gradlew assembleDebug
# Release APK
./gradlew assembleRelease
# AAB (Google Play 업로드용)
./gradlew bundleRelease
빌드 결과:
app/build/outputs/apk/release/app-release.apk
app/build/outputs/bundle/release/app-release.aab
Google Play 배포 절차
- Google Play Console 접속
- 앱 만들기
- 스토어 등록 정보 작성 (스크린샷, 설명)
- AAB 파일 업로드
- 심사 제출
CI/CD (GitHub Actions)
Kotlin JVM 프로젝트
# .github/workflows/build.yml
name: Build
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
- name: Build
run: ./gradlew build
- name: Test
run: ./gradlew test
Android 프로젝트
# .github/workflows/android.yml
name: Android Build
on:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-java@v4
with:
java-version: '17'
distribution: 'temurin'
- name: Build Debug APK
run: ./gradlew assembleDebug
- name: Run Tests
run: ./gradlew test
- name: Upload APK
uses: actions/upload-artifact@v4
with:
name: debug-apk
path: app/build/outputs/apk/debug/app-debug.apk
버전 관리
// build.gradle.kts
android {
defaultConfig {
versionCode = 4 // 매 업로드마다 증가 (정수)
versionName = "1.2.3" // 사용자에게 보이는 버전
}
}
| 버전 | 의미 |
|---|---|
| 1.0.0 | 최초 릴리즈 |
| 1.0.1 | 버그 수정 |
| 1.1.0 | 기능 추가 |
| 2.0.0 | 대규모 변경 |
- [Kotlin] 18. 빌드와 배포 - Gradle, APK, JAR
- [Kotlin] 17. 실전 팁 - 자주 쓰는 패턴과 관용구
- [Kotlin] 16. 테스트 - JUnit, 단위 테스트
- [Kotlin] 15. 서버 개발 - Spring Boot with Kotlin
- [Kotlin] 14. 로컬 저장소 - Room, DataStore
- [Kotlin] 13. 네트워크 통신 - Retrofit
- [Kotlin] 12. 상태관리 - ViewModel, State
- [Kotlin] 11. 화면 이동 - Navigation
- [Kotlin] 10. Compose 레이아웃과 리스트
- [Kotlin] 09. Android 개발 기초 - 프로젝트 생성
- [Kotlin] 08. 코루틴 - 비동기 프로그래밍
- [Kotlin] 07. Null 안전성과 예외 처리
- [Kotlin] 06. 컬렉션 - List, Map, Set
- [Kotlin] 05. 클래스와 객체지향 프로그래밍
- [Kotlin] 04. 함수 - 선언, 매개변수, 람다
- [Kotlin] 03. 제어문 - 조건문, 반복문
- [Kotlin] 02. 변수와 데이터 타입
- [Kotlin] 01. Kotlin 소개 및 개발환경 설치