wintertreey 님의 블로그
[kotlin] 스톱워치 구현하기 본문
안드로이드 스튜디오 IDE에 공기계에 연결하여 개발자모드로 세팅 완료.
하단의 실습 및 코드는 교재 "Do it! 깡샘의 안드로이드 앱 프로그래밍 with 코틀린 개정2판"을 기반으로 하였으며, 현 실습환경과 교재의 버젼이 일치하지는 않아 현 개발환경에서 작동이 되는 방향으로 코드를 개선하였다.
스톱워치를 구현하는 세부적인 내용에 앞서 프로젝트의 구조에 대해 생각해보고 넘어가자.
# 프로젝트 구조
보통 프로젝트 내부 구조는 다음과 같이 만들어진다.
Project/
├── app/ ← 최종 실행 가능한 모듈 (application)
├── ch8_event/ ← 공통 버튼 등 재사용 가능한 UI 모듈 (library). 이게 내가 스톱워치를 구현한 모듈.
├── feature_login/ ← 로그인 기능 모듈 (library)
├── feature_chat/ ← 채팅 기능 모듈 (library)
└── core_utils/ ← 유틸 함수, 공통 코드 (library)
즉, app만 application 모듈이고, 나머지는 전부 library 모듈로 나누는 게 일반적.
앱은 하나, 기능은 라이브러리로 분리!
작업하면서 애플리케이션과 라이브러리가 궁금해서 리서치 하였다.
항목 | 애플리케이션 모듈 (com.android.application) | 라이브러리 모듈 (com.android.library) |
목적 | 최종 실행 가능한 앱을 만드는 목적 | 앱에서 사용할 재사용 가능한 기능/리소스 제공 |
applicationId | ✅ 필요 (패키지 ID, Play Store에 등록 시 사용) | ❌ 사용 금지 (앱이 아니기 때문) |
실행 (Run) 버튼 | ✅ 가능 (MainActivity 필요) | ❌ 불가능 (실행 대상 아님) |
리소스 접근 (@drawable, @string) | 본인/의존한 모듈 리소스 모두 가능 | 자기 리소스만 포함, 앱에 의해 사용됨 |
Kotlin 코드 | 앱 로직 구현 | UI 컴포넌트, 유틸성 코드, 뷰 바인딩 등 |
예시 | :app 모듈 | :core, :feature_login, :designsystem 등 |
그럼 언제 application 모듈을 하나 더 만들까?
사용자용 앱과 관리자용 앱 처럼 멀티 앱구조가 필요할 때.
# 스톱워치 기능구현
추가하는 모듈이 라이브러리이면 해당 모듈의 gradle 설정에서 라이브러로 만들어주고,
해당 라이브러리의 데이터나 리소스를 받아서 처리할 일이 있다면 app의 gradle 설정에서 의존성을 추가해줘야한다.
-> 작업 후 Sync 잊지말자!
//ch8_event\build.gradle.kts
plugins {
//alias(libs.plugins.android.application)
id("com.android.library")
alias(libs.plugins.kotlin.android)
alias(libs.plugins.kotlin.compose)
}
android {
namespace = "com.example.ch8_event"
compileSdk = 35
defaultConfig {
//applicationId = "com.example.ch8_event"
minSdk = 21
targetSdk = 35
//versionCode = 1
//versionName = "1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
...
}
// app\build.gradle.kts
dependencies {
...
implementation(project(":ch8_event"))
}
ch8_event\src\main\res\drawable\round_button.xml
app\src\main\res\layout\activity_main.xml
app\src\main\java\com\example\androidlab2\MainActivity.kt
안드로이드 스튜디오에서 제공하는 가상의 기계로 앱 실행해서 작동하는 걸 영상캡쳐해봤다.