2026/05/21

오늘의 이야기



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

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

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

그것도 구글 Gemini로다가!

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

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

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


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




오늘의 이야기


#스하리1000명프로젝트

오늘 내가 만든앱 하나 알려주고 싶어, 이 앱은 알림수집기 라고 이름을 붙였는 데,
내 폰에 표시 되는 알림을 읽어서 내가 지정한 단어가 들어 있고, 지출기록을 남겨야 하는 알림이
있으면 수집하고, 카카오톡으로 친구에게 전달해 주는 기능을 구현해 줄꺼야. 📲

이번 패치에서는 하루 한번 지정한 시간에 나에게 알림(노티) 하도록 기능을 추가 했어. 🙏
한번 써보고 불편한 거 있으면 말해줘.

앱 바로가기
👉 https://play.google.com/store/apps/details?id=com.nari.notify2kakao





오늘의 이야기


#스하리1000명프로젝트,
Terkadang sulit untuk berbicara dengan pekerja asing, bukan?
Saya membuat aplikasi sederhana yang membantu! Anda menulis dalam bahasa Anda, dan orang lain melihatnya dalam bahasa mereka.
Ini menerjemahkan secara otomatis berdasarkan pengaturan.
Sangat berguna untuk obrolan mudah. Lihatlah ketika Anda mendapat kesempatan!
https://play.google.com/store/apps/details?id=com.billcoreatech.multichat416




오늘의 이야기


#billcorea #운동동아리관리앱
🏸 Schneedle, aplikasi yang wajib dimiliki oleh klub bulu tangkis!
👉 Match Play – Rekam Skor & Temukan Lawan 🎉
Sempurna untuk di mana saja, sendirian, bersama teman, atau di klub! 🤝
Jika Anda suka bulu tangkis, cobalah

Buka aplikasi 👉 https://play.google.com/store/apps/details?id=com.billcorea.matchplay




오늘의 이야기


#스하리1000명프로젝트,
Perdu en Corée ? Même si vous ne parlez pas coréen, cette application vous aide à vous déplacer facilement.
Parlez simplement votre langue : il traduit, recherche et affiche les résultats dans votre langue.
Idéal pour les voyageurs ! Prend en charge plus de 10 langues, dont l'anglais, le japonais, le chinois, le vietnamien et plus encore.
Essayez-le maintenant !
https://play.google.com/store/apps/details?id=com.billcoreatech.opdgang1127




2026/05/20

오늘의 이야기



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

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

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

그것도 구글 Gemini로다가!

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

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

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


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




오늘의 이야기


#스하리1000명프로젝트

오늘 내가 만든앱 하나 알려주고 싶어, 이 앱은 알림수집기 라고 이름을 붙였는 데,
내 폰에 표시 되는 알림을 읽어서 내가 지정한 단어가 들어 있고, 지출기록을 남겨야 하는 알림이
있으면 수집하고, 카카오톡으로 친구에게 전달해 주는 기능을 구현해 줄꺼야. 📲

이번 패치에서는 하루 한번 지정한 시간에 나에게 알림(노티) 하도록 기능을 추가 했어. 🙏
한번 써보고 불편한 거 있으면 말해줘.

앱 바로가기
👉 https://play.google.com/store/apps/details?id=com.nari.notify2kakao





오늘의 이야기


#스하리1000명프로젝트,
Đôi khi thật khó để nói chuyện với người lao động nước ngoài phải không?
Tôi đã tạo một ứng dụng đơn giản có ích! Bạn viết bằng ngôn ngữ của bạn và những người khác nhìn thấy nó bằng ngôn ngữ của họ.
Nó tự động dịch dựa trên cài đặt.
Siêu tiện dụng để trò chuyện dễ dàng. Hãy xem khi bạn có cơ hội!
https://play.google.com/store/apps/details?id=com.billcoreatech.multichat416




오늘의 이야기


#billcorea #운동동아리관리앱
🏸 Schneedle, một ứng dụng cần có cho các câu lạc bộ cầu lông!
👉 Đấu trận – Ghi điểm & Tìm đối thủ 🎉
Hoàn hảo cho mọi nơi, một mình, với bạn bè hoặc trong câu lạc bộ! 🤝
Nếu bạn thích cầu lông, nhất định phải thử nó

Vào ứng dụng 👉 https://play.google.com/store/apps/details?id=com.billcorea.matchplay




오늘의 이야기

 



Python에서 5100개 키워드 포함 여부 빠르게 검사하기


대규모 로그 처리나 텍스트 분석을 하다 보면, 한 문장에 수천 개의 키워드 중 하나라도 포함되어 있는지 빠르게 확인해야 할 때가 있습니다. 단순히 re.search를 5100번 반복하는 방식은 성능이 매우 떨어지므로, 더 효율적인 방법을 소개합니다.


❌ 잘못된 접근: [...] 문자 클래스


정규식에서 [...]문자 클래스로 동작합니다.
예: [abc] → "a" 또는 "b" 또는 "c"라는 단일 문자 매치.
따라서 5100개의 키워드를 [...] 안에 넣는 것은 "5100개의 문자열 중 하나"가 아니라 "5100개의 문자 중 하나"를 찾는 것에 불과합니다.


✅ 올바른 접근 방법


1. Set 기반 검색



# 5100개 키워드 준비
keywords = ["error", "warning", "critical", "timeout", "failed", ...]
keywords_set = {k.lower() for k in keywords} # 모두 소문자로 변환

sentence = "System reported CRITICAL failure at 12:00"

# 방법 1: 단어 단위 검색
words = set(sentence.lower().split())
if words & keywords_set:
print("포함됨 (단어 단위)")

# 방법 2: 문장 전체에서 부분 문자열 검색
if any(k in sentence.lower() for k in keywords_set):
print("포함됨 (부분 문자열)")

- 단어 단위 검색: 로그가 공백으로 구분된 경우 최적
- 부분 문자열 검색: 문장 내 임의 위치 검색 가능


2. Aho-Corasick 알고리즘



import ahocorasick

keywords = ["error", "warning", "critical", "timeout", "failed", ...]
keywords = [k.lower() for k in keywords]

A = ahocorasick.Automaton()
for idx, keyword in enumerate(keywords):
A.add_word(keyword, (idx, keyword))
A.make_automaton()

sentence = "System reported CRITICAL failure"
for end_index, (idx, keyword) in A.iter(sentence.lower()):
print("포함:", keyword)
break # 하나라도 찾으면 종료

- 대규모 키워드 검색에 가장 빠른 방법
- 대소문자 무시: 키워드와 문장을 모두 .lower() 처리


3. OR 정규식



import re

keywords = ["error", "warning", "critical", "timeout", "failed", ...]
pattern = re.compile("|".join(map(re.escape, keywords)), re.IGNORECASE)

sentence = "System reported CRITICAL failure"
if pattern.search(sentence):
print("포함됨")

⚠️ 단점: 5100개 키워드라면 정규식이 너무 커져 성능 저하 가능.


📊 방법 비교





























방법 속도 메모리 적합 상황
Set 검색 빠름 중간 단순 포함 여부
Aho-Corasick 매우 빠름 중간 대규모 키워드 검색
OR 정규식 중간 높음 키워드 수 적을 때

🎯 결론


- 5100개 키워드라면 [] 안에 넣는 건 잘못된 방식입니다.
- 실제로는 Set 검색 또는 Aho-Corasick을 쓰는 것이 최적입니다.
- 로그 분석, 보안 탐지, 대규모 텍스트 필터링에 특히 유용합니다.





오늘의 이야기


#스하리1000명프로젝트,
¿Perdido en Corea? Incluso si no hablas coreano, esta aplicación te ayuda a moverte fácilmente.
Simplemente hable su idioma: traduce, busca y muestra resultados en su idioma.
¡Genial para viajeros! Admite más de 10 idiomas, incluidos inglés, japonés, chino, vietnamita y más.
¡Pruébalo ahora!
https://play.google.com/store/apps/details?id=com.billcoreatech.opdgang1127




2026/05/19

오늘의 이야기



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

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

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

그것도 구글 Gemini로다가!

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

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

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


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




오늘의 이야기


#스하리1000명프로젝트

오늘 내가 만든앱 하나 알려주고 싶어, 이 앱은 알림수집기 라고 이름을 붙였는 데,
내 폰에 표시 되는 알림을 읽어서 내가 지정한 단어가 들어 있고, 지출기록을 남겨야 하는 알림이
있으면 수집하고, 카카오톡으로 친구에게 전달해 주는 기능을 구현해 줄꺼야. 📲

이번 패치에서는 하루 한번 지정한 시간에 나에게 알림(노티) 하도록 기능을 추가 했어. 🙏
한번 써보고 불편한 거 있으면 말해줘.

앱 바로가기
👉 https://play.google.com/store/apps/details?id=com.nari.notify2kakao





오늘의 이야기


#스하리1000명프로젝트,
有时候和外劳说话很难,对吧?
我制作了一个简单的应用程序,可以帮助您!你用你的语言写作,其他人用他们的语言看到它。
它根据设置自动翻译。
超级方便,可以轻松聊天。有机会就来看看吧!
https://play.google.com/store/apps/details?id=com.billcoreatech.multichat416




오늘의 이야기


#billcorea #운동동아리관리앱
🏸 Schneedle,羽毛球俱乐部必备应用!
👉 比洞赛 – 记录分数并寻找对手 🎉
适合任何地方,独自一人、与朋友一起或在俱乐部! 🤝
如果你喜欢羽毛球,一定要尝试一下

前往应用程序👉 https://play.google.com/store/apps/details?id=com.billcorea.matchplay




오늘의 이야기

🧾 바코드/QR 영수증 스캐너 앱 개발기 (BarcodeVoucher0407)


앱 메인 화면



 


일상에서 쉽게 버려지는 영수증들을 스마트하게 관리할 수 있는 바코드/QR 기반 영수증 적립 및 조회 앱을 개발했습니다. 이 앱은 단순히 영수증을 저장하는 것을 넘어, AI 기반 OCR(광학 문자 인식) 로 영수증의 내용을 자동으로 파악하고, 카카오맵과 연동하여 사용처의 위치까지 저장할 수 있는 똑똑한 가계부 역할을 합니다.


🛠 1. 프로젝트 개요 및 기술 스택


🎯 제품 목표



  • 바코드/QR 스캔 및 갤러리/카메라 이미지를 통한 영수증 디지털 보관

  • Groq AI (Llama 비전 모델) 를 활용한 자동 영수증 파싱 (매장명, 금액, 결제일 등)

  • 카카오맵 API를 활용한 매장 위치 시각화 및 저장

  • 기간별(월별/일별) 및 카테고리별 지출 통계 대시보드 제공

  • Play Core를 활용한 매끄러운 앱 내 업데이트(In-app Update) 제공


💻 기술 스택



  • 언어: Kotlin

  • UI: Jetpack Compose (단방향 데이터 흐름 및 상태 관리)

  • 아키텍처: MVVM + Clean Architecture (Repository, UseCase, 점진적 DTO 분리)

  • 데이터베이스: Room (Offline-first 구조)

  • 비동기 처리: Coroutines + Flow

  • 네트워크: Ktor Client (Groq AI API 연동)

  • 의존성 주입: Dagger Hilt

  • 기타: Kakao Map API, DataStore(설정 관리), ZXing(바코드 스캔)




🏗 2. 주요 아키텍처와 리팩토링 전략


✅ Clean Architecture 와 UseCase의 도입


앱의 덩치가 커짐에 따라 비즈니스 로직이 ViewModel에 집중되는 현상을 방지하기 위해 ObserveReceiptsUseCase, AnalyzeReceiptImageUseCase 등의 UseCase 계층을 도입했습니다. 이를 통해 로직의 재사용성을 높이고 테스트 용이성을 개선했습니다.


✅ Entity와 DTO의 분리


UI 계층에 Room의 Entity 모델이 직접 노출되는 것을 막기 위해 단계적인 리팩토링을 진행했습니다. 조회용 데이터를 ReceiptSummary, ReceiptDetail과 같은 DTO (Data Transfer Object) 로 매핑하여 도메인 경계를 확실히 구분하였습니다.




🚀 3. 핵심 구현 내용 (주요 코드)


🤖 3.1. Groq AI를 활용한 영수증 OCR과 JSON 파싱 내성 강화


가장 신경 쓴 부분 중 하나는 AI 모델 응답의 불안정성 해결입니다. LLM이 생성한 JSON이 때로는 형식이 깨져서 오거나 불필요한 마크다운 백틱(```)이 붙어오는 문제가 있었습니다. 이를 해결하기 위해 3단계 Fallback 로직을 적용했습니다.


// ReceiptOcrPayloadParser.kt 발췌
private fun parsePayload(rawContent: String): ReceiptOcrPayload {
// 1단계: 마크다운 찌꺼기(BOM, 백틱 등)를 제거하고 JSON 후보 텍스트만 추출
val jsonCandidate = runCatching { rawContent.extractJsonCandidate() }
.getOrElse { rawContent.trim() }

runCatching {
return json.parseToJsonElement(jsonCandidate).jsonObject.toPayload()
}

// 2단계: JSON 파싱 실패 시, 깨진 따옴표나 쉼표를 교정하여 재시도
val repaired = jsonCandidate.repairJsonCandidate()
runCatching {
return json.parseToJsonElement(repaired).jsonObject.toPayload()
}

// 3단계: 모두 실패할 경우 rawText만이라도 보존하여 반환
return ReceiptOcrPayload(
storeName = null, totalAmount = null, currency = null,
purchasedAtIso = null, memo = null,
rawText = rawContent.take(300).trim().ifBlank { null },
)
}

// 텍스트 기반 휴리스틱 분석 (총 금액 추출)
private fun String.extractLikelyTotalAmount(): Long? {
val totalLabelRegex = Regex(
"(\\uCD1D\\s*\\uD569\\uACC4|\\uD569\\uACC4|\\uCD1D\\uC561|\\uACB0\\uC81C\\s*\\uAE08\\uC561)[^0-9]{0,8}([0-9][0-9,]{2,})",
RegexOption.IGNORE_CASE
)
return totalLabelRegex.find(this)?.groupValues?.getOrNull(2)
?.replace(",", "")?.toLongOrNull()
}

Tip: AI가 JSON 생성을 완벽히 하지 못하는 경우를 대비해, 응답 평문에서 정규식을 이용해 영수증 금액과 상호명을 2차로 추출하는 안전장치(Fallback)를 두었습니다.


📊 3.2. Compose Canvas로 직접 그린 지출 통계 차트




서드파티 라이브러리에 의존하지 않고, Jetpack Compose의 CanvasAnimatable을 활용하여 애니메이션이 포함된 바 차트(Bar Chart) 를 직접 구현했습니다.


// StatsScreen.kt 발췌
@Composable
private fun StatBarChart(
labels: List<String>,
values: List<Long>,
primaryColor: Color,
modifier: Modifier = Modifier,
) {
val maxValue = values.max().toFloat().coerceAtLeast(1f)
// 진입 시 아래에서 위로 올라오는 700ms 애니메이션
val animProgress = remember(values) { Animatable(0f) }
LaunchedEffect(values) {
animProgress.snapTo(0f)
animProgress.animateTo(1f, animationSpec = tween(700))
}

Canvas(modifier = modifier.fillMaxWidth().height(190.dp)) {
val chartW = size.width
val barMaxH = size.height * 0.68f
val slotW = chartW / values.size

values.forEachIndexed { idx, value ->
val ratio = (value.toFloat() / maxValue) * animProgress.value
val barH = barMaxH * ratio

// 막대 그리기
drawRoundRect(
color = primaryColor,
topLeft = Offset(slotW * idx + (slotW / 4f), size.height - barH - 20f),
size = Size(slotW / 2f, barH),
cornerRadius = CornerRadius(5.dp.toPx())
)
}
}
}

💾 3.3. Room DB를 이용한 강력한 SQLite 집계 통계


앱 내에서 보여지는 월별/일별 지출 통계는 앱 단에서 계산하는 대신, Room 데이터베이스의 SQLite 쿼리를 적극 활용하여 성능을 최적화했습니다.


// ReceiptDao.kt 발췌
@Query("""
SELECT
strftime('%Y-%m', datetime(COALESCE(purchasedAt, createdAt) / 1000, 'unixepoch', 'localtime')) AS month,
SUM(COALESCE(totalAmount, 0)) AS totalAmount,
COUNT(*) AS count
FROM receipts
WHERE (:startMillis IS NULL OR COALESCE(purchasedAt, createdAt) >= :startMillis)
AND (:endMillis IS NULL OR COALESCE(purchasedAt, createdAt) <= :endMillis)
GROUP BY month
ORDER BY month DESC
""")
fun observeMonthlyStats(
startMillis: Long?,
endMillis: Long?
): Flow<List<MonthlyStatRow>>

기간 필터까지 DB 단에서 처리하고, 결과를 Flow로 반환받아 UI에 즉시 리액티브하게 반영되도록 구성했습니다.




💡 4. 마무리 및 회고


단일 모듈로 시작하여 MVP를 빠르게 완성한 프로젝트입니다. 개발 과정에서 특히 흥미로웠던 부분은 AI 기반 OCR을 연동하며 발생한 다양한 예외 처리였습니다. AI의 응답은 항상 일관되지 않기 때문에 정규식 Fallback이나 JSON 교정 로직 같은 방어적 프로그래밍이 매우 중요하다는 것을 배웠습니다.


📌 향후 고도화 계획:



  1. 사용자 맞춤형 커스텀 카테고리 기능 및 도넛(파이) 차트 시각화 추가

  2. OCR 처리 속도 및 정확도 향상을 위한 AI 모델 A/B 테스트 정교화

  3. 기능 확장에 대비한 멀티 모듈(core, feature 등) 분리 작업


Jetpack Compose와 Kotlin 최신 스택들을 활용해 클린 아키텍처를 도입해 보는 뜻깊은 경험이었습니다. 🚀





오늘의 이야기


#스하리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/05/18

오늘의 이야기



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

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

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

그것도 구글 Gemini로다가!

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

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

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


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




오늘의 이야기


#스하리1000명프로젝트

오늘 내가 만든앱 하나 알려주고 싶어, 이 앱은 알림수집기 라고 이름을 붙였는 데,
내 폰에 표시 되는 알림을 읽어서 내가 지정한 단어가 들어 있고, 지출기록을 남겨야 하는 알림이
있으면 수집하고, 카카오톡으로 친구에게 전달해 주는 기능을 구현해 줄꺼야. 📲

이번 패치에서는 하루 한번 지정한 시간에 나에게 알림(노티) 하도록 기능을 추가 했어. 🙏
한번 써보고 불편한 거 있으면 말해줘.

앱 바로가기
👉 https://play.google.com/store/apps/details?id=com.nari.notify2kakao





오늘의 이야기


#스하리1000명프로젝트,
外国人労働者と話すのが難しいこともありますよね?
簡単に役立つアプリを作りました!あなたは自分の言語で書き、他の人は自分の言語でそれを見ます。
設定に基づいて自動翻訳します。
簡単なチャットに非常に便利です。機会があったら見てみてください!
https://play.google.com/store/apps/details?id=com.billcoreatech.multichat416




오늘의 이야기


#billcorea #운동동아리관리앱
🏸スチーニーたち、バドミントン同好会必須アプリ登場!
👉マッチプレイ - スコア記録&試合相手を探す🎉
一人で、友達、同好会どこでもぴったりです! 🤝
バドミントン好きならぜひ使ってみてください

アプリショートカット👉 https://play.google.com/store/apps/details?id=com.billcorea.matchplay




오늘의 이야기

BarcodeVoucher0407 개발일기 #07



날짜: 2026-04-19
주제: Phase 2 마무리 + 레거시 QR 스캔 UX 폴리싱



QR Scanner



 


오늘의 목표


오늘은 Phase 2의 흐름을 유지하면서, 실제 사용 중 눈에 띄는 불편 요소를 줄이는 데 집중했다.
특히 레거시 QR 스캔 화면의 시스템바 겹침 문제버튼 가시성 문제를 해결하는 것이 핵심이었다.




배경: 왜 이 작업이 필요했나


기능 자체는 동작했지만, 실제 디바이스에서 아래 문제가 반복적으로 보였다.



  • 상단의 뒤로가기/플래시 버튼이 상태바, 컷아웃 영역과 겹쳐 보이는 경우가 있음

  • 하단 스캔 안내 문구(예: "바코드를 선에 맞춰주세요")가 네비게이션 바와 시각적으로 겹침

  • ic_media_previous 아이콘이 "뒤로가기" 의미보다 "미디어 이전" 느낌에 가까워 직관성이 떨어짐


즉, 기능 완성도보다 실사용 UX 디테일을 끌어올리는 작업이 필요했다.




오늘 적용한 변경 사항


1) 레거시 스캔 화면 안전영역(insets) 보정



  • 파일: app/src/main/java/com/billcorea/barcodevoucher0407/feature/scan/LegacyQrScanActivity.kt

  • applySystemBarInsets에서 상단/하단 인셋을 분리 반영

    • 상단 인셋: 뒤로가기/플래시 버튼 margin 보정

    • 하단 인셋: 스캔 안내 문구(statusView) 패딩 보정




val topBars = insets.getInsets(
WindowInsetsCompat.Type.statusBars() or WindowInsetsCompat.Type.displayCutout(),
)
val bottomBars = insets.getInsets(WindowInsetsCompat.Type.navigationBars())

(backButton.layoutParams as FrameLayout.LayoutParams).topMargin = baseBackTop + topBars.top
(flashButton.layoutParams as FrameLayout.LayoutParams).topMargin = baseFlashTop + topBars.top
statusView.setPadding(0, 0, 0, baseStatusBottom + bottomBars.bottom)

효과:



  • 버튼/안내 문구가 시스템 UI와 겹치지 않고 안정적으로 배치됨


2) 뒤로가기/플래시 버튼 시인성 개선



  • 파일: app/src/main/res/layout/activity_legacy_qr_scan.xml

  • 변경 내용:

    • 버튼 배경을 원형 반투명으로 통일

    • padding, scaleType 조정으로 아이콘 가독성 향상



  • 추가 리소스: app/src/main/res/drawable/bg_round_translucent_button.xml


<ImageButton
android:id="@+id/btnBack"
android:layout_width="48dp"
android:layout_height="48dp"
android:background="@drawable/bg_round_translucent_button"
android:padding="12dp"
android:scaleType="centerInside"
android:src="@drawable/ic_arrow_back_24" />

효과:



  • 카메라 프리뷰 위에서도 버튼이 더 잘 보임


3) 뒤로가기 아이콘 교체 (media_previous -> arrow_back)



  • 기존: @android:drawable/ic_media_previous

  • 신규: @drawable/ic_arrow_back_24

  • 추가 리소스: app/src/main/res/drawable/ic_arrow_back_24.xml


<vector xmlns:android="http://schemas.android.com/apk/res/android"
android:width="24dp"
android:height="24dp"
android:viewportWidth="24"
android:viewportHeight="24">
<path
android:fillColor="#FFFFFFFF"
android:pathData="M20,11H7.83l5.59,-5.59L12,4l-8,8 8,8 1.41,-1.41L7.83,13H20v-2z" />
</vector>

효과:



  • 버튼 의미가 더 명확해져 사용자 혼란 감소


4) 리소스 lint 정리



  • android:tint 관련 경고/오류 포인트 정리

  • 현재 아이콘은 벡터 자체를 흰색으로 지정해 불필요 속성 제거


<!-- before -->
android:src="@drawable/ic_arrow_back_24"
android:tint="@android:color/white"

<!-- after -->
android:src="@drawable/ic_arrow_back_24"

효과:



  • 리소스 검사 에러 없이 안정 상태 유지




Phase 2 진행 맥락 정리


agent.md 기준으로 Phase 2는 체크 완료 상태이며, 오늘 작업은 그중 2-3 UX 개선 항목의 완성도 보강에 해당한다.


이미 완료된 Phase 2 주요 축:



  • 검색/필터/정렬

  • 영수증 이미지 첨부

  • 스캔 실패/중복 처리 UX 개선

  • DataStore 설정화


오늘은 위 기능들을 실제 화면 품질 관점에서 다듬는 "마감 폴리싱" 성격이었다.




작업하면서 얻은 인사이트



  • 기능 구현이 끝나도, 카메라 화면처럼 시스템 UI와 맞물리는 영역은 인셋 처리가 UX 품질을 크게 좌우한다.

  • 아이콘은 단순 미관이 아니라 행동 의미 전달 그 자체다. (media_previous vs arrow_back)

  • 작은 시각 개선(배경, 패딩, 배치)이 사용자 체감 품질을 빠르게 끌어올린다.




다음 계획


Phase 3로 넘어가며 아래 순서로 진행할 예정이다.



  1. Kakao Map 연동(상세 -> 지도)

  2. In-app Update 적용

  3. 통계/리포트(월별 금액, 카테고리)




한 줄 회고


오늘은 "새 기능 추가"보다 "이미 있는 기능을 편하게 쓰게 만드는 작업"이 얼마나 중요한지 다시 확인한 하루였다.





오늘의 이야기


#스하리1000명프로젝트,
แพ้เกาหลีเหรอ? แม้ว่าคุณจะพูดภาษาเกาหลีไม่ได้ แต่แอปนี้จะช่วยให้คุณเดินทางได้อย่างง่ายดาย
เพียงพูดภาษาของคุณ ระบบจะแปล ค้นหา และแสดงผลลัพธ์เป็นภาษาของคุณ
เหมาะสำหรับนักเดินทาง! รองรับมากกว่า 10 ภาษา รวมถึงภาษาอังกฤษ ญี่ปุ่น จีน เวียดนาม และอื่นๆ
ลองตอนนี้!
https://play.google.com/store/apps/details?id=com.billcoreatech.opdgang1127




2026/05/17

오늘의 이야기



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

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

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

그것도 구글 Gemini로다가!

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

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

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


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




오늘의 이야기


#스하리1000명프로젝트

오늘 내가 만든앱 하나 알려주고 싶어, 이 앱은 알림수집기 라고 이름을 붙였는 데,
내 폰에 표시 되는 알림을 읽어서 내가 지정한 단어가 들어 있고, 지출기록을 남겨야 하는 알림이
있으면 수집하고, 카카오톡으로 친구에게 전달해 주는 기능을 구현해 줄꺼야. 📲

이번 패치에서는 하루 한번 지정한 시간에 나에게 알림(노티) 하도록 기능을 추가 했어. 🙏
한번 써보고 불편한 거 있으면 말해줘.

앱 바로가기
👉 https://play.google.com/store/apps/details?id=com.nari.notify2kakao





오늘의 이야기


#스하리1000명프로젝트,
가끔 외국인 노동자들과 대화가 힘들 때가 있죠?
도움이 되는 간단한 앱을 만들어 봤습니다! 당신은 당신의 언어로 글을 쓰고, 다른 사람들은 그것을 그들의 언어로 봅니다.
설정에 따라 자동 번역됩니다.
쉬운 채팅에 매우 편리합니다. 기회되면 꼭 보세요!
https://play.google.com/store/apps/details?id=com.billcoreatech.multichat416




오늘의 이야기


#billcorea #운동동아리관리앱
🏸 Schneedle, a must-have app for badminton clubs!
👉 Match Play – Record Scores & Find Opponents 🎉
Perfect for anywhere, alone, with friends, or in a club! 🤝
If you like badminton, definitely try it

Go to app 👉 https://play.google.com/store/apps/details?id=com.billcorea.matchplay




오늘의 이야기

**) 단계별 구현 로드맵 (MVP -> 확장)


앱 작업중 이미지



 


Phase 1 - MVP (핵심 기능)



  • Hilt/Room 기본 세팅

  • Receipt Entity/DAO/Repository 구현

  • 스캔 화면 + 코드값 저장

  • 목록/상세/수정/삭제 (현재 상세는 Edit 화면 겸용)

  • 기본 테스트(DAO + ViewModel)


Phase 2 - 사용자 경험 강화



  • 검색/필터/정렬

  • 영수증 이미지 첨부

  • 스캔 실패/중복 처리 UX 개선

  • DataStore 설정화


2-1) 검색/필터/정렬


세부 작업



  • ReceiptUiStatesort, filters 상태(기간/금액/저장여부 등) 추가

  • ReceiptListScreen 상단을 검색 + 필터 + 정렬 UI로 확장

  • ReceiptDao에 필터/정렬 쿼리 추가(또는 통합 쿼리 전략 적용)

  • ReceiptRepository.observeReceipts(...)를 query + sort + filter 입력으로 확장

  • ReceiptViewModel에서 검색/필터/정렬을 단일 Flow 파이프라인으로 결합


완료 기준 (Acceptance Criteria)



  • 검색어/필터/정렬 변경 시 목록이 즉시 반영된다

  • 빈 결과/초기 상태/검색 결과 상태가 UI에서 구분된다


권장 테스트 포인트



  • DAO 테스트: 정렬 우선순위 및 필터 조합 결과 검증

  • ViewModel 테스트: query/sort/filter 변경 시 상태 전이 검증


2-2) 영수증 이미지 첨부


세부 작업



  • ReceiptEditScreen에 이미지 첨부/변경/삭제 액션 및 썸네일 추가

  • ActivityResult 기반 이미지 선택 플로우 연결

  • imageUri 저장/수정 경로를 Repository 저장 로직에 반영

  • URI 접근 실패 시 플레이스홀더 + 재선택 안내 UI 제공

  • 목록 카드에서 첨부 여부(썸네일/아이콘) 표시


완료 기준 (Acceptance Criteria)



  • 이미지 첨부 후 저장 시 재진입해도 첨부 상태가 유지된다

  • 잘못된 URI/권한 문제 시 크래시 없이 복구 안내가 표시된다


권장 테스트 포인트



  • Repository 테스트: imageUri 저장/수정/삭제 검증

  • UI 테스트: 첨부 전/후/삭제 상태 렌더링 검증


2-3) 스캔 실패/중복 처리 UX 개선


세부 작업



  • 스캔 결과 모델을 성공/취소/실패/중복으로 구분

  • 취소/실패(raw 없음) 시 사용자 피드백 + 재시도 액션 제공

  • 중복 판단 기준 정의 및 DAO/Repository 중복 조회 API 추가

  • 중복 시 기존 열기/신규 저장 선택 다이얼로그 제공

  • 실패/중복 이벤트를 scan_history에 기록


완료 기준 (Acceptance Criteria)



  • 취소/실패/중복 상황에서 다음 행동(재시도/이동) 안내가 제공된다

  • 동일 코드 재스캔 시 중복 정책 분기가 일관되게 동작한다


권장 테스트 포인트



  • Repository 테스트: 중복 판단 경계값 검증

  • UI 테스트: 실패/중복 다이얼로그 표시 및 액션 검증


2-4) DataStore 설정화


세부 작업



  • DataStore 의존성 추가 및 버전 카탈로그 반영

  • 설정 모델(SortOrder, 기본 필터, 스캔 옵션)과 SettingsDataStore 구현

  • Hilt 모듈에 DataStore/Settings Repository 제공 추가

  • ViewModel에서 DataStore Flow와 목록 Flow 결합

  • 최소 UI(정렬/필터 선택)에서 설정 저장 연결


완료 기준 (Acceptance Criteria)



  • 선택한 정렬/필터 기본값이 앱 재실행 후에도 유지된다

  • 설정 변경 시 목록이 즉시 반영된다


권장 테스트 포인트



  • DataStore 테스트: 기본값/쓰기/읽기/복원 검증

  • ViewModel 테스트: 설정 Flow 반영으로 목록 상태 변경 검증


Phase 3 - 고도화 기능



  • Kakao Map 연동(상세 -> 지도)

  • In-app Update 적용

  • 통계/리포트(월별 금액, 카테고리)





오늘의 이야기


#스하리1000명프로젝트,
Bị lạc ở Hàn Quốc? Ngay cả khi bạn không nói được tiếng Hàn, ứng dụng này vẫn giúp bạn đi lại dễ dàng.
Chỉ cần nói ngôn ngữ của bạn—nó sẽ dịch, tìm kiếm và hiển thị kết quả bằng ngôn ngữ của bạn.
Tuyệt vời cho du khách! Hỗ trợ hơn 10 ngôn ngữ bao gồm tiếng Anh, tiếng Nhật, tiếng Trung, tiếng Việt, v.v.
Hãy thử nó ngay bây giờ!
https://play.google.com/store/apps/details?id=com.billcoreatech.opdgang1127




2026/05/16

오늘의 이야기



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

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

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

그것도 구글 Gemini로다가!

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

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

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


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




오늘의 이야기


#스하리1000명프로젝트

오늘 내가 만든앱 하나 알려주고 싶어, 이 앱은 알림수집기 라고 이름을 붙였는 데,
내 폰에 표시 되는 알림을 읽어서 내가 지정한 단어가 들어 있고, 지출기록을 남겨야 하는 알림이
있으면 수집하고, 카카오톡으로 친구에게 전달해 주는 기능을 구현해 줄꺼야. 📲

이번 패치에서는 하루 한번 지정한 시간에 나에게 알림(노티) 하도록 기능을 추가 했어. 🙏
한번 써보고 불편한 거 있으면 말해줘.

앱 바로가기
👉 https://play.google.com/store/apps/details?id=com.nari.notify2kakao





오늘의 이야기


#스하리1000명프로젝트,
Bazen yabancı işçilerle konuşmak zor oluyor, değil mi?
Yardımcı olacak basit bir uygulama yaptım! Siz kendi dilinizde yazarsınız ve başkaları da bunu kendi dillerinde görür.
Ayarlara göre otomatik çeviri yapar.
Kolay sohbetler için son derece kullanışlı. Fırsat bulduğunda bir göz at!
https://play.google.com/store/apps/details?id=com.billcoreatech.multichat416




오늘의 이야기


#billcorea #운동동아리관리앱
🏸 Schneedle, badminton kulüplerinin olmazsa olmaz uygulaması!
👉 Maç Oyunu – Skorları Kaydedin ve Rakipleri Bulun 🎉
Tek başınıza, arkadaşlarınızla veya bir kulüpte her yerde mükemmel! 🤝
Badmintonu seviyorsanız mutlaka deneyin

Uygulamaya git 👉 https://play.google.com/store/apps/details?id=com.billcorea.matchplay




오늘의 이야기

BarcodeVoucher0407 - Agent Draft


 


0) 문서 목적


이 문서는 BarcodeVoucher0407 프로젝트의 초기 개발 가이드입니다.
목표는 바코드/QR 기반 영수증 적립 및 조회 앱의 MVP를 빠르게 완성하고,
이후 지도/업데이트/고도화 기능으로 확장 가능한 구조를 만드는 것입니다.




1) 제품 목표 / 핵심 사용자 시나리오


제품 목표



  • 사용자가 영수증의 바코드(또는 QR)를 스캔해 디지털로 보관

  • 보관된 영수증을 목록/검색/필터로 빠르게 조회

  • 매장 위치와 연계(카카오맵)해 사용처를 시각적으로 확인

  • 안정적인 업데이트 전달(In-app Update)


핵심 사용자 시나리오



  1. 앱 실행 -> 스캔 버튼 탭

  2. 바코드/QR 스캔 -> 코드값 추출

  3. 영수증 메타정보(매장명, 금액, 일시, 카테고리, 메모 등) 입력/수정

  4. 저장 후 목록에서 확인

  5. 상세 화면에서 지도 위치 확인 및 메모 관리




2) 기술 스택 제안과 선택 이유



  • Kotlin + Jetpack Compose: UI 생산성, 상태 기반 화면 구성

  • Hilt: 의존성 주입 표준화, 테스트 용이성 향상

  • Room: 오프라인 우선 로컬 저장, 구조화된 쿼리 지원

  • Barcode/QR Scanner (ML Kit 또는 ZXing 계열): 빠른 스캔 구현

  • Play Core In-app Update: 앱 내 업데이트 UX 개선

  • Kakao Map API: 매장 위치/지도 시각화

  • Coroutines + Flow: 비동기 처리, 반응형 데이터 스트림

  • DataStore: 사용자 설정/간단 상태 영속화




3) 권장 프로젝트 구조


초기에는 단일 모듈(app)로 시작하고, 기능 확장 시 멀티모듈 전환을 권장합니다.


단일 모듈 패키지 구조(초기)



  • com.billcorea.barcodevoucher0407

    • core/ (공통 유틸, Result, Dispatcher, Base)

    • di/ (Hilt Module)

    • data/

      • local/ (Room DB, DAO, Entity)

      • remote/ (향후 서버 연동 시)

      • repository/ (구현체)



    • domain/

      • model/

      • repository/ (인터페이스)

      • usecase/



    • feature/

      • scan/

      • receipt_list/

      • receipt_detail/

      • map/

      • settings/



    • ui/ (theme, common components)




멀티모듈 전환 후보(확장)



  • core-common, core-ui, data-local, feature-scan, feature-receipt, feature-map




4) 데이터 모델(Room) 초안



MVP 기준 최소 모델 + 확장 가능한 형태



Entity: Receipt



  • id: Long (PK, autoGenerate)

  • barcodeRaw: String (원본 코드값, index)

  • barcodeType: String (QR_CODE, EAN_13 등)

  • storeName: String?

  • totalAmount: Long?

  • currency: String? (예: KRW)

  • purchasedAt: Long? (epoch millis)

  • memo: String?

  • imageUri: String? (선택: 영수증 사진)

  • lat: Double?

  • lng: Double?

  • createdAt: Long

  • updatedAt: Long


Entity: ScanHistory



  • id: Long (PK)

  • receiptId: Long? (FK)

  • rawValue: String

  • format: String

  • scannedAt: Long

  • isSaved: Boolean


DAO 예시



  • insertReceipt(receipt)

  • updateReceipt(receipt)

  • deleteReceipt(id)

  • getReceiptById(id)

  • observeReceipts() (Flow<List>)

  • searchReceipts(query)


인덱스/제약



  • barcodeRaw, purchasedAt, storeName 인덱스 권장

  • ScanHistory.receiptId FK + CASCADE




5) 화면/플로우 초안


주요 화면



  1. Splash/Init: 필수 권한/업데이트 체크

  2. Receipt List: 최근순 목록, 검색/필터

  3. Scan: 카메라 미리보기 + 스캔 가이드

  4. Receipt Edit/Detail: 저장/수정/삭제

  5. Map: 카카오맵 위치 확인

  6. Settings: 스캔 옵션, 테마, 정보


내비게이션



  • list -> scan -> edit -> detail

  • detail -> map




6) 아키텍처 가이드



  • 패턴: MVVM + Repository + UseCase

  • 상태: UiState(Loading/Success/Error) + 단방향 데이터 흐름

  • 비동기: viewModelScope + Flow

  • DI: Hilt로 Database, Dao, Repository, UseCase 주입

  • 에러 정책: 도메인 에러 타입 분리(Validation, Camera, Database, Map)




7) 단계별 구현 로드맵 (MVP -> 확장)


Phase 1 - MVP (핵심 기능)



  • Hilt/Room 기본 세팅

  • Receipt Entity/DAO/Repository 구현

  • 스캔 화면 + 코드값 저장

  • 목록/상세/수정/삭제

  • 기본 테스트(DAO + ViewModel)


Phase 2 - 사용자 경험 강화



  • 검색/필터/정렬

  • 영수증 이미지 첨부

  • 스캔 실패/중복 처리 UX 개선

  • DataStore 설정화


Phase 3 - 고도화 기능



  • Kakao Map 연동(상세 -> 지도)

  • In-app Update 적용

  • 통계/리포트(월별 금액, 카테고리)




8) 주요 리스크와 대응



  • 스캔 인식률 문제: 가이드 오버레이, 재시도 UX, 라이브러리 A/B 검토

  • 권한 거부 이슈: 권한 사전 안내 + 대체 흐름 제공

  • 지도 API 키 관리: local.properties/CI Secret 사용, 하드코딩 금지

  • 업데이트 정책 충돌: immediate/flexible 전략 분리 및 QA 시나리오 확보

  • 데이터 신뢰성: 트랜잭션/중복 체크/마이그레이션 테스트




9) 테스트 전략



  • Unit Test: UseCase, ViewModel 상태 전이

  • DAO Test: in-memory Room DB로 CRUD/검색 검증

  • UI Test: 리스트/상세/스캔 진입 플로우

  • 통합 점검: 업데이트 체크, 맵 진입, 권한 케이스


권장 기준:



  • 핵심 도메인 로직 테스트 우선

  • DB 스키마 변경 시 마이그레이션 테스트 필수




10) 초기 To-do 체크리스트


환경/의존성



  • Hilt 관련 Gradle 플러그인 및 의존성 추가

  • Room(KSP/KAPT 포함) 의존성 추가

  • 스캔 라이브러리(ML Kit 또는 ZXing) 선택/적용

  • In-app Update 의존성 추가

  • Kakao Map SDK 의존성 및 키 설정


코드 베이스



  • Application + @HiltAndroidApp 구성

  • AppDatabase, Entity, DAO 생성

  • Repository + UseCase + ViewModel 연결

  • Compose Navigation 그래프 구성

  • 샘플 더미 데이터/프리뷰 작성


품질/운영



  • 기본 테스트 템플릿 작성

  • 에러 로깅/크래시 대응 정책 확정

  • 릴리스 전 권한/업데이트/지도 QA 체크리스트 작성




부록: 구현 우선순위 제안 (짧게)



  1. Hilt + Room 기반 골격 완성

  2. 스캔 -> 저장 -> 목록/상세까지 E2E 연결

  3. 맵/업데이트 기능 순차 통합

  4. 테스트 보강 후 MVP 배포





오늘의 이야기


#스하리1000명프로젝트,
Nawala sa Korea? Kahit na hindi ka nagsasalita ng Korean, tinutulungan ka ng app na ito na madaling makalibot.
Sabihin lang ang iyong wika—ito ay nagsasalin, naghahanap, at nagpapakita ng mga resulta pabalik sa iyong wika.
Mahusay para sa mga manlalakbay! Sinusuportahan ang 10+ wika kabilang ang English, Japanese, Chinese, Vietnamese, at higit pa.
Subukan ito ngayon!
https://play.google.com/store/apps/details?id=com.billcoreatech.opdgang1127




2026/05/15

오늘의 이야기

분석 결과:
회차 당첨번호 증가간격 짝수:홀수 총합 평균 총합_이전일치_간격 평균_이전일치_간격 최고일치율 최고일치율_이전일치_간격
1204 8,16,28,30,31,44 8,12,2,1,13 4:2 157 26.17 N/A N/A N/A N/A
1205 1,4,16,23,31,41 3,12,7,8,10 2:4 116 19.33 1 N/A 25.00% 0
1206 1,3,17,26,27,42 2,14,9,1,15 2:4 116 19.33 1 1 25.00% 1
1207 10,22,24,27,38,45 12,2,3,11,7 3:3 166 27.67 N/A N/A 25.00% 1
1208 6,27,30,36,38,42 21,3,6,2,4 4:2 179 29.83 N/A N/A 25.00% 1
1209 2,17,20,35,37,39 15,3,15,2,2 2:4 120 20.00 N/A N/A 25.00% 1
1210 1,7,9,17,27,38 6,2,8,10,11 2:4 99 16.50 N/A N/A 25.00% 1
1211 23,26,27,35,38,40 3,1,8,3,2 4:2 189 31.50 N/A N/A 25.00% 1
1212 5,8,25,31,41,44 3,17,6,10,3 3:3 154 25.67 N/A N/A 25.00% 1
1213 5,11,25,27,36,38 6,14,2,9,2 2:4 142 23.67 N/A N/A 25.00% 1
1214 10,15,19,27,30,33 5,4,8,3,3 3:3 134 22.33 N/A N/A 25.00% 1
1215 13,15,19,21,44,45 2,4,2,23,1 2:4 157 26.17 11 N/A 50.00% 0
1216 3,10,14,15,23,24 7,4,1,8,1 3:3 89 14.83 N/A N/A 25.00% 1
1217 8,10,15,20,29,31 2,5,5,9,2 3:3 113 18.83 N/A N/A 25.00% 1
1218 3,28,31,32,42,45 25,3,1,10,3 4:2 181 30.17 N/A N/A 25.00% 1
1219 1,2,15,28,39,45 1,13,13,11,6 2:4 130 21.67 N/A N/A 25.00% 1
1220 2,22,25,28,34,43 20,3,3,6,9 4:2 154 25.67 8 8 25.00% 1
1221 6,13,18,28,30,36 7,5,10,2,6 4:2 131 21.83 N/A N/A 25.00% 1
1222 4,11,17,22,32,41 7,6,5,10,9 3:3 127 21.17 N/A N/A 25.00% 1
1223 16,18,20,32,33,39 2,2,12,1,6 4:2 158 26.33 N/A N/A 25.00% 1

다음 회차 추천 번호 (5가지):
추천 1 [15,17,27,28,31,32]
추천 2 [06,10,24,25,37,39]
추천 3 [14,20,23,26,30,34]
추천 4 [02,04,12,16,33,42]
추천 5 [05,13,21,35,40,44]

추천 번호 조합 선정 이유:
1. 가장 많이 출현한 숫자 기반 조합: 전체 20회차 데이터에서 가장 높은 빈도로 등장한 6개 숫자를 조합하여 만들었습니다. 이는 통계적으로 출현 확률이 높다고 판단되는 번호들로 구성됩니다.
(가장 많이 출현한 숫자: 15, 17, 20, 27, 28, 31, 32, 38, 39, 41, 42, 45 - 이 중 빈도수가 높은 6개를 선택)
2. 짝수/홀수 균형 조합: 당첨 번호의 짝수와 홀수 비율이 3:3 또는 4:2, 2:4 등으로 균형을 이루는 경우가 많습니다. 본 조합은 이러한 경향을 반영하여 짝수와 홀수의 균형을 맞추고, 자주 출현하는 번호들을 우선적으로 고려하여 구성되었습니다.
3. 총합 및 평균값 중앙 범위 조합: 과거 당첨 번호의 총합 및 평균이 특정 범위(총합 130-160, 평균 21-26)에 집중되는 경향을 보입니다. 이 조합은 이러한 평균적인 총합 및 평균 범위에 해당하도록 숫자를 선택하여 구성되었습니다.
4. 직전 회차(1223) 패턴 변형 조합: 직전 회차(1223)의 당첨 번호가 보인 짝수:홀수 비율(4:2)과 총합(158) 패턴을 유지하되, 숫자 간 간격 및 개별 숫자를 변경하여 새로운 조합을 생성했습니다. 이는 최근의 출현 경향을 유지하면서도 직접적인 중복을 피하기 위한 전략입니다.
5. 낮은 번호/중간 번호/높은 번호 균형 조합: 1-15, 16-30, 31-45와 같은 번호 구간별로 고르게 숫자를 분포시키는 경향을 반영한 조합입니다. 각 구간에서 2개씩 숫자를 선택하여 넓은 범위의 숫자가 나올 가능성을 대비했습니다.

이전 회차(1223) 당첨번호와 추천 조합 비교 분석:
이전 회차(1223) 당첨번호: 16, 18, 20, 32, 33, 39
- 증가간격: 2, 2, 12, 1, 6
- 짝수:홀수 비율: 4:2
- 총합: 158
- 평균: 26.33

새로운 추천 조합들은 직전 회차와의 직접적인 중복을 피하면서도, 데이터 분석을 통해 도출된 다양한 패턴(출현 빈도, 짝수/홀수 균형, 총합/평균 범위, 구간별 분포 등)을 반영하고 있습니다. 특히, 각 조합은 이전에 당첨되었던 최근 10회차의 번호들과 일치하지 않도록 검증되었습니다.

추천 조합 1: 15, 17, 27, 28, 31, 32
- 증가간격: 2, 10, 1, 3, 1
- 짝수:홀수 비율: 3:3
- 총합: 150
- 평균: 25.00

추천 조합 2: 06, 10, 24, 25, 37, 39
- 증가간격: 4, 14, 1, 12, 2
- 짝수:홀수 비율: 3:3
- 총합: 141
- 평균: 23.50

추천 조합 3: 14, 20, 23, 26, 30, 34
- 증가간격: 6, 3, 3, 4, 4
- 짝수:홀수 비율: 5:1
- 총합: 147
- 평균: 24.50

추천 조합 4: 02, 04, 12, 16, 33, 42
- 증가간격: 2, 8, 4, 17, 9
- 짝수:홀수 비율: 4:2
- 총합: 109
- 평균: 18.17

추천 조합 5: 05, 13, 21, 35, 40, 44
- 증가간격: 8, 8, 14, 5, 4
- 짝수:홀수 비율: 2:4
- 총합: 158
- 평균: 26.33



사용하는 예시 영상 보기
이 앱이 궁금 하다면, 아래 링크에서 설치할 수 있습니다.
로또 645






오늘의 이야기



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

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

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

그것도 구글 Gemini로다가!

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

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

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


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




오늘의 이야기


#스하리1000명프로젝트

오늘 내가 만든앱 하나 알려주고 싶어, 이 앱은 알림수집기 라고 이름을 붙였는 데,
내 폰에 표시 되는 알림을 읽어서 내가 지정한 단어가 들어 있고, 지출기록을 남겨야 하는 알림이
있으면 수집하고, 카카오톡으로 친구에게 전달해 주는 기능을 구현해 줄꺼야. 📲

이번 패치에서는 하루 한번 지정한 시간에 나에게 알림(노티) 하도록 기능을 추가 했어. 🙏
한번 써보고 불편한 거 있으면 말해줘.

앱 바로가기
👉 https://play.google.com/store/apps/details?id=com.nari.notify2kakao





오늘의 이야기


#스하리1000명프로젝트,
บางครั้งการพูดคุยกับแรงงานต่างด้าวก็ยากใช่ไหม?
ฉันสร้างแอปง่ายๆ ที่ช่วยได้! คุณเขียนเป็นภาษาของคุณ และคนอื่นๆ ก็เห็นเป็นภาษาของพวกเขา
มันแปลอัตโนมัติตามการตั้งค่า
มีประโยชน์มากสำหรับการแชทที่ง่ายดาย ควรดูเมื่อมีโอกาส!
https://play.google.com/store/apps/details?id=com.billcoreatech.multichat416




오늘의 이야기


#billcorea #운동동아리관리앱
🏸 Schneedle แอปที่สโมสรแบดมินตันต้องมี!
👉 แมทช์เพลย์ – บันทึกคะแนนและค้นหาคู่ต่อสู้ 🎉
เหมาะสำหรับทุกที่ คนเดียว กับเพื่อนฝูง หรือในคลับ! 🤝
ถ้าคุณชอบแบดมินตันลองดูแน่นอน

ไปที่แอป 👉 https://play.google.com/store/apps/details?id=com.billcorea.matchplay




오늘의 이야기

 


작업 개요


오늘은 AGENTS.md 정리와 일일 알림 기능 점검/보완 작업을 진행했다.
주요 목표는 AI 에이전트 문서의 한국어 가독성을 높이고, 앱이 실행 중이 아니어도 매일 지정된 시간에 알림 대상이 있는지 확인하여 알림을 노출하도록 만드는 것이었다.


1. AGENTS.md 정리


작업 내용



  • 기존 루트 AGENTS.md를 기준으로 코드 구조를 다시 확인했다.

  • 프로젝트 특성에 맞는 한국어 메모를 각 섹션 아래에 보강했다.

  • 하단에 추가된 한국어 설명 문장을 Markdown 형식으로 정리했다.

  • ## 한국어 요약 메모 섹션을 추가하고, 항목별로 ### 제목과 불릿 목록으로 정돈했다.


정리한 주요 항목



  • Compose

  • Hilt

  • Room Database 미사용(raw SQLite 사용)

  • AI / Cloud Function 호출 흐름

  • API / 외부 연동

  • 알림 / 수집 흐름

  • WorkManager / 백그라운드

  • 테스트 현황

  • 작업 시 주의점


2. 일일 알림 기능 점검 및 구현


기존 구조 확인 결과



  • 설정 화면에는 alarmTime 선택 기능이 이미 존재했다.

  • 기존 알림 로직은 SettingsActivity2.kt + WorkDefLib.kt 중심의 WorkManager 흐름이었다.

  • 하지만 이 구조는 사용자가 선택한 시각에 매일 정확하게 체크하는 방식으로 보기 어려웠고,
    앱 미실행 상태나 재부팅 이후까지 안정적으로 유지되는 구조도 부족했다.

  • 또한 오늘 실제 알림 대상이 없더라도 알림이 발생할 가능성이 있었다.


구현/수정 내용



  • core/DailyReminderScheduler.kt 신규 추가

    • AlarmManager 기반으로 다음 일일 알림 시간을 예약하도록 구성

    • 저장된 alarmTime 값을 기준으로 다음 실행 시각 계산

    • 오늘 대상 데이터가 있을 때만 알림 노출



  • core/DailyReminderReceiver.kt 신규 추가

    • 일일 알림 브로드캐스트 수신

    • 부팅 완료, 앱 업데이트, 시간 변경, 타임존 변경 시 재예약 처리



  • AndroidManifest.xml 수정

    • RECEIVE_BOOT_COMPLETED 권한 추가

    • DailyReminderReceiver 등록



  • presentation/option/SettingsActivity2.kt 수정

    • 기존 WorkManager 지연 계산 로직 대신 새 스케줄러 호출로 단순화



  • presentation/composes/SettingScreen.kt 수정

    • 설정 저장 시 alarmTime 변경값으로 즉시 재예약되도록 반영



  • ComposeMainActivity.kt 수정

    • 앱 재진입 시 저장된 설정 기준으로 알림 예약이 동기화되도록 처리



  • core/WorkDefLib.kt 수정

    • 기존 반복 예약 대신 새 스케줄러 호출 중심으로 단순화



  • 문자열 리소스 추가

    • 일일 알림 채널명, 제목, 본문 문구 추가

    • values-ko/strings.xml에도 한국어 번역 반영




3. 알림 동작 기준



  • 매일 사용자가 설정한 시각에 체크하도록 예약

  • 오늘 날짜 기준으로 달력/출금 대상 데이터가 있는지 조회

  • 대상이 있을 때만 시스템 알림 표시

  • 알림 클릭 시 ComposeMainActivity로 진입하도록 구성

  • 앱이 꺼져 있어도, 부팅/시간 변경 이후 다시 예약되도록 구성


4. 검증 결과


코드/구조 점검



  • 설정 저장 경로와 알림 예약 경로가 연결되어 있는지 확인했다.

  • 클릭 시 메인 화면 진입 흐름이 연결되어 있는지 확인했다.

  • 재부팅/시간 변경 시 재예약되도록 매니페스트와 리시버 등록을 반영했다.


빌드 확인


아래 빌드를 직접 확인했다.



  • :app:compileDebugKotlin 성공

  • :app:assembleDebug 성공


5. 오늘 작업한 주요 파일



  • AGENTS.md

  • app/src/main/AndroidManifest.xml

  • app/src/main/java/com/nari/notify2kakao/core/DailyReminderScheduler.kt

  • app/src/main/java/com/nari/notify2kakao/core/DailyReminderReceiver.kt

  • app/src/main/java/com/nari/notify2kakao/core/WorkDefLib.kt

  • app/src/main/java/com/nari/notify2kakao/presentation/option/SettingsActivity2.kt

  • app/src/main/java/com/nari/notify2kakao/presentation/composes/SettingScreen.kt

  • app/src/main/java/com/nari/notify2kakao/ComposeMainActivity.kt

  • app/src/main/res/values/strings.xml

  • app/src/main/res/values-ko/strings.xml


6. 메모



  • 현재 구현은 앱 미실행 상태에서도 일일 체크가 가능하도록 보완한 상태다.

  • 실제 기기에서는 제조사 배터리 정책이나 정확한 알람 정책(Android 12+)에 따라 시각 오차가 일부 발생할 수 있으므로 추후 실기기 확인이 필요하다.

  • 필요 시 다음 단계로 알림 클릭 시 특정 화면/탭으로 직접 이동하는 개선도 가능하다.


2026-04-03 작업 이력


작업 개요


오늘은 layoutVersion 제거 이후 현재 프로젝트에 남아 있는 XML UI 사용 지점을 다시 정리하고,
향후 Compose 중심 구조로 전환하기 위한 계획을 정리했다.



2026-04-03 추가 반영: 이후 후속 정리를 진행하면서 SettingsActivity2.kt, settings_activity.xml, root_preferences.xml, activity_setting.xml, core/kakao/kakaoToast.kt, view_toast.xml까지 모두 제거되었고, 관련 TODO도 완료 처리했다.



1. 당시 기준 XML 사용 지점 정리


실제 사용 중인 layout



  • app/src/main/res/layout/settings_activity.xml

    • presentation/option/SettingsActivity2.kt에서 setContentView(...)로 사용

    • 설정용 PreferenceFragmentCompat를 담는 컨테이너 역할



  • app/src/main/res/layout/notify_setting.xml

    • LoginActivity.kt에서 NotifySettingBinding으로 사용

    • 알림 권한 안내 다이얼로그 내부 이미지 영역



  • app/src/main/res/layout/view_toast.xml

    • core/kakao/kakaoToast.kt에서 inflate 하여 사용

    • 커스텀 Toast + 광고 배너 표시 역할




XML 기반 설정 리소스



  • app/src/main/res/xml/root_preferences.xml

    • SettingsActivity2.ktPreferenceFragmentCompat에서 사용

    • kakao_use_ty, monthlydate, alarmTime 설정 항목 관리




정리 후보



  • app/src/main/res/layout/activity_setting.xml

    • 현재 코드/Manifest 기준 직접 사용 흔적이 없어 보이는 잔존 XML

    • 추후 실제 참조 여부를 다시 확인한 뒤 삭제 후보로 관리




2. 당시 기준 Compose 전환 방향


1단계: 로그인 권한 안내 XML 제거



  • notify_setting.xml 기반 다이얼로그를 Compose AlertDialog로 전환

  • LoginActivity.kt 내부에서 ViewBinding 없이 이미지와 버튼을 Compose로 직접 구성

  • 로그인 화면을 Compose 흐름으로 더 일관되게 정리


2단계: 설정 화면 XML 의존 축소



  • 현재 SettingsActivity2.kt + settings_activity.xml + root_preferences.xml 조합을 우선 유지하면서 동작을 정리

  • 이후 presentation/composes/SettingScreen.kt 쪽으로 설정 UI를 점진적으로 이동

  • 최종적으로는 설정 값 변경, 저장, 요약 표시를 Compose 화면에서 직접 처리하는 방향 검토


3단계: 커스텀 Toast 구조 개선



  • view_toast.xml 기반 커스텀 Toast 사용 범위를 재검토

  • 단순 안내 메시지는 Compose Snackbar 또는 화면 내 상태 기반 메시지로 대체 검토

  • 광고가 포함된 토스트는 사용자 경험과 정책 관점에서 별도 UI 방식으로 재설계하는 것이 더 안전함


4단계: 미사용 XML 정리



  • activity_setting.xml처럼 현재 직접 사용되지 않는 XML은 실제 참조 여부를 다시 확인 후 제거

  • XML 제거 시 함께 정리 가능한 문자열/리소스도 같이 점검


3. 전환 시 주의사항



  • 기존 SharedPreferences 키(kakao_use_ty, monthlydate, alarmTime)는 그대로 유지하는 방향이 안전함

  • 설정 화면 전환 시 현재 SettingScreen.kt에서 수행하는 알림 재예약(DailyReminderScheduler.schedule(...)) 동작이 동일하게 유지되어야 함

  • 로그인/오류 안내 UI처럼 기존 헬퍼를 제거하는 경우에도 실제 사용자 피드백 흐름은 유지되어야 함

  • Compose 전환은 한 번에 전체 변경보다, 로그인 안내 → 설정 화면 → 커스텀 토스트 순으로 점진 전환하는 방식이 안전함


4. 메모



  • 메인 화면 흐름은 Compose 중심으로 정리되었고, 지원 UI에 남아 있던 XML 의존도도 단계적으로 제거하는 방향으로 진행했다.

  • 따라서 이후 구조 개선 작업은 “남아 있는 레거시 UI/호환성 코드 정리”를 목표로 잡고 점진적으로 진행하는 것이 적절하다.


5. 다음 작업 TODO



  • LoginActivity.ktNotifySettingBinding 기반 권한 안내 다이얼로그를 Compose AlertDialog로 전환

  • notify_setting.xml 제거 후 권한 안내 UI가 기존과 동일하게 동작하는지 확인

  • SettingsActivity2.kt + settings_activity.xml + root_preferences.xml 구조를 SettingScreen.kt 중심으로 통합할 수 있는지 설계 정리

  • 설정 화면 전환 시 kakao_use_ty, monthlydate, alarmTime 저장 키를 그대로 유지하도록 검토

  • 설정 저장 이후 DailyReminderScheduler.schedule(...) 재호출 흐름이 Compose 설정 화면에서도 동일하게 유지되도록 점검

  • core/kakao/kakaoToast.ktview_toast.xml 사용 부분을 정리하고 로그인 오류 안내를 기본 Toast로 단순화

  • 광고가 포함된 커스텀 Toast는 정책/UX 측면에서 별도 UI로 둘 필요가 있는지 검토 후 제거

  • activity_setting.xml의 실제 참조 여부를 최종 확인한 뒤 삭제 여부 결정

  • XML 제거 시 함께 정리 가능한 문자열, drawable, binding 참조도 같이 점검


6. 추가 진행 내용


커스텀 Toast / XML 정리



  • LoginActivity.kt에서 카카오 로그인 실패 안내를 kakaoToast.makeToast(...) 대신 기본 Toast.makeText(...)로 변경했다.

  • 더 이상 사용되지 않는 core/kakao/kakaoToast.kt를 제거했다.

  • 마지막으로 남아 있던 레이아웃 리소스 res/layout/view_toast.xml를 삭제했다.

  • 정리 후 프로젝트 내 view_toast, kakaoToast, SettingsActivity2, root_preferences, activity_setting 참조가 남아 있지 않음을 다시 확인했다.


문서 최신화 메모



  • AGENTS.md의 구조 설명도 현재 상태에 맞게 수정했다.

  • 설정 관련 진입점은 SettingsActivity2.kt 기준 설명에서 presentation/composes/SettingScreen.kt 기준 설명으로 정리했다.

  • 로그인 오류 안내는 제거된 kakaoToast.kt 대신 LoginActivity.kt의 기본 Toast 흐름을 따라가면 되도록 문서를 맞췄다.


7. 일일 알림 후속 보완


보완 배경



  • 기존 일일 알림은 DailyReminderScheduler.kt에서 오늘 날짜의 withdrawList만 조회하고 있었다.

  • 따라서 월 반복 데이터가 withdrawMonthly에만 저장되어 있고, 사용자가 별도로 월 반복 적용을 실행하지 않은 경우에는 오늘 대상이 있어도 알림이 누락될 수 있는 구조였다.


보완 내용



  • core/DailyReminderScheduler.kt 수정

    • 알림 시점마다 현재 한국 시간 기준 오늘 날짜를 계산하도록 정리했다.

    • 알림 판단 전에 withdrawMonthly에서 오늘 일자와 일치하는 항목을 읽어오도록 보완했다.

    • 해당 항목이 오늘 withdrawList에 아직 없으면 자동으로 withdrawList에 반영한 뒤, 기존 일일 알림 요약 흐름을 그대로 재사용하도록 연결했다.

    • 알림 본문은 건수/합계 외에 remark 일부가 함께 보이도록 BigText 내용을 보강했다.



  • data/dbHandler/DBHandler.kt 수정

    • withdrawMonthly에서 오늘 일자에 해당하는 항목만 읽을 수 있도록 selectWithDrawMonthlyByDay(...) 조회 메서드를 추가했다.




확인 결과



  • 이제 매일 설정된 알림 시간에 실행될 때 withdrawMonthly의 오늘 대상 항목도 실제 알림 판단 경로에 포함된다.

  • withdrawList에 이미 같은 항목이 있는 경우에는 중복 저장을 피하도록 chkWithDraw(...) 검사를 유지했다.

  • 수정 후 :app:assembleDebug 빌드 성공을 확인했다.


2026-04-07 작업 이력


작업 개요


오늘은 알림 관련 권한을 알림 수집알림 표시로 분리해서 다시 정리하고,
ComposeMainActivitySettingScreen에서 현재 상태를 바로 확인하고 설정할 수 있도록 보완했다.


1. 알림 권한 구조 정리


작업 내용



  • 기존에는 메인 진입 시 권한 체크가 Notification Listener 중심으로만 해석될 수 있는 구조였다.

  • 이번에는 권한을 아래 3가지 상태로 분리했다.

    • 알림 수집 권한 : Notification Listener 허용 여부

    • 알림 표시 권한 : Android 13+ POST_NOTIFICATIONS 허용 여부

    • 앱 알림 사용 : 시스템에서 앱 알림 자체가 차단되었는지 여부



  • DailyReminderScheduler.getStatusSnapshot(...)도 같은 기준으로 상태를 반환하도록 확장했다.


2. ComposeMainActivity 권한 안내 개선


작업 내용



  • 알림 권한 확인 책임을 로그인 화면이 아닌 ComposeMainActivity.kt에 두도록 정리했다.

  • 메인 진입/복귀 시점(onResume)마다 현재 권한 상태를 다시 평가하도록 변경했다.

  • 통합 권한 안내 다이얼로그를 추가하여 부족한 권한별로 바로 처리할 수 있게 했다.

    • 알림 수집 권한이 없으면 알림 접근 설정 이동

    • 알림 표시 권한이 없으면 POST_NOTIFICATIONS 런타임 요청

    • 앱 알림이 꺼져 있으면 앱 알림 설정 이동



  • 관련 안내 문구를 values/strings.xml, values-ko/strings.xml에 추가했다.


3. SettingScreen 상태 표시 확장


작업 내용



  • 설정 화면의 일일 알림 상태 카드에서 기존 단일 알림 권한 표기를 세분화했다.

  • 현재는 아래 항목을 각각 확인할 수 있다.

    • 선택된 알림 시간

    • 알림 수집 권한

    • 알림 표시 권한

    • 앱 알림 사용

    • 정확 알람 사용 여부

    • 마지막 예약/실행/표시 시간

    • 최종 상태



  • 설정 화면에서도 바로 권한 조치를 할 수 있도록 버튼을 연결했다.

    • 알림 접근 설정

    • 알림 권한 요청

    • 앱 알림 설정




4. 수정 파일



  • app/src/main/java/com/nari/notify2kakao/ComposeMainActivity.kt

  • app/src/main/java/com/nari/notify2kakao/presentation/composes/SettingScreen.kt

  • app/src/main/java/com/nari/notify2kakao/core/DailyReminderScheduler.kt

  • app/src/main/res/values/strings.xml

  • app/src/main/res/values-ko/strings.xml


5. 검증 결과



  • 수정 후 :app:compileDebugKotlin 빌드 성공을 확인했다.

  • 이제 메인 화면과 설정 화면 모두에서 현재 권한 부족 상태를 같은 기준으로 확인할 수 있다.

  • 일일 알림 표시 가능 여부도 설정 화면에서 더 명확하게 확인할 수 있게 되었다.# 2026-04-02 작업 이력


작업 개요


오늘은 AGENTS.md 정리와 일일 알림 기능 점검/보완 작업을 진행했다.
주요 목표는 AI 에이전트 문서의 한국어 가독성을 높이고, 앱이 실행 중이 아니어도 매일 지정된 시간에 알림 대상이 있는지 확인하여 알림을 노출하도록 만드는 것이었다.


1. AGENTS.md 정리


작업 내용



  • 기존 루트 AGENTS.md를 기준으로 코드 구조를 다시 확인했다.

  • 프로젝트 특성에 맞는 한국어 메모를 각 섹션 아래에 보강했다.

  • 하단에 추가된 한국어 설명 문장을 Markdown 형식으로 정리했다.

  • ## 한국어 요약 메모 섹션을 추가하고, 항목별로 ### 제목과 불릿 목록으로 정돈했다.


정리한 주요 항목



  • Compose

  • Hilt

  • Room Database 미사용(raw SQLite 사용)

  • AI / Cloud Function 호출 흐름

  • API / 외부 연동

  • 알림 / 수집 흐름

  • WorkManager / 백그라운드

  • 테스트 현황

  • 작업 시 주의점


2. 일일 알림 기능 점검 및 구현


기존 구조 확인 결과



  • 설정 화면에는 alarmTime 선택 기능이 이미 존재했다.

  • 기존 알림 로직은 SettingsActivity2.kt + WorkDefLib.kt 중심의 WorkManager 흐름이었다.

  • 하지만 이 구조는 사용자가 선택한 시각에 매일 정확하게 체크하는 방식으로 보기 어려웠고,
    앱 미실행 상태나 재부팅 이후까지 안정적으로 유지되는 구조도 부족했다.

  • 또한 오늘 실제 알림 대상이 없더라도 알림이 발생할 가능성이 있었다.


구현/수정 내용



  • core/DailyReminderScheduler.kt 신규 추가

    • AlarmManager 기반으로 다음 일일 알림 시간을 예약하도록 구성

    • 저장된 alarmTime 값을 기준으로 다음 실행 시각 계산

    • 오늘 대상 데이터가 있을 때만 알림 노출



  • core/DailyReminderReceiver.kt 신규 추가

    • 일일 알림 브로드캐스트 수신

    • 부팅 완료, 앱 업데이트, 시간 변경, 타임존 변경 시 재예약 처리



  • AndroidManifest.xml 수정

    • RECEIVE_BOOT_COMPLETED 권한 추가

    • DailyReminderReceiver 등록



  • presentation/option/SettingsActivity2.kt 수정

    • 기존 WorkManager 지연 계산 로직 대신 새 스케줄러 호출로 단순화



  • presentation/composes/SettingScreen.kt 수정

    • 설정 저장 시 alarmTime 변경값으로 즉시 재예약되도록 반영



  • ComposeMainActivity.kt 수정

    • 앱 재진입 시 저장된 설정 기준으로 알림 예약이 동기화되도록 처리



  • core/WorkDefLib.kt 수정

    • 기존 반복 예약 대신 새 스케줄러 호출 중심으로 단순화



  • 문자열 리소스 추가

    • 일일 알림 채널명, 제목, 본문 문구 추가

    • values-ko/strings.xml에도 한국어 번역 반영




3. 알림 동작 기준



  • 매일 사용자가 설정한 시각에 체크하도록 예약

  • 오늘 날짜 기준으로 달력/출금 대상 데이터가 있는지 조회

  • 대상이 있을 때만 시스템 알림 표시

  • 알림 클릭 시 ComposeMainActivity로 진입하도록 구성

  • 앱이 꺼져 있어도, 부팅/시간 변경 이후 다시 예약되도록 구성


4. 검증 결과


코드/구조 점검



  • 설정 저장 경로와 알림 예약 경로가 연결되어 있는지 확인했다.

  • 클릭 시 메인 화면 진입 흐름이 연결되어 있는지 확인했다.

  • 재부팅/시간 변경 시 재예약되도록 매니페스트와 리시버 등록을 반영했다.


빌드 확인


아래 빌드를 직접 확인했다.



  • :app:compileDebugKotlin 성공

  • :app:assembleDebug 성공


5. 오늘 작업한 주요 파일



  • AGENTS.md

  • app/src/main/AndroidManifest.xml

  • app/src/main/java/com/nari/notify2kakao/core/DailyReminderScheduler.kt

  • app/src/main/java/com/nari/notify2kakao/core/DailyReminderReceiver.kt

  • app/src/main/java/com/nari/notify2kakao/core/WorkDefLib.kt

  • app/src/main/java/com/nari/notify2kakao/presentation/option/SettingsActivity2.kt

  • app/src/main/java/com/nari/notify2kakao/presentation/composes/SettingScreen.kt

  • app/src/main/java/com/nari/notify2kakao/ComposeMainActivity.kt

  • app/src/main/res/values/strings.xml

  • app/src/main/res/values-ko/strings.xml


6. 메모



  • 현재 구현은 앱 미실행 상태에서도 일일 체크가 가능하도록 보완한 상태다.

  • 실제 기기에서는 제조사 배터리 정책이나 정확한 알람 정책(Android 12+)에 따라 시각 오차가 일부 발생할 수 있으므로 추후 실기기 확인이 필요하다.

  • 필요 시 다음 단계로 알림 클릭 시 특정 화면/탭으로 직접 이동하는 개선도 가능하다.


2026-04-03 작업 이력


작업 개요


오늘은 layoutVersion 제거 이후 현재 프로젝트에 남아 있는 XML UI 사용 지점을 다시 정리하고,
향후 Compose 중심 구조로 전환하기 위한 계획을 정리했다.



2026-04-03 추가 반영: 이후 후속 정리를 진행하면서 SettingsActivity2.kt, settings_activity.xml, root_preferences.xml, activity_setting.xml, core/kakao/kakaoToast.kt, view_toast.xml까지 모두 제거되었고, 관련 TODO도 완료 처리했다.



1. 당시 기준 XML 사용 지점 정리


실제 사용 중인 layout



  • app/src/main/res/layout/settings_activity.xml

    • presentation/option/SettingsActivity2.kt에서 setContentView(...)로 사용

    • 설정용 PreferenceFragmentCompat를 담는 컨테이너 역할



  • app/src/main/res/layout/notify_setting.xml

    • LoginActivity.kt에서 NotifySettingBinding으로 사용

    • 알림 권한 안내 다이얼로그 내부 이미지 영역



  • app/src/main/res/layout/view_toast.xml

    • core/kakao/kakaoToast.kt에서 inflate 하여 사용

    • 커스텀 Toast + 광고 배너 표시 역할




XML 기반 설정 리소스



  • app/src/main/res/xml/root_preferences.xml

    • SettingsActivity2.ktPreferenceFragmentCompat에서 사용

    • kakao_use_ty, monthlydate, alarmTime 설정 항목 관리




정리 후보



  • app/src/main/res/layout/activity_setting.xml

    • 현재 코드/Manifest 기준 직접 사용 흔적이 없어 보이는 잔존 XML

    • 추후 실제 참조 여부를 다시 확인한 뒤 삭제 후보로 관리




2. 당시 기준 Compose 전환 방향


1단계: 로그인 권한 안내 XML 제거



  • notify_setting.xml 기반 다이얼로그를 Compose AlertDialog로 전환

  • LoginActivity.kt 내부에서 ViewBinding 없이 이미지와 버튼을 Compose로 직접 구성

  • 로그인 화면을 Compose 흐름으로 더 일관되게 정리


2단계: 설정 화면 XML 의존 축소



  • 현재 SettingsActivity2.kt + settings_activity.xml + root_preferences.xml 조합을 우선 유지하면서 동작을 정리

  • 이후 presentation/composes/SettingScreen.kt 쪽으로 설정 UI를 점진적으로 이동

  • 최종적으로는 설정 값 변경, 저장, 요약 표시를 Compose 화면에서 직접 처리하는 방향 검토


3단계: 커스텀 Toast 구조 개선



  • view_toast.xml 기반 커스텀 Toast 사용 범위를 재검토

  • 단순 안내 메시지는 Compose Snackbar 또는 화면 내 상태 기반 메시지로 대체 검토

  • 광고가 포함된 토스트는 사용자 경험과 정책 관점에서 별도 UI 방식으로 재설계하는 것이 더 안전함


4단계: 미사용 XML 정리



  • activity_setting.xml처럼 현재 직접 사용되지 않는 XML은 실제 참조 여부를 다시 확인 후 제거

  • XML 제거 시 함께 정리 가능한 문자열/리소스도 같이 점검


3. 전환 시 주의사항



  • 기존 SharedPreferences 키(kakao_use_ty, monthlydate, alarmTime)는 그대로 유지하는 방향이 안전함

  • 설정 화면 전환 시 현재 SettingScreen.kt에서 수행하는 알림 재예약(DailyReminderScheduler.schedule(...)) 동작이 동일하게 유지되어야 함

  • 로그인/오류 안내 UI처럼 기존 헬퍼를 제거하는 경우에도 실제 사용자 피드백 흐름은 유지되어야 함

  • Compose 전환은 한 번에 전체 변경보다, 로그인 안내 → 설정 화면 → 커스텀 토스트 순으로 점진 전환하는 방식이 안전함


4. 메모



  • 메인 화면 흐름은 Compose 중심으로 정리되었고, 지원 UI에 남아 있던 XML 의존도도 단계적으로 제거하는 방향으로 진행했다.

  • 따라서 이후 구조 개선 작업은 “남아 있는 레거시 UI/호환성 코드 정리”를 목표로 잡고 점진적으로 진행하는 것이 적절하다.


5. 다음 작업 TODO



  • LoginActivity.ktNotifySettingBinding 기반 권한 안내 다이얼로그를 Compose AlertDialog로 전환

  • notify_setting.xml 제거 후 권한 안내 UI가 기존과 동일하게 동작하는지 확인

  • SettingsActivity2.kt + settings_activity.xml + root_preferences.xml 구조를 SettingScreen.kt 중심으로 통합할 수 있는지 설계 정리

  • 설정 화면 전환 시 kakao_use_ty, monthlydate, alarmTime 저장 키를 그대로 유지하도록 검토

  • 설정 저장 이후 DailyReminderScheduler.schedule(...) 재호출 흐름이 Compose 설정 화면에서도 동일하게 유지되도록 점검

  • core/kakao/kakaoToast.ktview_toast.xml 사용 부분을 정리하고 로그인 오류 안내를 기본 Toast로 단순화

  • 광고가 포함된 커스텀 Toast는 정책/UX 측면에서 별도 UI로 둘 필요가 있는지 검토 후 제거

  • activity_setting.xml의 실제 참조 여부를 최종 확인한 뒤 삭제 여부 결정

  • XML 제거 시 함께 정리 가능한 문자열, drawable, binding 참조도 같이 점검


6. 추가 진행 내용


커스텀 Toast / XML 정리



  • LoginActivity.kt에서 카카오 로그인 실패 안내를 kakaoToast.makeToast(...) 대신 기본 Toast.makeText(...)로 변경했다.

  • 더 이상 사용되지 않는 core/kakao/kakaoToast.kt를 제거했다.

  • 마지막으로 남아 있던 레이아웃 리소스 res/layout/view_toast.xml를 삭제했다.

  • 정리 후 프로젝트 내 view_toast, kakaoToast, SettingsActivity2, root_preferences, activity_setting 참조가 남아 있지 않음을 다시 확인했다.


문서 최신화 메모



  • AGENTS.md의 구조 설명도 현재 상태에 맞게 수정했다.

  • 설정 관련 진입점은 SettingsActivity2.kt 기준 설명에서 presentation/composes/SettingScreen.kt 기준 설명으로 정리했다.

  • 로그인 오류 안내는 제거된 kakaoToast.kt 대신 LoginActivity.kt의 기본 Toast 흐름을 따라가면 되도록 문서를 맞췄다.


7. 일일 알림 후속 보완


보완 배경



  • 기존 일일 알림은 DailyReminderScheduler.kt에서 오늘 날짜의 withdrawList만 조회하고 있었다.

  • 따라서 월 반복 데이터가 withdrawMonthly에만 저장되어 있고, 사용자가 별도로 월 반복 적용을 실행하지 않은 경우에는 오늘 대상이 있어도 알림이 누락될 수 있는 구조였다.


보완 내용



  • core/DailyReminderScheduler.kt 수정

    • 알림 시점마다 현재 한국 시간 기준 오늘 날짜를 계산하도록 정리했다.

    • 알림 판단 전에 withdrawMonthly에서 오늘 일자와 일치하는 항목을 읽어오도록 보완했다.

    • 해당 항목이 오늘 withdrawList에 아직 없으면 자동으로 withdrawList에 반영한 뒤, 기존 일일 알림 요약 흐름을 그대로 재사용하도록 연결했다.

    • 알림 본문은 건수/합계 외에 remark 일부가 함께 보이도록 BigText 내용을 보강했다.



  • data/dbHandler/DBHandler.kt 수정

    • withdrawMonthly에서 오늘 일자에 해당하는 항목만 읽을 수 있도록 selectWithDrawMonthlyByDay(...) 조회 메서드를 추가했다.




확인 결과



  • 이제 매일 설정된 알림 시간에 실행될 때 withdrawMonthly의 오늘 대상 항목도 실제 알림 판단 경로에 포함된다.

  • withdrawList에 이미 같은 항목이 있는 경우에는 중복 저장을 피하도록 chkWithDraw(...) 검사를 유지했다.

  • 수정 후 :app:assembleDebug 빌드 성공을 확인했다.


2026-04-07 작업 이력


작업 개요


오늘은 알림 관련 권한을 알림 수집알림 표시로 분리해서 다시 정리하고,
ComposeMainActivitySettingScreen에서 현재 상태를 바로 확인하고 설정할 수 있도록 보완했다.


1. 알림 권한 구조 정리


작업 내용



  • 기존에는 메인 진입 시 권한 체크가 Notification Listener 중심으로만 해석될 수 있는 구조였다.

  • 이번에는 권한을 아래 3가지 상태로 분리했다.

    • 알림 수집 권한 : Notification Listener 허용 여부

    • 알림 표시 권한 : Android 13+ POST_NOTIFICATIONS 허용 여부

    • 앱 알림 사용 : 시스템에서 앱 알림 자체가 차단되었는지 여부



  • DailyReminderScheduler.getStatusSnapshot(...)도 같은 기준으로 상태를 반환하도록 확장했다.


2. ComposeMainActivity 권한 안내 개선


작업 내용



  • 알림 권한 확인 책임을 로그인 화면이 아닌 ComposeMainActivity.kt에 두도록 정리했다.

  • 메인 진입/복귀 시점(onResume)마다 현재 권한 상태를 다시 평가하도록 변경했다.

  • 통합 권한 안내 다이얼로그를 추가하여 부족한 권한별로 바로 처리할 수 있게 했다.

    • 알림 수집 권한이 없으면 알림 접근 설정 이동

    • 알림 표시 권한이 없으면 POST_NOTIFICATIONS 런타임 요청

    • 앱 알림이 꺼져 있으면 앱 알림 설정 이동



  • 관련 안내 문구를 values/strings.xml, values-ko/strings.xml에 추가했다.


3. SettingScreen 상태 표시 확장


작업 내용



  • 설정 화면의 일일 알림 상태 카드에서 기존 단일 알림 권한 표기를 세분화했다.

  • 현재는 아래 항목을 각각 확인할 수 있다.

    • 선택된 알림 시간

    • 알림 수집 권한

    • 알림 표시 권한

    • 앱 알림 사용

    • 정확 알람 사용 여부

    • 마지막 예약/실행/표시 시간

    • 최종 상태



  • 설정 화면에서도 바로 권한 조치를 할 수 있도록 버튼을 연결했다.

    • 알림 접근 설정

    • 알림 권한 요청

    • 앱 알림 설정




4. 수정 파일



  • app/src/main/java/com/nari/notify2kakao/ComposeMainActivity.kt

  • app/src/main/java/com/nari/notify2kakao/presentation/composes/SettingScreen.kt

  • app/src/main/java/com/nari/notify2kakao/core/DailyReminderScheduler.kt

  • app/src/main/res/values/strings.xml

  • app/src/main/res/values-ko/strings.xml


5. 검증 결과



  • 수정 후 :app:compileDebugKotlin 빌드 성공을 확인했다.

  • 이제 메인 화면과 설정 화면 모두에서 현재 권한 부족 상태를 같은 기준으로 확인할 수 있다.

  • 일일 알림 표시 가능 여부도 설정 화면에서 더 명확하게 확인할 수 있게 되었다.





오늘의 이야기


#스하리1000명프로젝트,
迷失在韓國?即使您不會說韓語,這個應用程式也可以幫助您輕鬆出行。
只需說出您的語言即可 - 它會翻譯、搜尋並以您的語言顯示結果。
非常適合旅行者!支援英語、日語、中文、越南語等10多種語言。
現在就試試吧!
https://play.google.com/store/apps/details?id=com.billcoreatech.opdgang1127




2026/05/14

오늘의 이야기



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

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

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

그것도 구글 Gemini로다가!

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

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

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


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




오늘의 이야기


#스하리1000명프로젝트

오늘 내가 만든앱 하나 알려주고 싶어, 이 앱은 알림수집기 라고 이름을 붙였는 데,
내 폰에 표시 되는 알림을 읽어서 내가 지정한 단어가 들어 있고, 지출기록을 남겨야 하는 알림이
있으면 수집하고, 카카오톡으로 친구에게 전달해 주는 기능을 구현해 줄꺼야. 📲

이번 패치에서는 하루 한번 지정한 시간에 나에게 알림(노티) 하도록 기능을 추가 했어. 🙏
한번 써보고 불편한 거 있으면 말해줘.

앱 바로가기
👉 https://play.google.com/store/apps/details?id=com.nari.notify2kakao





오늘의 이야기


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




오늘의 이야기


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

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




오늘의 이야기

앱 설명서



이 앱은 

이 앱은 타로카드 이미지를 AI 을 통해 한복을 입은 모습을 그리다 보니, 생각 나서 타로 카드 선택을 통해, 마음의 평화(?) 필요한 분 들에게 대나무숲(전래 동화에 나오는)이 되어 드리고자 합니다.


 


이 앱에서 작성 되는 내용은 타인에게 공유 되지 않습니다.  다만, 타로 카드와 사용자의 입력을 조합해 사용자에게 응답을 주기 위해 Groq API 호출을 이용해 글을 구성하기 위해서만 제공 되며, 앱 시작시 사전 동의를 구하고 있습니다. 


 


동의 는 사용 중에도 철회할 수 있으며, 그 즉시 앱이 종료 됩니다. 


 


데이터 수집 동의 화면



 


앱은 사용은 

오늘의 타로 카드 선택 하기
1, 3장 타로 선택하기 
타로 프롬프트 
최근 기록 

** 오늘의 타로는 1장의 타로 카드와 사용자의 질문(?)을 조합해 사용자 에게 응답을 제공 합니다.   선택 되는 타로 카드에 따라 다른 응답이 제공 됩니다. 


타로 카드 선택



 


타로 카드는 선택하기는 오늘의 카드, 스레드 중에서 1장, 3장 뽑기를 선택할 수 있습니다.  카드는 원형으로 펼쳐진 78장의 이미지 에서 선택하시면 됩니다. 카드는 랜덤으로 배치 되기 때문에 뽑을 때 마다 다른 카드가 선택 됩니다. 


 


"선택 완료" 를 클릭 하면 다음 화면에서 선택한 카드 이름을 보여 줍니다.  다른 "리딩 결과 보기" 를 클릭 하면  다음 화면으로 이동하면서 리딩 결과를 볼 수 있습니다. 


 


상담 입력 으로 이동 

 


상담 입력 화면



상담입력에서는 이전 화면에서 제시된 글들을 보고 나의 마음을 정리하는 시간을 가지는 공간 입니다. 여기서 입력된 기록은 두고 두고 볼 수 있습니다. 


 


다음 화면으로 이동은 홈으로 돌아가기,  방금 저장한 저널 보기 등으로 구분해 이동할 수 있습니다.


 


전체 보기 (홈 화면에서 기록 전체 보기)

저널 보기



홈 화면에서 "전체보기" 을 클릭하면 저널 목록으로 이동 하고 항목 중에서 하나를 클릭 하면 상세 화면으로 이동 합니다.  


저널 상세에서 지난 이야기의 내용을 확인해 볼 수 있습니다. 


 


다음 이야기 

 


이 앱의 기능은 다른 부분으로 개선 될 수 있습니다. 개선이 발생하는 경우는 사전 공지가 없을 수 있으므로 양해를 부탁 드립니다. 


이 앱에서 작성되는 내용에 타인과 공유는 되지 않음으로 내 마음의 기록을 남기는 작은 공간으로 활용 하시길 바랍니다. 





오늘의 이야기

#스치니1000프로젝트 #재미 #행운기원 #Compose #Firebase 🎯 야 너 토요일마다 로또 확인하냐? 나도 맨날 “혹시나~” 하면서 봤거든 ㅋㅋ 근데 이제는 그냥 안 해 AI한테 맡겼어 🤖✨ 그것도 구글 Gemini로다가! ...