Compose #1 - basic

2026. 9. 27. 13:40ㆍFrontend/Android

    목차
반응형

 

앱 컴포넌트

 

액티비티

앱의 화면을 구성하고 관리하는 기본 단위

ex. 로그인 화면 액티비티, 설정 화면 액티비티...

 

액티비티들은 Intent를 통해 서로 데이터를 주고 받거나 화면 간 전환을 수행

AndroidManifest.xml 파일 내 <activity> tag로 선언되어야 함

 

액티비티의 생명주기

onCreate

onStart:  화면에 보일때 호출됨

onResume: UI 상호작용 준비 될 시 호출됨

onPause: focus를 뺏기는 경우

onStop: 화면에 보이지 않을때

onDestroy: 액티비티 종료

 

class MainActivity : AppCompatActivity {
	override fun onCreate(savedInstanceState: Bundle) {
    	super.onCreate(savedInstanceState)
        
        setContentView(R.layout.activity_main)
        ...
    }
}

 

서비스

화면 없이 BG에서 특정 작업을 수행하는 커포넌트

ex. 음악 재생, 파일 다운로드 등

 

system service들

* AudioFlinger

* SurfaceFlinger

* CameraService

 

 

서비스 작동 방식

* startService: 서비스 시작

* stopService / soptSelf 호출 전까지 실행됨

 

class MyService : Service() {
	override fun onStartCommand(intent: Intent?, flags: I nt, startId: Int): Int {
    	...
        return START_STICKY  // 서비스가 강제로 종료되면 재시작
    }
    
    ...
}

 

AndroidManifest.xml에 <service> tag를 통해 service가 선언되어 있어야 함

 

바인드된 서비스

onBind() 메서드로 Binder 객체를 반환

이 객체를 통해 client 컴포넌트는 서비스의 공개 메서드를 호출하고 데이터를 주고받는 등의 직접적인 상호작용을 할 수 있음

unbindService()가 호출되면 서비스는 종료됨

 

service 생명주기

* onCreate: 서비스 생성 시

* onStartCommand: started service가 시작될 시

* onBind: bound service가 client와 연결될 시

* onUnbind: 바인딩이 해제될 시

* onDestroy: 서비스 종료 시

 

class MyService : Service() {
	private val binder = MyBinder()
    ...
    
    inner class MyBinder : Binder() {
    	val service: MyService
        	get() = this@MyService
    }
    
    ...
    
    override fun onBind(intent: Intent?): IBinder? {
    	return binder
    }
    ...
}

 

MyBinder의 service 속성은 MyService 객체를 반환

이를 통해 client component는 MyService 에 접근하여 기능을 제어할 수 있음

 

 

브로드캐스트 리시버

이벤트를 수신하고 처리하는 컴포넌트

실시간으로 어떤 이벤트에 대응하거나, 다른 앱과 소식을 주고받는데 유용

 

class MyReceiver : BroadcastReceiver() {
	override fun onReceive(context: Context?, intent: Intent?) {
    	if (intent?.action == Intent.ACTION_BATTERY_LOW) {
        	Toast.makeText(context, "out of battery", Toast.LENGTH_SHORT).show()
        }
    }
}

 

이벤트를 전달하는 곳에서는 다음과 같이 sendBroadcast로 intent를 송신

context.sendBroadcast(Intent.ACTION_BATTERY_LOW).apply { putExtra("extra key", "value") })

 

콘텐츠 프로바이더

앱 간 데이터를 안전하고 표준화된 방식으로 공유하기 위한 컴포넌트

DB와 파일 같은 내부의 데이터를 다른 앱에서 접근할 수 있도록 interface를 제공

데이터의 생성, 읽기, 수정, 삭제를 지원하는 CRUD 작업을 수행

 

ContentResolver와 URI로 데이터를 접근할 수 있도록 함

 

ex.

class MyProvider : ContentProvider() {

    override fun onCreate(): Boolean {
        return true
    }

    override fun query(
        uri: Uri,
        projection: Array<String>?,
        selection: String?,
        selectionArgs: Array<String>?,
        sortOrder: String?
    ): Cursor? {
        // 데이터 제공
        return null
    }

    // 나머지 메서드는 생략
}

 

AndroidManifest.xml에 등록:

 

<provider
    android:name=".MyProvider"
    android:authorities="com.example.myprovider"
    android:exported="true" />

 

른 앱에서는 ContentResolver를 통해 접근해.

contentResolver.query(
    Uri.parse("content://com.example.myprovider/data"),
    null,
    null,
    null,
    null
)

 

 

다른 앱
   ↓
ContentResolver
   ↓
ContentProvider
   ↓
데이터

 

 

그래들 프로젝트 관리

그래들은 코드 빌드를 자동화하는 도구

안드로이드 스튜디오에서 빌드 버튼을 누르면 백그라운드에서 그래들 시스템이 작동하여 빌드를 수행

 

그래들 래퍼

시스템에 그래들을 설치하지 않아도 특정 버전의 그래들을 사용하여 프로젝트를 빌드할 수 있게 하는 도구

필요한 그래들 버전은 gradle-wrapper.properties 파일에 정의됨

 

실행 시 이 설정을 기반으로 필요한 그래들을 자동으로 다운하여 사용하기에 일관성있는 개발 환경 구축이 가능함

 

// gradle-wrapper.properties
...
distributionUrl=http\://services.gradle.org/distribution/gradle-8.7-bin.zip
...

 

settings.gradle.kts

프로젝트의 구성 모듈들을 정의

 

pluginManagement {
	repositories {
    	google()
        mavenCentral()
    }
}

dependencyResolutionManagement {
	repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
    repositories {
    	google()
        mavenCentral()
    }
}

rootProject.name = "MyApp"

include(":app")

 

dependencyResolutionManagement 를 통해 프로젝트 전체의 의존성 저장소를 한 고셍서 중앙 제어

 

프로젝트 build.gradle.kts

프로젝트에 대한 빌드를 정의

프로젝트 내 모든 모듈에 적용되는 전역 빌드를 구성

 

보통 mavenCentral(), google()과 같은 플러그인의 저장소를 선언

 

사용할 플러그인의 버전 정보는 libs.version.toml에 정의

build.gradle.kts에서 다음과 같이 적용

plugins {
	alias(libs.plugins.kotlin.jvm)
}

 

alias() 사용 이유는 plugin ID + 버전 정보를 libs.versions.toml에서 통합 관리하기 위함

 

다음과 같이 특정 모듈을 지정할 수 있음

plugins {
	id("org.jetbrains.kotlin.jvm") version "1.8.22"
}

 

모든 프로젝트에 공통 적용할 설정은 allProject 블록에서 선언

모든 하위 프로젝트에 적용할 것은 subprojects 블록에서 선언

 

task.register("allTests") {

    dependsOn(subprojects.map { it.tasks.test })

...

}

 

allTests라는 태스크가 정의되었으며, 이 태스크는 dependsOn 으로 모든 하위 프로젝트의 test 태스크에 의존

루트에서 ./gradle allTests를 실행하면 그래들이 모든 하위 프로젝트의 test 태스크를 수행한 후 allTests 태스크를 실행

 

모듈 수준 build.gradle.kts

각 모듈에 적용되는 특정 빌드 구성

plugins {
	kotlin("jvm") // Kotlin JVM plugin 적용
    java  // Kotlin과 자바 코드를 함께 사용하거나 자바 플러그인의 특정 기능 필요 시 추가
}

java {
	sourceCompatibility = JavaVersion.VERSION_17
    ...
}

 

Kotlin { jvmToolchain(17) } 은 코틀린 플러그인이 제공하는 설정 블록

 

dependencies는 의존성을 설정하며, implementation을 사용

이는 특정 library에 의존한다는 것을 명시

빌드 시 내부적으로만 라이브러리릇 ㅏ용하며 API 등 모듈의 외부에는 영향을 주지 않음

 

의존성 선언 시 implementation 외에 api, compileOnly, runtimeOnly  등이 있음

 

- implementation: 빌드 시에만 사용되고 외부에 노출되지 않음. 컴파일 대상에 포함. 최종 apk에 포함

- api: 외부에도 노출되는 의존성. //

- compileOnly: 컴파일 시에만 필요. 컴파일 대상에 포함. apk에는 미포함

- runtimeOnly: 런타임 시에만 필요. 컴파일 대상에 미포함. apk에는 포함

...

 

gradle.properties

프로젝트 전반에 걸쳐 사용될 그래들 속성을 정의

프로젝트 루트 디렉토리의 gradle.properties는 프로젝트 전체에 적용

이 외에 사용자 수준의 gradle.properties가 있음

 

 

 

반응형

'Frontend > Android' 카테고리의 다른 글

Compose #3 - components  (0) 2026.09.27
Compose #2 - 컴포즈  (0) 2026.09.27
Kotlin #7 - Object Oriented Programming  (0) 2026.09.27
Kotlin #6 - Inheritance  (0) 2026.09.27
Kotlin #5 - class  (0) 2026.09.27