2026/04/08

오늘의 이야기

PokeAPI와 Paging 3을 사용한 안드로이드 파지네이션

기차여행



• 이 기사는 PokeAPI 및 Paging 3 라이브러리를 사용하여 안드로이드 애플리케이션에서 페이지화를 구현하는 방법을 보여준다.

• 파지네이션은 대규모 데이터셋을 더 작고 관리하기 쉬운 페이지로 나누어 최적화하는 기술입니다.

• PokeAPI는 모든 포켓몬 목록을 포함하여 포켓몬에 대한 데이터에 액세스하기 위한 RESTful API를 제공한다.

• Paging 3은 안드로이드 애플리케이션에서 페이징 구현을 단순화한 Jetpack Compose 라이브러리이다.

• 기사는 PokeAPI에서 데이터 페이지를 로드하기 위한 로직을 정의하는 PagingSource 클래스를 만드는 방법을 설명합니다.

• 페이징소스를 듣고 UI에 데이터를 제공하기 위해 페이징 클래스를 사용하는 방법도 보여줍니다.

• 마지막으로, 기사는 컴포즈 UI에서 페이지를 사용하는 방법의 예를 제공한다.

https://blog.stackademic.com/android-implementing-pagination-through-the-pokeapi-923cd0bc1289

Android: Implementing Pagination through the PokeAPI

Continuing from our previous PokeAPI article about Dependency Injection with Hilt, now we are gonna implement pagination for our pokemon…

blog.stackademic.com





오늘의 이야기

안드로이드 스튜디오 활용 팁...개발자 생산성 끌어올리기

풍경



• 안드로이드 스튜디오는 기본 기능을 넘어 다양한 유용한 기능을 제공합니다. 이러한 팁은 생산성을 향상시키고 앱 개발을 단순화할 수 있습니다.

• 로그캣 창에 전용 버튼이 있어 연결된 기기의 스크린샷과 화면녹음을 쉽게 촬영할 수 있다. 키보드 바로가기는 일반적인 동작을 간소화할 수 있으며, 키 프로모터 X 플러그인은 학습 및 바로가기 생성을 돕습니다.

• 로그캣 창과 실행 창 사이의 자동 전환을 비활성화할 수 있으며 로그캣 탭은 앱 배포 시 로그를 자동으로 열고 지우도록 구성할 수 있습니다.

• 안드로이드 스튜디오의 통합 Git GUI 클라이언트는 대화형 병합 갈등 해결 도구와 함께 포스 푸시, 리베이스 및 체리 픽과 같은 고급 기능을 제공합니다.

• ADB Idea와 같은 타사 플러그인은 앱 데이터 삭제 및 권한 취소와 같은 수동 작업에 빠르게 접근할 수 있습니다.

• 안드로이드 스튜디오 디버거에는 조건부 중단점, 키보드 단축키, 런타임 동안 조건과 표현을 평가할 수 있는 기능과 같은 기능이 포함되어 있습니다.

https://medium.com/@domen.lanisnik/android-studio-usage-tips-4c6c47b716e8

7 Android Studio Usage Tips

7 Android Studio usage tips that can help boost productivity and make it easier to develop apps.

medium.com





오늘의 이야기

0. 들어가는 글

 


https://billcorea.tistory.com/384



 


안드로이드 앱 만들기 : 앱에서 챠트 그래프 그리는 도구 (인터넷 펌)


https://github.com/patrykandpatrick/vico GitHub - patrykandpatrick/vico: A light and extensible chart library for Android. A light and extensible chart library for Android. Contribute to patrykandpatrick/vico development by creating an account on GitHub. g


billcorea.tistory.com




 


이전 글에서 vico 라이브러리를 활용한 chart 그리는 정보에 대한 이야기를 적어 보았던 기억이 납니다.   이번에는 관련 정보를 이용해 앱 개발에 적용해 본 이야기를 적어 볼까 합니다. 


 


앱 개발은 크몽에서 앱 개발 의뢰을 받아 도전해 보았습니다.  고객은 앱에 라인 차트가 들어가는 화면을 구현하기를 요청하였습니다.  다른 library 들도 있기는 하겠지만, 이번에 찾아보았던 것을 이용해 보기로 했습니다. 


 


또한, vico chart 에는 line chart 을 지원하기도 해서 도전해 보기로 했습니다. 


 


1. 개발자 페이지...

 


https://patrykandpatrick.com/vico/wiki/getting-started



 


Getting started | Vico


<iframe


patrykandpatrick.com




개발자 페이지에 나와 있는 wiki 정보는 해당 library 을 활용하는 데 도움이 됩니다.  끝까지 다 읽어 보면 좋기는 하겠지만,  긴급(?) 하게 작업을 해야 하는 경우에는 꼭 그럴 필요보다는 요약된 정보(?)를 활용해 보시는 것이 도움이 될 수 있습니다. 


 


 


2. build gradle 설정 

dependencies {
// For Jetpack Compose.
implementation("com.patrykandpatrick.vico:compose:2.0.0-alpha.22")

// For `compose`. Creates a `ChartStyle` based on an M2 Material Theme.
implementation("com.patrykandpatrick.vico:compose-m2:2.0.0-alpha.22")

// For `compose`. Creates a `ChartStyle` based on an M3 Material Theme.
implementation("com.patrykandpatrick.vico:compose-m3:2.0.0-alpha.22")

// Houses the core logic for charts and other elements. Included in all other modules.
implementation("com.patrykandpatrick.vico:core:2.0.0-alpha.22")

// For the view system.
implementation("com.patrykandpatrick.vico:views:2.0.0-alpha.22")
}

앱 수준의 gradle 파일에는 이런 정도의 기술이 필요 합니다. android studio 가 korala 버전으로 넘어가고 gradle 버전 8.5 이상으로 넘어가면서 version 관리를 version catalog을 사용하는 방식으로 변경이 되면서 작성하는 방법이 달라지고 있습니다.  처음 보았을 때는 불편하지 않을까 하는 생각이 들기도 했지만, 익숙해지면 관리가 수월해집니다. 


 


이번에는 version catalog 방식의 gradle 정보을 보겠습니다. 


먼저 grable 폴더에 위치 하는 libs.versions.toml 파일의 작성 예시입니다.  버전은 이 글을 작성하는 시점이기 때문에 달라질 수 있습니다.


[versions]
vico = "2.0.0-alpha.22"

[libraries]
# For Jetpack Compose.
vico-compose = { group = "com.patrykandpatrick.vico", name = "compose", version.ref = "vico" }

# For `compose`. Creates a `ChartStyle` based on an M2 Material Theme.
vico-compose-m2 = { group = "com.patrykandpatrick.vico", name = "compose-m2", version.ref = "vico" }

# For `compose`. Creates a `ChartStyle` based on an M3 Material Theme.
vico-compose-m3 = { group = "com.patrykandpatrick.vico", name = "compose-m3", version.ref = "vico" }

# Houses the core logic for charts and other elements. Included in all other modules.
vico-core = { group = "com.patrykandpatrick.vico", name = "core", version.ref = "vico" }

# For the view system.
vico-views = { group = "com.patrykandpatrick.vico", name = "views", version.ref = "vico" }

 


다음은 gradle 파일의 모습 입니다. 


dependencies {
implementation(libs.vico.compose)
implementation(libs.vico.compose.m2)
implementation(libs.vico.compose.m3)
implementation(libs.vico.core)
implementation(libs.vico.views)
}

 


dependencies 작성이 휠씬 간결해졌음을 알 수 있습니다. 


 


이제 코드 구현을 해 보겠습니다. 


 


// compolse 에서 구현 되는 챠트 입니다.
@Composable
fun LineGraph() {
val modelProducer = remember { CartesianChartModelProducer.build() }
// 이 부분에서는 반복적으로 무의미한 숫자을 생성해 냅니다.
// 아직 데이터가 없는 그래프 이기 때문에 임시 데이터을 생성해 내기 위해서 입니다.
LaunchedEffect(Unit) {
withContext(Dispatchers.Default) {
while (isActive) {
modelProducer.tryRunTransaction {
/* Learn more:
https://patrykandpatrick.com/vico/wiki/cartesian-charts/lay
ers/line-layer#data. */
// 라인 챠트을 그리기 위해서 준비 합니다.
lineSeries {
repeat(Defaults.MULTI_SERIES_COUNT) {
series(
List(Defaults.ENTRY_COUNT) {
Defaults.COLUMN_LAYER_MIN_Y +
Random.nextFloat() * Defaults.COLUMN_LAYER_RELATIVE_MAX_Y
}
)
}
}
}
// 이 부분을 풀면 반복 시간이 되었을 떄 다시 실행 됩니다.
//delay(Defaults.TRANSACTION_INTERVAL_MS)
}
}
}

// 이제 챠트을 그려 보겠습니다.
Column (
modifier = Modifier
.fillMaxWidth(),
horizontalAlignment = CenterHorizontally,
verticalArrangement = Arrangement.Top
) {
Spacer(modifier = Modifier.padding(10.dp))
// 챠트 상단에 제목을 넣었습니다.
Text(text = stringResource(R.string.statusTitle), style = typography.titleSmall.copy(white))
Spacer(modifier = Modifier.padding(5.dp))
// 챠트 그리기을 호출 합니다.
ComposeChart7(modelProducer, Modifier.fillMaxSize())
}

}

@Composable
private fun ComposeChart7(modelProducer: CartesianChartModelProducer, modifier: Modifier) {
CartesianChartHost(
chart =
rememberCartesianChart(
rememberLineCartesianLayer(
// 챠트가 그려질 데이터 정보입니다.
lines =
chartColors.map { color ->
rememberLineSpec(shader = DynamicShader.color(color), backgroundShader = null)
}
),
// 챠트 하단 에 표시 되는 정보 입니다.
startAxis =
rememberStartAxis(
label = rememberStartAxisLabel(),
horizontalLabelPosition = VerticalAxis.HorizontalLabelPosition.Inside,
// 하단 제목의 수직 배열시 참조 VerticalAxis.VerticalLabelPosition.Center
),
// 챠트 왼쪽에 표시 되는 정보 입니다.
bottomAxis = rememberBottomAxis(valueFormatter = { value, _, _ ->
("${value.toInt()}H")
}),
legend = rememberLegend(),
),
modelProducer = modelProducer,
modifier = modifier.background(white),
marker = rememberMarker(),
runInitialAnimation = false,
zoomState = rememberVicoZoomState(zoomEnabled = false),
)
}

// 챠트 왼쪽에 제목 (세로 제목)
@Composable
private fun rememberStartAxisLabel() =
rememberAxisLabelComponent(
color = white,
background = rememberShapeComponent(shape = Shape.rounded(4.dp), color = softBlue),
padding = Dimensions.of(horizontal = 8.dp, vertical = 2.dp),
margins = Dimensions.of(all = 4.dp),
)

// 챠트가 그려지는 부분 입니다.
@Composable
private fun rememberLegend() =
rememberHorizontalLegend<CartesianMeasureContext, CartesianDrawContext>(
items =
chartColors.mapIndexed { index, chartColor ->
rememberLegendItem(
icon = rememberShapeComponent(Shape.Pill, chartColor),
label =
rememberTextComponent(
color = vicoTheme.textColor,
textSize = 12.sp,
typeface = Typeface.MONOSPACE,
),
labelText = stringResource(legendString[index]),
)
},
iconSize = 8.dp,
iconPadding = 8.dp,
spacing = 4.dp,
padding = Dimensions.of(top = 8.dp),
)

// Color(0xffb983ff), Color(0xff91b1fd), Color(0xff8fdaff)
// 챠트는 3개의 데이터을 이용해 그리는 것이라 구분 하기 위해서 color 을 선언 합니다.
private val chartColors = listOf(smallGreen, smallYellow, largeGreen)
// 챠트 하단에 표시될 제목 입니다. 데이터가 3개 이기 때문에 제목도 3개을 넣었습니다.
private val legendString = listOf(R.string.walkStep,R.string.calorieBurn,R.string.exerciseTime)

 


이렇게 간단한 설명을 달아 보았습니다.   개발자 페이지를 잘 보면 상세한 정보를 보실 수 있을 듯합니다만, 속성(?)으로 차트 그리기가 필요하다면, 이 정도의 정보만으로도 멋있는 line chart을 그려 볼 수 있습니다. 


 


4. 실행 예제

 


chart 예제



 


이렇게 그려지는 chart 을 보실 수 있습니다.  실행되는 앱의 전체 화면은 고객 보호를 위해서 이 부분만 참조하도록 하겠습니다.





오늘의 이야기

50 크리에이티브 챗GPT, 소셜 미디어 게임 고도화 프로모션

gpt ???



• 강력한 AI 도구인 ChatGPT는 소셜 미디어 콘텐츠 생성을 혁신할 수 있습니다. 트윗을 위한 재치 있는 농담을 만드는 것부터 매혹적인 인스타그램 캡션을 디자인하고 비디오 광고 스토리보드를 생성하는 것까지 ChatGPT가 여러분을 커버했습니다.

• ChatGPT를 사용하면 새로운 청중을 유치하기 위한 매력적인 소셜 미디어 경연 아이디어를 쉽게 생성하고 효과적인 파트너십을 위해 콜드 이메일 아웃리치 템플릿을 개인화하며 다양한 플랫폼에 대한 이미지 차원을 최적화할 수 있습니다.

• 긴 광고 카피를 압축하고 창의적인 인스타그램 릴 전략을 제안하며 고성능 구글 텍스트 광고 헤드라인과 설명을 제공할 수 있습니다.

• ChatGPT는 매력적인 이메일 뉴스레터 여론 조사를 작성하고 SEO에 대한 메타 제목을 최적화하며 유튜브 튜토리얼에 대한 이상적인 비디오 길이를 결정하는 데 도움이 됩니다.

• 홍보 이메일에 대한 매혹적인 주제 라인을 생성하고 클라이언트 온보드 프로세스를 개선하기 위한 팁을 제공하며 사용자 생성 콘텐츠에 대한 관련 해시태그를 식별한다.

• 이 도구는 게스트 포스팅 기회를 찾고, SEO 최적화를 위한 블로그 게시물을 분석하고, 창의적인 틱톡 마케팅 캠페인을 개발하는 데 도움이 됩니다.

• ChatGPT는 트위터에서 업계 전문가 목록을 작성하고 블로그 기사에서 백링크 기회를 식별하며 복잡한 가격 정보를 단순화하고 유튜브 채널 성공을 위한 분석 메트릭을 제안한다.

https://medium.com/aimonks/50-best-chatgpt-prompts-for-social-media-posts-must-use-5f68784976ec

50 Best ChatGPT Prompts for Social Media Posts (Must Use)

This nifty AI writer is seriously a content creator’s dream. Whether you need a hilarious joke for your next tweet, an eye-catching caption…

medium.com





오늘의 이야기


#스하리1000명프로젝트,
In Korea verloren? Auch wenn Sie kein Koreanisch sprechen, hilft Ihnen diese App dabei, sich problemlos fortzubewegen.
Sprechen Sie einfach Ihre Sprache – es übersetzt, sucht und zeigt Ergebnisse in Ihrer Sprache an.
Ideal für Reisende! Unterstützt mehr als 10 Sprachen, darunter Englisch, Japanisch, Chinesisch, Vietnamesisch und mehr.
Probieren Sie es jetzt aus!
https://play.google.com/store/apps/details?id=com.billcoreatech.opdgang1127




2026/04/07

오늘의 이야기



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

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

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

그것도 구글 Gemini로다가!

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

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

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


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




오늘의 이야기

AI로 Youtube short Factory 만들기 자동화 혁신과 탐구의 여정

아이



• 니킬 나이르는 AI가 생성한 비주얼과 최상위 음성 합성을 결합하여 레딧 게시물을 매혹적인 짧은 비디오로 변화시켜 유튜브 쇼츠를 혁신하는 임무를 시작합니다.

• 레딧의 r/쇼트카리스토리를 콘텐츠 소스로 활용하는 네어는 파이썬의 PRAW API 래퍼를 사용하여 게시물을 검색하고 구조화된 데이터 세트를 큐레이션한다.

• GPT-4는 각 쇼트에 대한 제목과 설명을 미세 조정하여 매력적이고 간결한 시청자 경험을 보장합니다.

• 이미지 프롬프트는 안정 확산 API를 통해 시각적으로 풍부한 요소의 생성을 유도하여 DALL·E 및 Midjourney의 기능을 능가하는 수직 비디오 친화적인 비주얼을 생성합니다.

• 11랩스의 음성 생성 기술은 자연스러운 소리의 내레이션으로 인간의 손길을 더해 전체적인 스토리텔링 경험을 강화한다.

• 무비피는 이미지와 오디오를 매혹적인 비디오에 매끄럽게 통합하는 반면 OpenCV는 동기화 문제가 지속되지만 화면 텍스트를 추가합니다.

• 마지막 단계는 유튜브 API를 사용하여 유튜브 업로드를 자동화하고 채널 소유권 및 OAuth2.0 검증 장애물을 극복하는 것이다.

https://medium.com/@niknair31898/creating-a-youtube-shorts-factory-with-ai-7a7c80f84bfa

Creating a YouTube Shorts Factory with AI

As always, my mind is buzzing with new project ideas. This time, I got hooked to the wave of automated YouTube Shorts — Reddit posts…

medium.com





오늘의 이야기


#스하리1000명프로젝트,
A veces es difícil hablar con trabajadores extranjeros, ¿verdad?
¡Hice una aplicación sencilla que ayuda! Escribes en tu idioma y los demás lo ven en el suyo.
Se traduce automáticamente según la configuración.
Súper útil para chatear fácilmente. ¡Echa un vistazo cuando tengas la oportunidad!
https://play.google.com/store/apps/details?id=com.billcoreatech.multichat416




오늘의 이야기

https://proandroiddev.com/how-to-use-resources-in-compose-multiplatform-77a6552b505d

How to use Resources in Compose Multiplatform

Resources are such a big part of any mobile app, they include drawable, fonts, text files, and many more. With the introduction of Compose…

proandroiddev.com

종합 가이드 멀티플랫폼 리소스 구성

이미지



• 이 기사는 드로잉, 폰트 및 문자열을 포함하여 컴포즈 멀티플랫폼의 리소스 사용에 대한 자세한 지침을 제공한다. 저자는 컴포즈 멀티플랫폼 1.6.0-beta01에서 소개한 변화와 새로운 자원 시스템으로의 마이그레이션 방법에 대해 설명한다.

• 드로잉에 액세스하려면 공통 메인에 구성 리소스 디렉토리를 만들고 드로잉을 그 안의 드로잉 폴더에 가져와야 합니다. 그런 다음 Res 클래스를 사용하여 안드로이드의 R 클래스와 유사하게 추첨 가능한 액세스를 할 수 있습니다.

• 폰트의 경우, 컴포즈 리소스에서 폰트 디렉토리를 만들고 폰트를 복사하십시오. 그런 다음 Res 클래스를 사용하여 글꼴에 액세스할 수도 있습니다.

• 문자열에 대해서는 ComposeResources에 값 디렉토리를 만들고 문자열이 포함된 strings.xml 파일을 추가한다. Res 클래스를 통해 문자열에 액세스할 수 있으며 새로운 리소스 시스템은 값-es 및 값-ar와 같은 폴더를 생성하여 다양한 언어를 지원합니다.

https://proandroiddev.com/how-to-use-resources-in-compose-multiplatform-77a6552b505d

How to use Resources in Compose Multiplatform

Resources are such a big part of any mobile app, they include drawable, fonts, text files, and many more. With the introduction of Compose…

proandroiddev.com





오늘의 이야기

코틀린 멀티플랫폼: 네이티브 앱을 위한 크로스 플랫폼 개발 가이드

열일 중



• KMP(Kotlin Multiplatform)는 기존 네이티브 프로젝트를 대체하는 것이 아니라 기존 네이티브 프로젝트와 원활하게 통합하여 크로스 플랫폼 개발에 독특한 접근 방식을 제공합니다. 이를 통해 개발자들은 안드로이드에서 공유 코틀린 모듈로 코드를 점진적으로 마이그레이션할 수 있으며, 이 모듈은 원래 스위프트 구현을 대체하여 iOS 애플리케이션에 통합될 수 있다.

• 다른 크로스 플랫폼 프레임워크와 달리 KMP는 애플리케이션을 완전히 다시 쓸 필요가 없으며 개발 단계에서도 통합할 수 있어 플랫폼 간 코드 공유에 유연성을 제공한다.

• KMP는 네이티브 API 및 SDK에 대한 완전한 액세스를 유지하여 래퍼 또는 브리지가 필요하지 않으며 네이티브 성능 및 사용자 경험을 보장합니다.

• KMP는 코드베이스의 상당 부분을 공유함으로써 개발 및 유지보수 비용을 절감하여 더 빠른 기능 전달과 단순화된 버그 수정을 가능하게 한다.

• 마이그레이션 프로세스는 멀티플랫폼 모듈을 설정하고, 선택된 코드를 안드로이드에서 공유 모듈로 이동하고, iOS 프로젝트에 통합하는 것을 포함하며, 기능을 병렬로 마이그레이션할 수 있는 옵션이 있다.

• KMP는 새로운 프로그래밍 언어의 도입을 피하고 네이티브 성능을 유지하며 네이티브 API 및 SDK에 대한 액세스를 유지함으로써 기술적 위험을 최소화한다.

• 안드로이드와 iOS 팀 간의 지식 격차와 같은 잠재적 위험을 완화하기 위해 점진적인 지식 교환 및 협력을 촉진하여 KMP의 성공적인 채택을 보장할 수 있다.

https://medium.com/droidsonroids/convert-your-native-project-to-kotlin-multiplatform-why-when-and-how-d1722bcaa027

Convert Your Native Project to Kotlin Multiplatform: Why, When and How

Thinking about moving to Kotlin Multiplatform? This guide will give you all the information you need to make a decision!

medium.com





오늘의 이야기


#billcorea #운동동아리관리앱
🏸 Schneedle, ¡una aplicación imprescindible para los clubes de bádminton!
👉 Match Play: registra puntuaciones y encuentra oponentes 🎉
¡Perfecto para cualquier lugar, solo, con amigos o en un club! 🤝
Si te gusta el bádminton, definitivamente pruébalo.

Ir a la aplicación 👉 https://play.google.com/store/apps/details?id=com.billcorea.matchplay




오늘의 이야기

JavaScript로 페이지 요소 값 가져오기 및 세션을 통한 값 전달 열코 하세요. 페이지 최상단의 특정 항목 값 알아내기 JavaScript를 사용하여 페이지 최상단에 있는 특정 항목의 값을 알아내는 ...