0️⃣ 드디어, Jetpack Compose다! Jetpack Compose를 공부하기만을 얼마나 고대해왔는지, 드디어 공부를 시작했다. 대부분의 선언형 UI가 비슷하듯이 Jetpack Compose도 예외는 아니다. 구글 공식 유튜브 강의를 들어 선언형 UI의 개요에 대해서 자세히 공부하고 Jetpack Compose에 대해서도 차차 알아가보겠다. 한글 자막도 잘 되어있으므로 꼭 한 번 시청하면 많은 도움이 될 것이다. 내가 앞으로 쓸 내용은 위 영상을 내가 이해한대로 정리한 요약본이다. 1️⃣ 선언형 UI에 대해서 선언형 UI가 정말로 대세다. Jetpack Compose를 대표해서, Swift UI, React(React Native), Flutter 등 모두 선언형 UI를 사용하고 있다. 기존 ..
전체 글
디자인 전공자가 모바일 개발자 되기내일배움캠프?말만 들어보고 해본 사람만 봤지 실제로 내가 참여하게 될 줄은 꿈에도 몰랐다... 그렇다면 내일배움캠프를 신청하게 된 계기부터 느낀점과 장단점, 마지막으로 추천여부까지 모조리 하나하나 파헤져보겠다.1️⃣ 그럼 원래 뭐하던 사람이냐, 너는. 디자인은 전공을 하던 사람으로서, 대학 4학년 때 디자이너의 길로는 먹고 살 길이 없을지도 모른다! 라는 생각 하에 개발 공부를 시작했었다. 당시엔 웹언어를 공부하며 React를 독학했었는데 그 때에도 스파르타 강의를 돈 주고 사서 봤던 기억이 있다. state가 뭔지 몰라서 끙끙 앓았으니 useState를 잘 쓸 리가 만무했다. 스파르타 측에서 제공하던 슬랙 공간에서 선생님께 여쭤봤고 친절하게도 답변 해주셨던 기억 덕분에 더욱 스파르타 강의에 대한 믿음이..
1️⃣ Fragment 생명 주기는 어떻게 구성되어 있나요?각 메서드가 어떻게 호출 되는지, 어떤 역할을 하는지 이해해야합니다. Fragment의 생명주기는 Activity의 생명주기와 유사한 점이 많습니다. Activity와 동일하게 Fragment도 생성될 때엔 onCreate로 동작합니다. 하지만 그 전에 Fragment가 Activity에 붙어 등장할 땐 onAttach를 통해 동작합니다. 또한 화면을 그릴 땐 onCreateView와 onViewCreated에서 View를 생성하고 초기화합니다. 이후엔 onStart, onResume, onStop 등의 과정을 거쳐 Fragment가 소멸할 때 onDestroyView와 onDestroy가 호출되어 사라집니다. Fragment를 사용자의 화면에..
0️⃣ 캐시메모리 이전에!메모리에 대해서 학습이 필요하다면 아래 링크에서 복습하고 오자!RAM과 메모리의 주소 개념에 대해서 잘 안 뒤 캐시메모리에 대해서 공부하면 더 좋다. [얼레벌레 공부하는 CS] RAM0️⃣ 메모리란? 메모리의 사전적 정의는 아래와 같다. 늘 사전적 정의는 이해하기 어렵지만 이렇게 간결한 설명 또한 없다.데이터나 명령을 비롯하여 컴퓨터 내부에서 계산 처리 한 결과kkevido.tistory.com 메모리의 논리주소와 물리주소0️⃣ 메모리의 주소란? 메모리에 저장된 정보의 위치는 주소로 나타낼 수 있다. 우리는 메모리를 공부하면서 주소에 접근한다는 이야기를 정말 많이 들었을 것이다. 메모리는 CPU가 직접적으kkevido.tistory.com 1️⃣ 캐시 메모리란? CPU는 연산하..
1️⃣ 안드로이드의 4대 컴포넌트는 무엇인가요?각 컴포넌트에 대해 자세히 설명할 수 있어야 합니다. (Activity, Service, Receiver, Provider) 안드로이드의 4대 컴포넌트에는 Activity, Service, Receiver, Provider가 있습니다. 이 4개의 컴포넌트들은 각각의 생명주기를 가지고 있으며 Intent를 통해 데이터를 주고 받을 수 있습니다. Activity는 사용자와 직접 상호작용을 할 수 있으며, Service는 백그라운드에서도 작업을 수행할 수 있습니다. Receiver는 문자나 배터리와 같은 이벤트를 수신할 수 있으며 Provider는 공유 데이터를 읽고 가능하다면 수정까지 가능합니다. 2️⃣ Activity의 생명주기는 어떻게 구성되어 있나요?각 ..
⛔ 문제사항 구글 배포를 하려고 aab 파일을 등록해놓고 보니 광고를 사용하지 않음에도 이러한 에러가 나왔다. 분명 우리 Manifest 파일에는 광고 권한을 기재하지 않았는데도 '예'로 응답하라고 한다!✅ 해결방안 Firebase crashlytics를 앱에 연동했거나, analytics를 연동했다면 광고 권한이 자동으로 들어간다고 한다. 우리는 Firebase를 적극적으로 활용한 경우이기 때문에 아무래도 광고 권한이 들어간 모양이다. '예'로 응답하고 아래 체크박스에서 애널리틱스로 체크해준 뒤 심사에 맡기면 된다. ❗출처참고 사이트 : https://minchanyoun.tistory.com/170 [Android] com.google.android.gms.permission.AD_ID 이슈 해결안녕..
⛔ 문제사항 Firebase Google Login을 통해 회원가입하는 로직을 구현했으니 이제는 회원탈퇴를 구현하던 때였다. 회원탈퇴 로직을 모두 만들고 테스트할 땐 잘 되다가 다음날 회원탈퇴 버튼을 누르니 제대로 동작하지 않으며Supplied auth credential is incorrect, malformed or has expired 이와 같은 에러가 발생했다. 나의 단짝친구 Gemini에게도 물어보고 Firebase 공식문서도 참고한 결과, 회원 정보를 삭제하는 것과 같이 민감한 정보를 다룰 때에는 재인증이 필요하다는 것이었다. 로그인 한지 5분이 지나면 이 시간이 경과하여 재인증을 무조건 해야하는 상황이 발생한다.✅ 해결방안우선 재인증 하는 로직을 구현한다.fun reAuthenticateWi..
0️⃣ 리팩토링하는 글이다. Android에서 Firebase Google Login 구현하기0️⃣ Firebase로 Google Login? 사실 많은 앱들에서 소셜 로그인을 지원한다. 나 같은 경우엔 이제 앱에 소셜 로그인 없이 자체 회원가입만 있다면 잘 이용하지 않게 되는 것 같다. 특히, 자체 회원가kkevido.tistory.com 위 게시글에서 이어지는 내용이다. 기본 세팅은 모두 생략하고 코드를 어떻게 리팩토링 하는지 차근차근 작성할 것이다. 우선, 내가 따른 구조는 튜터님께서 손수 짜주신 구조로 팀원들과 함께 응용했다. 근데 너무 어렵다. 아직도 익숙해지지가 않은 것 같지만, 이번 리팩토링을 통해 조금 감을 익혀가는 중이므로 기록을 통해 세세하게 적어보겠다.1️⃣ 기존 SignInActiv..
⛔ 문제사항Firebase Google Login을 연동하던 중의 연장선이다. 힘겹게 Google Login 로직을 다 작성하고 이제 성공하나! 싶었는데 무엇 하나 쉽게 되지 않는다더니 정말로 에러가 발생해버렸다. com.google.android.gms.common.api.ApiException: 10 이런 에러가 발생했는데, 내 소중한 짝꿍 Gemini에게 물어보니 다양한 원인이 있다고 친절하게 설명해줬다. 내가 추측한 문제로는 단연 SHA-1 키의 불일치 문제였다. Firebase Console에서 우리 프로젝트의 SHA 인증서 지문에서는 SHA 키가 2개 등록 되어있었기 때문이다. 밑에 노란색으로 경고 표시가 뜬 SHA-1 키가 내가 구글 로그인을 연동하며 추가한 것이고, 위에 멀쩡한 키는 팀장 ..
0️⃣ Firebase로 Google Login? 사실 많은 앱들에서 소셜 로그인을 지원한다. 나 같은 경우엔 이제 앱에 소셜 로그인 없이 자체 회원가입만 있다면 잘 이용하지 않게 되는 것 같다. 특히, 자체 회원가입을 하더라도 소셜 계정 연동이 없다면 더더욱! 그만큼 소셜 로그인이 앱의 필수 기능으로 자리잡은 만큼 꼭 구현해보고 싶었던 기능이다. (그동안 소셜 로그인을 한 번도 연동해본 적이 없다는 것이 더욱 충격적) 이번 프로젝트에서는 서버 없이 FireStore로만 작업했기 때문에 Firebase Google Login 구현이라고 보면 된다. 차근차근 해보자. 1️⃣ Firebase Setting먼저 Firebase 세팅을 해주면 된다. 우리 팀의 리더 친구가 세팅 해주었다! 하지만 세팅 자체가 어..
0️⃣ Context를 사용 못 해Singleton 패턴에서는 context를 사용할 수가 없다.생명 주기 불일치단위 테스트의 어려움의존성 주입 어려움대표적으로 이러한 이유가 있지만 그럼에도 Context가 필요한 상황은 반드시 온다.더군다나, 나는 Hilt로 DI를 구성해놓은 코드였기 때문에 context를 불러와야할지 잘 몰랐었지만 오히려 Hilt를 사용하고 있어서 Context를 사용하기 더 쉬웠다.@Module@InstallIn(SingletonComponent::class)object YoutubeApiModule { private const val cacheSize = 100 * 1024 * 1024 // 100 MB private const val YOUTUBE_BASE_URL =..
0️⃣ CustomDialog!사실 Dialog를 띄워 화면에 알림을 주는 일은 이제는 도저히 뺄 수 없는 필수 기능이다. 할 줄 안다고 생각했는데도 막상 다시 하니 또 버벅거리며 한참을 헤매서 세세하게 기록해보려고 한다.1️⃣ dialog.xml 핵심 포인트는 가장 최상단 부모 태그의 width, height값을 match_parent로 주는 것이다.2️⃣ DialogFragmentclass TwoButtonDialogFragment( private val title: String, private val onClickConfirm: () -> Unit) : DialogFragment() { ..