2026/03/31

오늘의 이야기

Jetpack Compose에서 Jetpack Media3를 사용하여 미디어 플레이어 앱 구축

미디어 플레이어



• Jetpack Media3는 Android에서 미디어 플레이어 앱을 구축하기 위한 강력한 프레임워크를 제공하며, ExoPlayer는 플레이어 인터페이스의 기본 구현으로 사용됩니다.

• ExoPlayer는 플레이리스트 지원, 다양한 스트리밍 포맷, DRM 보호, 광고 삽입 등 비디오 및 오디오 재생을 위한 포괄적인 기능을 제공하여 개발 프로세스를 단순화합니다.

• 이 글은 Media3 ExoPlayer와 Jetpack Compose를 활용하여 알림 지원이 되는 기본 미디어 플레이어 앱을 만드는 과정을 안내해 드립니다.

• Media3는 다른 미디어나 미디어2 라이브러리와 어떻게 다른가요?

• Media3는 구성 요소 간의 커넥터가 필요하지 않기 때문에 다른 재생 라이브러리에서 눈에 띈다.

• Media3를 사용하면 미디어 세션 클래스는 ExoPlayer 및 MediaController와 같은 UI 구성 요소를 포함하여 플레이어 인터페이스를 구현하는 모든 클래스를 수락할 수 있다.

• 이 간소화된 접근 방식은 앱의 다른 부분 간의 상호 작용을 단순화하여 개발 프로세스를 훨씬 쉽게 만든다.

https://medium.com/@myofficework000/building-a-media-player-app-with-jetpack-media3-in-jetpack-compose-16ae8c35f955

Building a Media Player App with Jetpack Media3 in Jetpack compose

Jetpack Media3 offers a robust framework for building media player apps on Android, with ExoPlayer as the default implementation of the…

medium.com





오늘의 이야기

안드로이드: Hilt에서 Koin으로 마이그레이션

안드로이드



• 이 글에서는 의존성 주입(DI) 프레임워크를 훨씬 더 간단한 접근법으로 업그레이드하여 PokeAPI 프로젝트를 계속할 것입니다. 우리는 Hilt DI를 Koin으로 대체할 것입니다.

• Hilt는 코드 생성 및 주석을 통해 각 구성 요소에 종속성을 주입하여 큰 역할을 하지만, 개발자가 너무 많은 상용판과 코드 생성으로 인해 제어의 일부를 잃음에 따라 종속성을 해결하는 것은 매우 혼란스러운 프로세스가 됩니다.

• Koin은 코틀린 DSL(Domain-Specific-Language) 위에 구축되어 있으며 처리하기에 훨씬 간단한 프레임워크로 나타납니다.

• 또한 Dagger/Hilt와 달리 Koin은 빌드 타임 대신 실행 타임에서 종속성을 해결합니다.

• 이제 프레임워크를 변경하여 프로젝트를 변경하기 시작하겠습니다.

• 그래들 파일을 구성하는 것부터 시작하겠습니다.

• 먼저 모든 Hilt 종속성을 제거하고 이 종속성으로 대체하고 동기화합니다.

https://blog.stackademic.com/android-migrating-hilt-to-koin-0c1012104780

Android: Migrating Hilt to Koin

In this article we will continue our PokeAPI project by upgrading our Dependency Injection(DI) framework into a much simpler approach. We…

blog.stackademic.com





오늘의 이야기



#스치니1000프로젝트 #재미 #행운기원 #Compose #Firebase

🎯 야 너 토요일마다 로또 확인하냐?
나도 맨날 "혹시나~" 하면서 봤거든 ㅋㅋ

근데 이제는 그냥 안 해
AI한테 맡겼어 🤖✨

그것도 구글 Gemini로다가!

그래서 앱 하나 만들었지
👉 "로또 예상번호 by Gemini" 🎱

AI가 분석해서 번호 딱! 뽑아줌
그냥 보고 참고만 하면 됨

재미로 해도 좋고…
혹시 모르는 거잖아? 😏


https://play.google.com/store/apps/details?id=com.billcorea.gptlotto1127




오늘의 이야기

제트팩 구성의 상태 관리: ViewModel vs Remember function

안즈로이드



• 상태 관리는 동적이고 반응성이 좋은 사용자 인터페이스를 만들기 위해 제트팩 컴포즈에서 중요합니다. 뷰모델에 상태를 저장하는 것과 뷰 내에서 기억 함수를 사용하는 것 사이의 선택은 딜레마를 제시한다.

• 전통적으로 MVVM과 MVI 패턴은 뷰모델이 로직과 상태를 처리하는 반면 뷰 계층은 프레젠테이션과 사용자 상호 작용에 중점을 두는 별도의 문제를 처리한다.

• 제트팩 컴포즈의 반응형 UI 패러다임과 기억 기능은 스크롤 위치와 같은 일시적인 UI 상태를 관리하기 위한 대안을 제공하면서 이러한 분리에 도전한다.

• 스크롤 상태에 대한 기억을 사용하면 코드가 단순화되지만 뷰모델과 뷰 사이의 분리가 흐려져 MVI 아키텍처가 잠재적으로 복잡해질 수 있습니다.

• MVI 원칙을 엄격하게 준수하면 스크롤 위치를 포함한 모든 상태가 뷰모델에 의해 관리되어야 한다고 지시한다.

• 그러나 특정 UI 상태 유형에 대한 기억의 실용성과 효율성을 무시할 수 없다.

• 이 기사는 UI 상호 작용이 MVI 아키텍처 내에서 이 상태를 효과적으로 수정할 수 있는 방법을 설명하는 뷰모델이 하단 시트 상태를 유지하는 접근법을 탐구한다.

https://blog.stackademic.com/state-management-in-jetpack-compose-viewmodel-vs-remember-function-5fc78cdec92f

State Management in Jetpack Compose: ViewModel vs. Remember Function

Have you ever found yourself pondering the best practices for managing state in your applications? With the advent of Jetpack Compose, how…

blog.stackademic.com





오늘의 이야기


#스하리1000명프로젝트

스치니들!
내가 만든 이 앱은, 내 폰에 오는 알림 중에서 중요한 키워드가 있는 경우
등록해둔 친구에게 자동으로 전달해주는 앱이야 📲

예를 들어, 카드 결제 알림을 와이프나 자녀에게 보내주거나
이번 달 지출을 달력처럼 확인할 수도 있어!

앱을 함께 쓰려면 친구도 설치 & 로그인해줘야 해.
그래야 친구 목록에서 서로 선택할 수 있으니까~
서로 써보고 불편한 점 있으면 알려줘 🙏

👉 https://play.google.com/store/apps/details?id=com.nari.notify2kakao





오늘의 이야기

제트팩 컴포즈와 AES 암호화를 사용한 생체 인증 구현

생체인증



• 안드로이드용 최신 UI 툴킷인 제트팩 컴포즈와 AES 암호화를 사용하여 생체 인증을 구현하는 방법을 설명합니다.

• 생체 인증은 지문, 얼굴 특징 또는 홍채 패턴과 같은 고유한 생물학적 특성을 활용하여 신원을 검증하는 방법입니다.

• AES 암호화는 민감한 데이터를 보호하는 데 사용되는 강력한 암호화 알고리즘입니다.

• 생체 인증을 사용할 때 암호 솔루션이 필수적인 이유는 데이터 보호, 키 관리, 규정 준수 요건, 공격에 대한 방어 때문입니다.

• 본 블로그 게시물에서는 지문 인증을 구현하는 데 초점을 맞춥니다.

https://blog.canopas.com/how-to-implement-biometric-authentication-with-jetpack-compose-and-aes-encryption-1b72cfccf4d4

How to Implement Biometric Authentication with Jetpack Compose and AES Encryption

Exciting News! Our blog has a new Home! 🚀

blog.canopas.com





오늘의 이야기

@InstallIn(SingletonComponent::class)은 Dagger Hilt에서 사용되는 어노테이션입니다. 이 어노테이션은 의존성 주입(Dependency Injection) 모듈이 어떤 DI 컨테이너에 포함되어야 하는지를 지정합니다. 이는 의존성의 수명주기와 관련이 있습니다.


예를 들어, 다음과 같은 모듈이 있습니다:


Kotlin
 



@InstallIn(SingletonComponent::class)
object ApiModule {
@Provides
fun provideRetrofit(): Retrofit {
// ...
}
}


 

위 예시에서 ApiModule은 애플리케이션 클래스에 바인딩되어 있으므로 애플리케이션이 존재하는 동안 계속 존재합니다. 그러나 Hilt가 Retrofit 인스턴스를 제공할 때마다 새로운 객체를 생성합니다. 그러나 @Singleton을 추가하면 매번 동일한 Retrofit 인스턴스를 반환합니다:


Kotlin
 



@InstallIn(SingletonComponent::class)
object ApiModule {
@Provides
@Singleton
fun provideRetrofit(): Retrofit {
// ...
}
}


 


따라서 @InstallIn(SingletonComponent::class)은 모듈이 애플리케이션 수명주기 동안 존재하도록 하며, @Singleton은 동일한 인스턴스를 유지하도록 합니다123.


이 두 어노테이션은 서로 다른 목적을 가지고 있으며, 애플리케이션의 의존성 주입 구성에 중요한 역할을 합니다.


 


 


이상은 copilot을 통해 배워보는 자료입니다. 


 


이전 posting에서 사용했던 Dagger Hilt을 적용해 의존성 연결을 쉽게 해 보는 코드를 구혀해 보고 있는 중입니다.  아직 앱 project 을 체계적으로 만들어 보지 못하는 중이라... 조금은 더 정리된 모습의 코드을 구현해 보고자 하고 있습니다. 


 



Dagger Hilt가 무엇인지 설명해 주세요.

 


Dagger Hilt 안드로이드 애플리케이션에서 **의존성 주입(Dependency Injection)**을 간편하게 구현할 수 있도록 도와주는 라이브러리입니다. Hilt는 다음과 같은 목표를 가지고 있습니다:



  1. Dagger와 관련된 인프라를 단순화합니다.

  2. 표준적인 컴포넌트와 스코프를 제공하여 설정, 가독성, 앱 간 코드 공유를 용이하게 합니다 1.


Dagger Hilt는 Dagger2를 기반으로 하며, Android 프레임워크에서 자주 사용되는 DI 컴포넌트와 스코프를 기본적으로 제공하여 초기 DI 환경 구축 비용을 크게 줄입니다. 또한 Jetpack의 ViewModel에 대한 의존성 주입도 간단하게 구현할 수 있습니다. 아직은 알파 버전이지만, 앞으로 더 발전할 것으로 기대됩니다 23.


Hilt를 사용하면 Dagger 설정 코드를 생성하여 Android 클래스(예: 액티비티 및 프래그먼트)에 자동으로 삽입합니다. 이를 통해 보일러 플레이트를 줄이고 프로젝트의 가독성을 향상할 수 있습니다. Hilt를 프로젝트에 적용하려면 Gradle 설정을 추가하고 @HiltAndroidApp 어노테이션을 사용하여 Application 클래스를 초기화해야 합니다 4.


Dagger Hilt는 Android 애플리케이션 개발에서 DI를 간편하게 사용할 수 있도록 도와주는 강력한 도구입니다. 🚀


 


앱 기준의 gradle 파일에 추가해 보겠습니다.


    //Dagger - Hilt
implementation "com.google.dagger:hilt-android:2.51"
ksp "com.google.dagger:hilt-android-compiler:2.51"
ksp "androidx.hilt:hilt-compiler:1.2.0"
implementation "androidx.hilt:hilt-navigation-compose:1.2.0"

// Paper
implementation "io.github.pilgr:paperdb:2.7.2"

 


위 설명과 같이 먼저 Manifest에 Application class을 추가해 봅니다. 


    <application
android:name=".core.GlobalApplication"
android:allowBackup="true"

...

 


 


다음은 Application class에 의존성을 주입해 봅니다. 


 


@HiltAndroidApp
class GlobalApplication : Application() {
override fun onCreate() {
super.onCreate()
globalApplicationContext = this
init(this, getString(R.string.kakao_app_key))
val keyHash = getKeyHash(applicationContext)
Log.e("", "keyHash=$keyHash")

MobileAds.initialize(this) { }
Paper.init(this)
}

...

 


다음번에는  Paging을 구성하기 위한 준비를 해 보겠습니다. 


 


android hilt






오늘의 이야기


#스하리1000명프로젝트,
Иногда сложно разговаривать с иностранными работниками, правда?
Я сделал простое приложение, которое помогает! Вы пишете на своем языке, а другие видят это на своем.
Он автоматически переводит в зависимости от настроек.
Очень удобно для легкого общения. Посмотрите, когда будет возможность!
https://play.google.com/store/apps/details?id=com.billcoreatech.multichat416




오늘의 이야기

https://billcorea.tistory.com/418



 


안드로이드 앱 만들기 : Paging 처리의 오해(?)


https://billcorea.tistory.com/381 안드로이드 앱 만들기 : Sqlite 로 구현해 보는 Paging (feat Jetpack compose, 대량 데이터 조회) 오늘 적어 두고자 하는 주제는 Paging입니다. 웹 개발을 하는 경우에는 각종 framewor


billcorea.tistory.com




샘플 이미지



 


이전 포스팅에서는 Paging 이 될 거라는 야심 찬(?)  의욕으로 만들었던 페이징 처리가 ㅋ~ 1페이지만 로딩되고 그 뒤 페이지는 절대로 loading 되지 않는다는 것을 알아내는 데 시간이 오래 걸리기는 했습니다.   어느 날 발견한 예제 코드 덕분에 말입니다. 


 


https://github.com/nari4169/paging_movie_app_jetpack_compose



 


GitHub - nari4169/paging_movie_app_jetpack_compose


Contribute to nari4169/paging_movie_app_jetpack_compose development by creating an account on GitHub.


github.com




이 예제는 paging 을 배우는 데, 도움이 되는 코드입니다. 물론 jetpack compose을 이해한다는 조건이 선행되기는 합니다. 예제 코드가 jetpack compose로 되어 있는 거라서, 그 구조는 아직도 이해가 잘 안 되기는 하지만... 따라 하기를 해 볼 수 있어서 도움이 되었습니다. 


 


 



스크롤 샘플


이 샘플을 보시면 이해가 되실 겁니다.  이 코드의 구조에 대한 이야기는 다음에 해 보겠습니다.  실제 적용된 앱은 다음 링크에서 받아 보세요.


 


https://play.google.com/store/apps/details?id=com.nari.notify2kakao&pli=1



 


알림수신기 (알림전달, 카톡메시지, 월간 지출 관리) - Google Play 앱


알림이 오면 글자를 확인해서 미리 등록한 카톡친구에서 전달해 드립니다. 매월 반복적인 지출관리 기능도 추가 됩니다.


play.google.com




이 앱은 내 폰에서 발생 되는 모든 알림에서 지정된 문자를 골라서 카톡 친구에게 알림을 전달해 줄 수 있는 앱입니다. 





오늘의 이야기

2024년 웹 개발을 위한 최고의 프론트 엔드 프레임워크


UI Design



• 프론트 엔드 프레임워크는 재사용 가능한 구조, 설계 패턴 및 코드 블록을 제공하여 웹 개발을 단순화합니다.

• 프론트 엔드 프레임워크를 선택할 때 고려해야 할 핵심 요소에는 프로젝트 요구 사항, 확장성, 성과, 커뮤니티 지원, 예산 및 유연성이 포함된다.

• 자바스크립트는 프론트 엔드 프레임워크에서 가장 널리 사용되는 언어 도구로 리액트, Vue.js 및 Svelte와 같은 인기 있는 프레임워크가 자바스크립트에 작성되었다.

• 프론트 엔드 프레임워크는 모듈성, 구조화된 웹 아키텍처, 응답성 및 커뮤니티 지원을 제공합니다.

• 확장성, 성능 최적화, 적극적인 커뮤니티 지원, 예산 및 자원 활용, 유연성은 프론트 엔드 프레임워크를 선택할 때 중요한 고려 사항이다.

https://javascript.plainenglish.io/best-frontend-frameworks-for-web-development-in-2024-bcec59055c00

Best Frontend Frameworks for Web Development in 2024

Quick Summary: Selecting the right front-end framework is, in fact, a significantly important part of web development. In the year 2024…

javascript.plainenglish.io





오늘의 이야기


#billcorea #운동동아리관리앱
🏸 Schneedle — незаменимое приложение для бадминтонных клубов!
👉 Матчевая игра: записывайте результаты и находите противников 🎉
Идеально подходит для любого места: в одиночку, с друзьями или в клубе! 🤝
Если вам нравится бадминтон, обязательно попробуйте

Зайди в приложение 👉 https://play.google.com/store/apps/details?id=com.billcorea.matchplay




오늘의 이야기

Jetpack Compose에서 Jetpack Media3를 사용하여 미디어 플레이어 앱 구축 미디어 플레이어 • Jetpack Media3는 Android에서 미디어 플레이어 앱을 구축하기 위한 강력한 프레임워크를 제공하며, ExoPlayer는 플레...