2026/06/26

오늘의 이야기



#스치니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.billcoreatech.multichat416




오늘의 이야기


#스하리1000명프로젝트

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

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

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





오늘의 이야기

Android · Firebase Auth · Naver Login



NaverIdLoginSDK에서 NidOAuth로 네이버 로그인 연동 수정하기


네이버 OAuth SDK 5.11.2 기준으로 deprecated 된 NaverIdLoginSDK 사용 코드를 NidOAuth 기반 호출로 교체하고, access token 검증 로직을 추가한 작업 내용을 정리한다.


수정 파일: MainActivity.kt SDK: com.navercorp.nid:oauth 5.11.2 빌드 검증: assembleDebug 성공



수정 배경


프로젝트 빌드 과정에서 네이버 로그인 연동부에 대해 다음과 같은 deprecation warning이 발생했다. 핵심은 NaverIdLoginSDK 클래스와 그 하위 메서드들이 이후 버전에서 제거될 예정이며, 새 API인 NidOAuth를 사용해야 한다는 점이다.


w: 'object NaverIdLoginSDK : Any' is deprecated.
This class will be removed from v6.1.0. Use NidOAuth instead.

w: 'fun getAccessToken(): String?' is deprecated.
Use NidOAuth.getAccessToken instead.

w: 'fun initialize(...)' is deprecated.
Use NidOAuth.initialize(...) instead.

w: 'fun authenticate(...)' is deprecated.
Use NidOAuth.requestLogin(...) instead.

기존 코드는 동작은 가능하지만, SDK 6.1.0 이후에는 제거될 수 있는 wrapper API에 의존하고 있었다. 따라서 네이버 SDK가 안내하는 대체 객체인 NidOAuth로 직접 호출하도록 변경했다.




Import 교체


가장 먼저 import 대상을 교체했다. 기존에는 deprecated wrapper인 com.navercorp.nid.NaverIdLoginSDK를 import하고 있었다.


변경 전


import com.navercorp.nid.NaverIdLoginSDK

변경 후


import com.navercorp.nid.NidOAuth

핵심: NaverIdLoginSDK는 내부적으로 NidOAuth를 감싼 deprecated wrapper다. 따라서 기능을 새로 구현한 것이 아니라, 같은 SDK의 최신 권장 진입점으로 호출 대상을 옮긴 것이다.



API 교체 매핑


이번 수정에서 바뀐 네이버 로그인 API 호출은 다음과 같다.





































구분 변경 전 변경 후
SDK 초기화 NaverIdLoginSDK.initialize(...) NidOAuth.initialize(...)
로그인 요청 NaverIdLoginSDK.authenticate(...) NidOAuth.requestLogin(...)
access token 조회 NaverIdLoginSDK.getAccessToken() NidOAuth.getAccessToken()
마지막 오류 코드 조회 NaverIdLoginSDK.getLastErrorCode() NidOAuth.getLastErrorCode()
마지막 오류 설명 조회 NaverIdLoginSDK.getLastErrorDescription() NidOAuth.getLastErrorDescription()



로그인 요청 코드 비교


네이버 로그인 시작 함수인 doNaverLogin()은 초기화와 로그인 요청을 순서대로 수행한다. 기존 코드에서는 두 단계 모두 NaverIdLoginSDK를 통해 호출했다.


변경 전


private fun doNaverLogin() {
NaverIdLoginSDK.initialize(
this@MainActivity,
BuildConfig.NAVER_CLIENT,
BuildConfig.NAVER_CLIENT_SECRET,
BuildConfig.APPLICATION_ID
)
NaverIdLoginSDK.authenticate(this@MainActivity, naverLauncher)
}

변경 후


private fun doNaverLogin() {
NidOAuth.initialize(
this@MainActivity,
BuildConfig.NAVER_CLIENT,
BuildConfig.NAVER_CLIENT_SECRET,
BuildConfig.APPLICATION_ID
)
NidOAuth.requestLogin(this@MainActivity, naverLauncher)
}

인자로 전달하는 값은 그대로 유지했다. 네이버 클라이언트 ID, 클라이언트 시크릿, 앱 이름 값은 기존과 동일하게 BuildConfig에서 가져온다. 변경된 부분은 호출 객체와 메서드명이다.




로그인 결과 처리 코드 비교


로그인 화면에서 돌아온 뒤, 성공 시 access token을 가져와 Cloud Functions로 전달하고 Firebase custom token을 발급받는 구조는 그대로 유지했다. 다만 token이 비어 있는 경우를 명확히 막았다.


변경 전


private val naverLauncher = registerForActivityResult<Intent, ActivityResult>(
ActivityResultContracts.StartActivityForResult()
) { result ->
when (result.resultCode) {
RESULT_OK -> {
viewModel.isProgressBar.value = true
Log.e("", "accessToken=${NaverIdLoginSDK.getAccessToken()}")
doSigninNaverToken(NaverIdLoginSDK.getAccessToken().toString())
}
RESULT_CANCELED -> {
val errorCode = NaverIdLoginSDK.getLastErrorCode().code
val errorDescription = NaverIdLoginSDK.getLastErrorDescription()
doToastMakeAppend(R.string.titleFailure, "$errorDescription")
}
}
}

변경 후


private val naverLauncher = registerForActivityResult<Intent, ActivityResult>(
ActivityResultContracts.StartActivityForResult()
) { result ->
when (result.resultCode) {
RESULT_OK -> {
viewModel.isProgressBar.value = true
val accessToken = NidOAuth.getAccessToken()
Log.e("", "accessToken=$accessToken")
if (accessToken.isNullOrEmpty()) {
viewModel.isProgressBar.value = false
doToastMakeAppend(R.string.titleFailure, "Naver access token is empty.")
return@registerForActivityResult
}
doSigninNaverToken(accessToken)
}
RESULT_CANCELED -> {
val errorCode = NidOAuth.getLastErrorCode().code
val errorDescription = NidOAuth.getLastErrorDescription()
viewModel.isProgressBar.value = false
doToastMakeAppend(R.string.titleFailure, "$errorCode $errorDescription")
}
}
}

주의할 점: 변경 전 코드는 getAccessToken().toString()을 바로 호출했다. access token이 null이면 문자열 "null"이 서버로 전달될 수 있다. 변경 후에는 isNullOrEmpty()로 검증한 뒤에만 doSigninNaverToken(accessToken)을 호출한다.



Firebase 로그인 흐름은 유지


이번 수정은 네이버 SDK 호출부를 최신 API로 교체한 작업이다. Firebase Auth와 연동되는 큰 흐름은 바꾸지 않았다.



  • 네이버 OAuth 로그인 요청

  • 네이버 access token 획득

  • Cloud Functions에 access token 전달

  • 서버에서 Firebase custom token 발급

  • auth.signInWithCustomToken(...)으로 Firebase 로그인


즉, 인증 서버 연동 방식이나 Firebase custom token 처리 방식은 그대로 두고, Android 클라이언트의 네이버 SDK 진입점만 교체했다.




최종 적용 코드


현재 적용된 네이버 로그인 관련 핵심 코드는 다음과 같다.


import com.navercorp.nid.NidOAuth

private val naverLauncher = registerForActivityResult<Intent, ActivityResult>(
ActivityResultContracts.StartActivityForResult()
) { result ->
when (result.resultCode) {
RESULT_OK -> {
viewModel.isProgressBar.value = true
val accessToken = NidOAuth.getAccessToken()
Log.e("", "accessToken=$accessToken")
if (accessToken.isNullOrEmpty()) {
viewModel.isProgressBar.value = false
doToastMakeAppend(R.string.titleFailure, "Naver access token is empty.")
return@registerForActivityResult
}
doSigninNaverToken(accessToken)
}
RESULT_CANCELED -> {
val errorCode = NidOAuth.getLastErrorCode().code
val errorDescription = NidOAuth.getLastErrorDescription()
viewModel.isProgressBar.value = false
doToastMakeAppend(R.string.titleFailure, "$errorCode $errorDescription")
}
}
}

private fun doNaverLogin() {
NidOAuth.initialize(
this@MainActivity,
BuildConfig.NAVER_CLIENT,
BuildConfig.NAVER_CLIENT_SECRET,
BuildConfig.APPLICATION_ID
)
NidOAuth.requestLogin(this@MainActivity, naverLauncher)
}



빌드 검증 결과


수정 후 assembleDebug 빌드를 실행해 컴파일을 확인했다.


.\gradlew.bat assembleDebug

BUILD SUCCESSFUL

기존에 발생하던 NaverIdLoginSDK 관련 deprecation warning은 제거됐다. 남아 있는 warning은 Locale, updateConfiguration, GsonBuilder.setLenient, AGP/Gradle 설정 관련 기존 경고로 이번 네이버 로그인 수정 범위와는 별개다.




정리


이번 변경의 핵심은 deprecated wrapper인 NaverIdLoginSDK를 제거하고, SDK가 권장하는 NidOAuth를 직접 사용하도록 바꾼 것이다. 기능 흐름은 유지하면서 향후 SDK 6.1.0 이후 제거될 API에 대한 의존성을 줄였고, access token이 비어 있을 때 서버 요청이 발생하지 않도록 방어 로직도 추가했다.







2026/06/25

오늘의 이야기



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

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

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

그것도 구글 Gemini로다가!

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

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

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


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




오늘의 이야기


#billcorea #운동동아리관리앱
🏸 Schneedle, une application incontournable des clubs de badminton !
👉 Match Play – Enregistrez des scores et trouvez des adversaires 🎉
Parfait partout, seul, entre amis ou en club ! 🤝
Si vous aimez le badminton, essayez-le

Accédez à l'application 👉 https://play.google.com/store/apps/details?id=com.billcorea.matchplay




오늘의 이야기


#스하리1000명프로젝트,
Parfois, il est difficile de parler avec des travailleurs étrangers, n'est-ce pas ?
J'ai créé une application simple qui aide ! Vous écrivez dans votre langue et les autres le voient dans la leur.
Il se traduit automatiquement en fonction des paramètres.
Super pratique pour des discussions faciles. Jetez-y un oeil quand vous en aurez l'occasion !
https://play.google.com/store/apps/details?id=com.billcoreatech.multichat416




오늘의 이야기


#스하리1000명프로젝트

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

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

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





오늘의 이야기


#스하리1000명프로젝트,
迷失在韩国?即使您不会说韩语,这个应用程序也可以帮助您轻松出行。
只需说出您的语言即可 - 它会翻译、搜索并以您的语言显示结果。
非常适合旅行者!支持英语、日语、中文、越南语等10多种语言。
现在就试试吧!
https://play.google.com/store/apps/details?id=com.billcoreatech.opdgang1127




2026/06/24

오늘의 이야기



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

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

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

그것도 구글 Gemini로다가!

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

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

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


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




오늘의 이야기


#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




오늘의 이야기

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