2026/03/24

오늘의 이야기

이번주는 유난히도 날씨가 오락 가락 하는 한 주였던 거 같습니다.  오늘은 비가 무진장 내린 후 바다를 바라보다가 저 멀리 보길도 끝 무렵의 섬들이 보이는 것을 알게 되어  갤럭시 23 울트라의  줌 사진 비교를 한 번 올려 볼까 합니다.


 


1배

1배



 


30배 줌 

30배



 


70배

70배



 


100 배 중

100배



 


1배 기본 사진에서 이 섬을 찾아 보세요... 보이시나요?   그 옆으로 보이는 섬들이 보길도 등등의 섬들이지 않을까 싶습니다.  100배 줌으로 보이는 섬은 대관탈도라는 섬으로 인식되기는 합니다.   제주에서 추자도를 바라보면 중간에  있는 섬입니다.  대략 거래는 30Km 정도 되는 것으로 보이는데 이 정도의 Zoom이라면... 어떨까요?


 


날이 이제 가을로 넘어 갈 듯합니다. 아직도 덥기는 하지만요...  행복한 주말 보내세요.






오늘의 이야기

오늘은 새로운 댓글이 달리는 것들을 하나씩 열어 보는데 힘들어하는 나를 위해서 앱을 하나 구현해 볼까 합니다.   최종적으로는 댓글에 대한 답글로 자동화해 보는 것이 바람입니다. ㅋ~  (이런 건 그다지 좋아라 하지 않으시기는 하던데 뭐...)


 


댓글 달기가 본업(?)이 아닌지라... python  으로는 여러 가지 공부를 해 보기는 했으나, 이번에 kotlin 코드를 작성해 보았습니다. 


 


그래 들 설정 추가 하기


// jsoup
implementation 'org.jsoup:jsoup:1.16.1'


python에서 사용했던 Betifulsoup 가 비슷한 라이브러리가 있음을 알게 되었습니다. 저걸 build gradle 파일에 추가합니다. 


 



// coroutines
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.7.3'
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.7.3"


이것들은 async 처리를 하기 위해서는 필요합니다. async 보다는 android 가 UI 가 활성화 되어 있는 경우 처리 지연이 발생하는 것을 그다지 좋게 보지 않기 때문에 지연처리를 할 수 있도록 한다고 보는 것이 이해가 쉬울 듯합니다. 


 


이전 게시글 (파이썬으로 댓글 답 달기)

다음은 새 댓글을 읽어오는 부분을 구현해 보아야 하는데, 이전 글 하나를 잠깐 보고 오겠습니다. 


https://billcorea.tistory.com/100



 


파이썬 으로 따라하는 자동화 스크립트 : 댓글에 답글 달기


오호라... 피트에 있는 글들에 글을 달기 시작했더니, 방문해 주시고 댓글도 달아주시고... 감사 감사... 이런걸 말로만 해서는 안되고 댓글에 또한 댓글로 인사를 해야 할 것 같앗 티스토리 API 을


billcorea.tistory.com




python  으로 게시물 댓글에 자동 답글을 다는 이야기를 적었던 부분인데, 예전에 기술했던 글이라 정리가 좀 미흡해 보이기는 합니다.   이제 필요한 것은  accessToken을 얻어야 하는 데, 이 부분이 번거로운 부분이 될 듯합니다.  그 이야기는 뒤에 다시 해 보도록 하겠습니다. 


 


tistory API 인증 알아보기

accessToken 을 받기 위해서는 인증을 거쳐야 합니다.  저 python 예시 나와 있는 이런저런 코드에 대한 설명이 부족하여 보기는 힘들어 보이지만.


 


https://tistory.github.io/document-tistory-apis/auth/authorization_code.html



 


Authorization Code 방식 · GitBook


No results matching ""


tistory.github.io




 


그전에 앱 등록을 해야 합니다. https://www.tistory.com/guide/api/manage/register 에서 아래 그림과 같이 나오면 등록을 해 줍니다.



등록예시



이렇게 등록해 주면 App ID, Secret Key을 얻게 됩니다. 


 


먼저 아래 URL 을 만들어 크롬이나, 에지 등에서 검색을 해 봅니다.


https://www.tistory.com/oauth/authorize?client_id=&redirect_uri={1}&response_type=code&state=someValue

여기서  {0} 에는 app ID 값으로 치환하고,  {1}는 위에 등록한 callback 주소를 입력하면 됩니다.  잘 입력을 했다면 아래 그림처럼 권한 허가를 요구하는 페이지가 보일 겁니다.




 


잘 되었다면 아래 그림과 같이 다음 페이지로 돌아 옵니다. 이때 URL에 표시된 내용들 중에 code= 뒤에 따라오는 숫자를 복사해 두어야 합니다.


code 얻기



 


다음은 아래 코드와 같이 url 을 조립해야 합니다.


https://www.tistory.com/oauth/access_token?client_id={0}&client_secret={1}&redirect_uri={2}&code={3}&grant_type=authorization_code

{0} 위에서 처럼 app id 을 넣고 {1] 위에서 확인되는 Secret Key 값을 넣습니다. {2} 에는 callback 주소로 치환하고 {3} 에는 방금 얻어온  code 뒤에 값을 채워 url을 만든 다음 크롬이나 에지 등에 입력하면 accessToken을 얻을 수 있습니다. 


 


새로운 댓글 목록 받아 오기

이제 API 가이드를 보면서 댓글 목록을 받아 오겠습니다. REST API 을 호출하도록 하고 있어서 저는 retrofit을 이용해서 해 보고자 합니다.


 



// retrofit
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'


 


gradle 파일에 최근 버전으로 추가 했습니다.  그리고 API 호출을 위해서 코드 하나를 작성했습니다. 


 


import com.google.gson.Gson
import com.google.gson.GsonBuilder
import okhttp3.OkHttpClient
import okhttp3.ResponseBody
import retrofit2.Call
import retrofit2.Converter
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import retrofit2.http.GET
import retrofit2.http.Headers
import retrofit2.http.Query
import java.lang.reflect.Type

interface RetrofitAPI {

@Headers("Content-Type: application/json;charset=UTF-8")
@GET("comment/newest")
fun doGetNewest(
@Query("access_token") accessToken : String,
@Query("output") output : String,
@Query("blogName") blogName : String,
@Query("page") page : Int,
@Query("count") count : Int,
): Call<NewestResponseMain>

companion object {
private const val baseURL = "https://www.tistory.com/apis/"
private val client = OkHttpClient.Builder().build()
private val gson : Gson = GsonBuilder().setLenient().create()

private val nullOnEmptyConverterFactory = object : Converter.Factory() {
fun converterFactory() = this
override fun responseBodyConverter(type: Type, annotations: Array<out Annotation>, retrofit: Retrofit) = object :
Converter<ResponseBody, Any?> {
val nextResponseBodyConverter = retrofit.nextResponseBodyConverter<Any?>(converterFactory(), type, annotations)
override fun convert(value: ResponseBody) = if (value.contentLength() != 0L) {
try{
nextResponseBodyConverter.convert(value)
}catch (e:Exception){
e.printStackTrace()
null
}
} else{
null
}
}
}

fun create(): RetrofitAPI {
return Retrofit.Builder()
.baseUrl(baseURL)
.addConverterFactory(nullOnEmptyConverterFactory)
.addConverterFactory(GsonConverterFactory.create(gson))
.client(client)
.build()
.create(RetrofitAPI::class.java)
}

}

}

그리고 데이터를 받아올 구조체 하나가 필요 합니다.  그래서 다음과 같이 만들었습니다.


 



data class NewestResponse(
val id : String, // 댓글 ID
val date : String, // 댓글 작성시간 timeStamp
val postId : String, // 작성된글 ID
val name : String, // 작성자
val homepage : String, // 작성자 홈페이지 주소
val comment : String, // 댓글 내용
val open : String, // Y 공개, N 비공개
val link : String,
)

data class NewestResponseMain(
val tistory : NewestItem
)

data class NewestItem(
val item : NewestComments
)

data class NewestComments(
val url : String,
val secondaryUrl : String,
val comments : ArrayList<NewestResponse>
)


실제 호출에서는 NewestResponseMain 을 이용합니다. 사유는 API 가이드를 보면 json 응답 모양을 보고 만들었습니다.


아래 응답 예시를 보면 tistory 를 큰 block으로 해서 item 아래 comments  아래 comment을 들어가야 세부 목록을 볼 수 있습니다.  그래서 모양은 이렇게 구현했습니다.


응답값 예


{
"tistory":{
"status":"200",
"item":{
"url":"http://oauth.tistory.com",
"secondaryUrl":"",
"comments":{
"comment":[
{
"id":"8176926",
"date":"1303796900",
"postId":"4",
"name":"Tistory API",
"homepage":"http://oauth.tistory.com",
"comment":"비루한 글에 칭찬을 하시니 몸둘바를 모르.. 지 않아!",
"open":"Y"
},
{
"id":"8176923",
"date":"1303796801",
"postId":"4",
"name":"글쎄 요",
"homepage":"http://shesgone.com",
"comment":"제 홈에 와서 구경해보세요^_^",
"open":"N"
},
{
"id":"8176918",
"date":"1303796711",
"postId":"4",
"name":"지나다가",
"homepage":"http://someurl.com",
"comment":"좋은 글 감사합니다.",
"open":"Y"
}
]
}
}
}
}

 


이제 호출을 구현해 보겠습니다. 


 



RetrofitAPI.create().doGetNewest(accessToken = accessToken, output = "json", blogName = "billcorea", page = pageIndex, count = 15)
.enqueue(object : Callback<NewestResponseMain> {
override fun onResponse(
call: Call<NewestResponseMain>,
response: Response<NewestResponseMain>
) {
if (response.code() == responseOk && response.body() != null) {
newests.clear()
for (item in response.body()?.tistory?.item?.comments!!) {
if (item.name != "Billcorea") {
newests.add(item)
}
}
Log.e("", "size = ${newests.size}")
} else {
Toast.makeText(context, context.getString(R.string.msgDoNotData), Toast.LENGTH_SHORT).show()
}
isActivie.value = false
}

override fun onFailure(call: Call<NewestResponseMain>, t: Throwable) {
Toast.makeText(context, context.getString(R.string.msgDoNotData, t.localizedMessage), Toast.LENGTH_SHORT).show()
}
})


 


output 은 json 타입으로 받아서 분석을 할 예정이라 json으로 기술되었으며, blogname 은 우리 블로그 URL의 prefix을 적어 둡니다.  이제 응답이 오면 어떻게 될까요?


 


조회화면



이제 이 앱을 통해서 더 열심히(?) 찾아보도록 하겠습니다.  저기 URL 주소를 클릭하면 해당 블로그의 제일 마지막 게시글을 찾아서 이동합니다. (아직 개발 중이라 안 되는 페이지도 있을 수 있습니다.  블로그 마다 테마 설정에 따라 tag 값들이 달라지기 때문에 안되는 페이지는 하나씩 보완을 해야 할 것 같습니다.)





오늘의 이야기


#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




오늘의 이야기

앱 서명 설정



 


앱의 upload key을 분실했거나, 앱 서명에 문제가 있는 경우 그 조치는 위 설명에 따라 인증서를 다시 생성하여 올려 줍니다. 그리고 기다립니다. 48시간 동안이나 말입니다.  (playstore 의 메뉴 중에서 앱 서명에 들어가시면 보실 수 있습니다.  다만, 개발자 계정의 관리자만 할 수 있습니다. 관리자에게서 권한을 위임 받아도 앱 서명 관리는 수정할 수 없습니다.)


 


그래도 어찌할 수 있는 방법이 없기는 합니다. 기다려 보겠습니다.


 





오늘의 이야기

경고메일



 


이전에 게시했던 앱들 중에서 관리가 소홀한 앱들에 대한 경고 메일을 받았습니다. 이것들을 8.31까지 정리해야 한다고 합니다. 


 


상태정보



결국 playstore 가 요구 하는 게시 기준은 API 33 ( 안드로이드 13) 이상이 되어야 한다는 것입니다.  이제 이전 안드로이드 폰이 얼마나 되는지는 알 수 없으나, 더 이상은 게시를 할 수 없다는 이야기가 될 것 같습니다. 


 


세부사항 요약



 


해결방법 안내



다행히도 기한 연장 요청을 받고 있다고 합니다. 그것도 11월 1일까지 3개월 정도 이기는 하지만 말입니다.   그래서 이번 주 내로 정리해서 API 수준으로 34로 진행해 볼 생각입니다. 


 


다만, android studio 버전이나, gradle 버전에 따라 API 34 을 지정했을 경우 에러 표시가 되는 경우가 있습니다.  이런 때에는 다음과 같이 gradle 파일을 조정해 주시면 됩니다. 


 



android {
compileSdk 34
namespace "com.bil.....511"

defaultConfig {
applicationId "com......p511"
minSdkVersion 26
//noinspection EditedTargetSdkVersion 검사 없음 편집된 대상 Sdk 버전
targetSdkVersion 34
versionCode 2
versionName "1.0.2"

testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}

buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}

viewBinding {
enabled = true
}
}


build 을 하다 보면 이런 메시지가 나오기는 합니다. 


 


AGPBI: {"kind":"warning","text":"We recommend using a newer Android Gradle plugin to use compileSdk = 34\n\nThis Android Gradle plugin (8.1.0) was tested up to compileSdk = 33 (and compileSdkPreview = \"UpsideDownCakePrivacySandbox\").\n\nYou are strongly encouraged to update your project to use a newer\nAndroid Gradle plugin that has been tested with compileSdk = 34.\n\nIf you are already using the latest version of the Android Gradle plugin,\nyou may need to wait until a newer version with support for compileSdk = 34 is available.\n\nTo suppress this warning, add/update\n    android.suppressUnsupportedCompileSdk=34\nto this project's gradle.properties.","sources":[{}]}


 


그래도 지금은 무시하고 넘어갑니다. 그래도 아직 발견 되는 오류는 없습니다.  개발에 사용하고 있는 android studio 버전은 다음과 같습니다. 


 


Android Studio Giraffe | 2022.3.1
Build #AI-223.8836.35.2231.10406996, built on June 29, 2023
Runtime version: 17.0.6+0-b2043.56-10027231 amd64
VM: OpenJDK 64-Bit Server VM by JetBrains s.r.o.
Windows 11 10.0
GC: G1 Young Generation, G1 Old Generation
Memory: 4096M
Cores: 8
Registry:
    external.system.auto.import.disabled=true
    debugger.new.tool.window.layout=true
    ide.text.editor.with.preview.show.floating.toolbar=false
    ide.instant.shutdown=false
    ide.experimental.ui=true

Non-Bundled Plugins:
    com.jetbrains.kmm (0.6.1(223)-18)
    org.jetbrains.compose.desktop.ide (1.4.3)


 


이제 발등에 떨어진 불(?)을 끄기 위해 가 보겠습니다.  총총총...





오늘의 이야기


#스하리1000명프로젝트,
韓国で迷子になりましたか?韓国語が話せなくても、このアプリを使えば簡単に移動できます。
あなたの言語で話すだけで、翻訳、検索が行われ、結果があなたの言語で表示されます。
旅行者に最適!英語、日本語、中国語、ベトナム語などを含む 10 以上の言語をサポートします。
今すぐ試してみましょう!
https://play.google.com/store/apps/details?id=com.billcoreatech.opdgang1127




2026/03/23

오늘의 이야기

Hi Developers at Billcorea (빌코리아),
After a recent review, we've found an issue with your app, 리모트 페이 (결제도 공유가 되나요, 원격 결제) (com.billcoreatech.remotepayment0119). See below for more information about your app's status and how to correct the issue


(Billcorea(빌코리아)의 개발자 여러분, 안녕하세요.
최근 검토 결과, 원격 페이(결제도 공유가 된다면, 원격 결제)(com.billcoreatech.remotepayment0119) 앱에서 문제가 발견되었습니다. 앱 상태 및 문제 해결 방법에 대한 자세한 내용은 아래를 참조하세요.)


 











Publishing status: Removed
Your app was removed from Google Play and won't be available to users until you submit a policy compliant update.

게시 상태: 삭제됨
앱이 Google Play에서 삭제되었으며 정책을 준수하는 업데이트를 제출할 때까지 사용자가 사용할 수 없습니다.


 


Eligibility issues by versions (버전별 적격성 문제)













App Bundle:9APK REQUIRES PROMINENT DISCLOSURE​
Your app is not compliant with the User Data and Mobile Unwanted Software policies. Your app is uploading users' File information without a prominent disclosure.

As per Google Play's User Data policy, in cases where your app's access, collection, use, or sharing of personal and sensitive user data may not be within the reasonable expectation of the user of the product or feature in question, you must provide an in-app disclosure of your data access, collection, use, and sharing and seek affirmative user consent.
Your use case requires a Prominent Disclosure in accordance with this policy.
The in-app Prominent Disclosure:


  1. Must comprehensively disclose how your app collects, uses, and shares user data.

    • To meet policy requirements, it's recommended that you reference the following example language format for Prominent Disclosure when it's required: "{This app} collects / transmits / syncs / stores {type of data} to enable {"feature"}, {in what scenario}."



  2. Must be within the app itself, displayed in the normal usage of the app, and not require the user to navigate into a menu or settings.

  3. Cannot only be placed in a privacy policy or terms of service.

  4. Cannot be included with other disclosures unrelated to personal and sensitive user data collection.


Requests for user consent:


  1. Must be clear and unambiguous.

  2. Must require affirmative user action (for example, tap to accept or tick a checkbox).

  3. Must not interpret navigation away from the disclosure (including tapping away, pressing the back or home button) as consent.

  4. Must not use auto-dismissing or expiring messages as a means of obtaining user consent.

  5. Must be granted by the user before your app can begin to collect or access personal and sensitive user data.


App Bundle:9APK HAS A PRIVACY POLICY​ BUT IT IS NOT ADEQUATE


  • Privacy Policy in Play Console


    • Privacy Policy in Play Console does not disclose the collection of File.

    • Privacy Policy in Play Console does not disclose the usage of collected File.

    • Please make sure your Privacy Policy is non-editable.



  • Privacy Policy in Play Distributed App

    • Your app is uploading users' File information without posting a privacy policy in Play Distributed App.






  • APK는 명시적 공개가 필요합니다
    앱이 사용자 데이터 및 원치 않는 모바일 소프트웨어 정책을 준수하지 않습니다. 앱이 명시적 공개 없이 사용자의 파일 정보를 업로드하고 있습니다.
    Google Play의 사용자 데이터 정책에 따라 귀하의 앱이 개인적이고 민감한 사용자 데이터에 대한 액세스, 수집, 사용 또는 공유가 해당 제품 또는 기능 사용자의 합당한 기대 범위 내에 있지 않을 수 있는 경우 귀하는 다음을 제공해야 합니다. - 귀하의 데이터 액세스, 수집, 사용 및 공유에 대한 앱 공개 및 긍정적인 사용자 동의를 구합니다.
    귀하의 사용 사례에는 이 정책에 따라 명시적 공개가 필요합니다.
    인앱 명시적 공개:
    앱에서 사용자 데이터를 수집, 사용 및 공유하는 방법을 포괄적으로 공개해야 합니다.
    정책 요구 사항을 충족하려면 필요할 때 명시적 공개에 대해 다음 예시 언어 형식을 참조하는 것이 좋습니다. 대본}."
    앱 자체 내에 있어야 하고 앱의 일반적인 사용 시 표시되어야 하며 사용자가 메뉴나 설정으로 이동할 필요가 없어야 합니다.
    개인 정보 보호 정책 또는 서비스 약관에만 배치할 수 없습니다.
    개인 및 민감한 사용자 데이터 수집과 관련되지 않은 다른 공개에 포함될 수 없습니다.
    사용자 동의 요청:
    명확하고 모호하지 않아야 합니다.
    긍정적인 사용자 작업이 필요해야 합니다(예: 탭 하여 수락하거나 확인란을 선택).
    공개에서 벗어나는 탐색(두드리기, 뒤로 또는 홈 버튼 누르기 포함)을 동의로 해석해서는 안 됩니다.
    자동 해제 또는 만료 메시지를 사용자 동의를 얻는 수단으로 사용해서는 안 됩니다.
    앱이 개인적이고 민감한 사용자 데이터를 수집하거나 액세스 하기 전에 사용자가 승인해야 합니다.

  • APK에는 개인정보 보호정책이 있지만 적절하지 않습니다.
    Play Console의 개인정보처리방침
    Play Console의 개인정보처리방침은 파일 수집을 공개하지 않습니다.
    Play Console의 개인정보처리방침은 수집된 파일의 사용을 공개하지 않습니다.
    개인 정보 보호 정책을 편집할 수 없는지 확인하십시오.
    Play 배포 앱의 개인정보처리방침
    귀하의 앱은 Play 배포 앱에 개인정보취급방침을 게시하지 않고 사용자의 파일 정보를 업로드하고 있습니다.


메일 본문 중에서



 




오늘은 이렇게 받은 앱의 게시 취소에 대한 조치 준비를 해야 할 것 같습니다.  ~


구글은 개인정보 취급에 대한 상당한 요구사항을 가지고 있습니다. 그것이 뭐 틀렸거나, 잘못되었거나 하지는 않습니다. 개인정보의 보호는 앱을 게시하여야 하는 입장에서는 누구나 해야 하는 것이기 때문입니다.


 


playstore에서 받은 앱으로 인해 나의 개인정보가 어딘가로 흘러들어간다는 것을 좋아할 사람은 아무도 없으니까요.


이전 까지는 그냥 블로그 페이지에 있는 개인정보 링크를 연결해 주는 것만으로도 해소가 되었던 부분이 있다고 하면 이번에는 어떤 조치를 해 주어야 나의 앱을 게시해 줄까는 고민을 해 보아야 할 것 같습니다. 


 


이 블로그 페이지 중에서도 개인정보 관리 지침으로 사용되는 게시물이 있기도 합니다. 그래야 온라인으로 관리를 할 수 있으니까요. 그런데 구글은 그것을 허용해 줄 것인가 하는 부분은 고민을 해 보아야 할 것 같습니다. 


 


아무튼 정리가 되기를 바라 봅니다. 


 


오늘도 행복한 하루 마무리 잘하시길 기원드립니다. 





오늘의 이야기

https://medium.com/@mortitech/exploring-side-effects-in-compose-f2e8a8da946b



 


Jetpack Compose Side Effects in Details


Optimizing UI Performance in Jetpack Compose with SideEffect, LaunchedEffect, and DisposableEffect. Learn how to manage UI effects.


medium.com




jetpack compose을 이용해 UI을 구성하다 보면 Database에서 데이터를 추출해 화면에 보여주는 작업을 하는 과정에서 만나는 불편(?)함을 해소하기 위해서 필요한 부분일 듯하여 스크랩을 해 두고자 합니다.


 


이유는 데이터를 읽어 오는 부분의 구현에서 데이터가 소량인 경우는 문제가 없으나, 데이터가 많은 경우 그 처리에서 화면에 표시되는 데이터를 재구성 하려면 listview, adapter 등을 이용하는 xml layout 부분에서는 이미 많은 정보들이 있기 때문에 쉽게 구현을 해 볼 수 있습니다. 


 


compose로 넘어오면 조금 상황이 달라집니다.  위 원본 출처의 summary을 읽어 보고 오겠습니다. 




다음은 SideEffect, DisposableEffect및 LaunchedEffect 사이의 차이점에 대한 요약입니다.



  • SideEffect상위 컴포저블이 재구성될 때 실행되며 컴포저블의 상태 또는 소품에 의존하지 않는 작업을 실행하는 데 유용합니다.

  • DisposableEffect상위 컴포저블이 처음 렌더링될 때 실행되며 컴포저블이 더 이상 사용되지 않을 때 정리해야 하는 리소스를 관리하는 데 유용합니다. 첫 번째 구성 또는 키 변경 시 트리거 되고onDispose 종료 시 메서드를 호출합니다 .

  • LaunchedEffect별도의 코루틴 범위에서 부작용을 실행하며 UI 스레드를 차단하지 않고 장기 실행 작업을 실행하는 데 유용합니다. 첫 번째 컴포지션 또는 키 변경 시 트리거 됩니다.




대표이미지



ui와 데이터를 표시가 실시간으로 변해야 하는 부분들이 발생하기 때문에 위 글에서 제시된 효과 및 코드 기술 방법을 익혀둘 필요가 있었습니다.  오늘도 잘 정리해 두고 나중에 써 보도록 하겠습니다.


 


즐~코딩


 





오늘의 이야기



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

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

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

그것도 구글 Gemini로다가!

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

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

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


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




오늘의 이야기

https://github.com/tylerbwong/stack/



 


GitHub - tylerbwong/stack: An Android app for browsing Stack Overflow and other Stack Exchange sites.


An Android app for browsing Stack Overflow and other Stack Exchange sites. - GitHub - tylerbwong/stack: An Android app for browsing Stack Overflow and other Stack Exchange sites.


github.com




이 글은 원본 페이지의 정보를 알아보는 페이지입니다.  stack을 알아보는 이유는 앱 개발을 하다 보면 발생하는 오류 또는 이슈를 만나게 되면 대부분 구글 검색을 통해서 알아보게 됩니다.  그런 이슈나 오류사항 등에 대한 정보를 찾을 수 있는 stackoverflow.com의 정보를 이용해서  그걸 조금 쉽게 사용할 수 있는 앱 개발 소스를 레퍼런스 할 수 있을 것 같아서


정리해 두고 하는 목적이 있습니다. 


 


이제 읽어 보도록 하겠습니다. 




개발


이 프로젝트의 목표는 최신 Android 라이브러리 및 도구에 대한 예제를 제공하는 것입니다. 몇 가지 주목할만한 예는 다음과 같습니다.



특징



  • 풍부한 Markdown/LaTeX 미리 보기로 질문, 답변 및 댓글 보기

  • Stack Exchange 사이트 찾아보기

  • 질문에 투표하거나 새로운 질문, 답변 및 의견을 게시하려면 로그인하세요.

  • 나중에 저장하기 위해 북마크 질문(일시적으로 깨졌습니다. #126 참조 )

  • 고급 필터 컨트롤로 질문 검색

  • 다른 사용자의 프로필 보기

  • Material 3 동적 테마 사용 가능

  • 질문/답변 딥링킹


하위 프로젝트


여기에서 몇 가지 유용한 Gradle 모듈도 찾을 수 있습니다.



 




stack overflow 웹 페이지



실제로 빌드된 앱은 아래 그림과 같이 동작 하더군요... 이제 쉽게 찾아볼 수 있을 것 같습니다.


실행된 앱 이미지



 





오늘의 이야기


#스하리1000명프로젝트

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

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

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

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





오늘의 이야기

오늘은 구현하고자 하는 앱에서  MSSQL 등의 DB 서버 접속에 대한 이야기를 해 볼까 합니다. java에서 JDBC 등으로 DB Server 접속하는 web 서비스 구현을 해 보기는 했습니다만. android에서 jdbc 등으로 DB 접속을 구현해...