본문 바로가기
반응형

분류 전체보기362

데이터보안 양식 잘못됨 SPLIT_BUNDLE 13 정책 선언 # Google Play 가끔 사용자정보를 수집하지 않고 있는데, Google 에서 정책준수 위반 메일을 받으신 분들이 있습니다. 오늘은 이렇게 데이터보안 양식 관련 정책 위반을 받고 앱게시 중단에 대해서 정리해 보겠습니다. 1. SPLIT_BUNDLE 13: 정책 선언 어느 날 이런 메일을 받게 됩니다. 내용을 정리하면, 사용자 정보를 수집하는데, 안 하고 있다고 하였다. 그러니 수정하라는 것 입니다. 2023. 4. 14.
함수 실행 시간 측정 후 Delay 사용하기 오늘은 함수의 실행시간을 체크하여서, 특정시간을 지나지 않으면, 그 만큼 Delay를 시키는 코드를 정리해 보겠습니다. 이런 코드는 특히 Splash화면 진행중에 하기에 용이한데요. 예를 들어 Splash를 3초정도 보여주고 싶다면, 특정 코드를 실행시키고 3초에서 남은 시간을 측정한 후, 나머지 시간만큼 Delay를 부여해 준다음 화면을 보여주기만 하면 되겠지요. 1. 함수 실행시간 측정하기 함수의 실행시간 측정은 아래와 같이 할 수 있습니다. 먼저 deleteFiles()라는 함수를 실행하였고요. 바로 직전과 실행후의 시간을 측정합니다. 시간 측정은 system.currentTimeMillis 를 활용하였습니다. 아래와 같은 코드를 이용하면, 최대 시간인 maxTimeMillis로부터, 걸린 시간(e.. 2023. 4. 14.
안드로이드 앱 내부 파일 확장자 체크 후 삭제하기 # delete filesDir 안드로이드에서는 앱에서 사용할 디렉토리를 따로 정해주었는데요. 이러한 내부에 파일들에 사용하지 않는 이미지들을 저장했다가 지워야할 때가 있습니다. 앱 내부의 디비에서는 이미지 uri를 가지고 있다가 유저가 해당 데이터를 지웠는데, 이 때, 내부 디렉토리의 파일로는 남아있는 경우입니다. 1. FilesDir 와 CacheDir 안드로이드에서는 내부파일에 접근하기 위한 장소로 FilesDir를 제공해주고 있는데요. 이곳은 완벽하게 다른 앱들은 접근할 수 없는 앱만의 영역으로, 앱이 필요로 하는 데이터나 캐쉬파일들을 저장할 수 있습니다. API29버전 이상부터 이 영역은 암호화 되어서 저장되게 됩니다. 그리고 CacheDir은 이름에서도 알 수 있듯이, 앱에서 사용할 캐쉬파일들을 저장하는 곳 입니다. 당연히 .. 2023. 4. 14.
Route 에서 전달된 값을 ViewModel 에서 받는 방법 # Jetpack Compose Navigaion savedStateHandle 오늘은 Route에서 넘어온 값을 ViewModel 에서 savedStateHandle 을 이용해 받아서 사용하는 방법에 대해서 정리해 보겠습니다. 1. Route에서 값을 넘겨줄 때 먼저 route에서 값을 넘겨주는 코드를 보고 가겠습니다. testId를 route에 실어서 보내주는 코드인데요. TestId는 ViewModel에서 받아서 사용할 것이므로, TestPage에 인자로 넘겨주지 않았습니다. ... composable( route = "test_route" + "/{testId}", arguments = listOf( navArgument("testId") { type = NavType.LongType defaultValue = -8889L }, ), ) { TestPage() } 2023. 4. 13.
Kotlin custom getter 와 setter 구현하기 Kotlin 에서는 Custom 하게 getter 와 setter 를 구현할 수 있는데요. 오늘은 이것에 대해서 알아보고, 활용 사례까지 정리해 보겠습니다. 1. Custom Getter 와 Setter Kotlin은 우리가 특별히 무엇을 하지 않아도, 알아서 getter 와 setter 를 만들어 줍니다. Java에서는 class의 길이가 길었었는데, 덕분에 Kotlin에서는 매우 간결해 졌습니다. 그런데, 우리는 때로 override 해서 다른 방식으로 get하거나 set을 해야할 때가 있는데요. 이것을 하는 것을 보도록 하겠습니다. 1-1. Custom Getter 아래와 같이 age를 정의할 경우, custom하게 getter를 설정하려면 아래와 같이 해주면 됩니다. get()을 넣어주고, 수식으.. 2023. 4. 11.
collectAsState 로 Flow 타입 데이터 받기 구현 방법 # Jetpack Compose 오늘은 collectAsState 로 Flow 타입 데이터를 받는 것을 구현하는 방법에 대해서 정리해 보도록 하겠습니다. 1. CollectAsState 구현 collectAsState 을 사용하게 되는 시나리오에 대해서 정리해 보겠습니다. RoomDB등을 이용한 Repository에서 Flow타입의 데이터가 흘러나온다고 가정해 보겠습니다. 이 때 viewModel에서 해당 데이터를 받습니다. 그리고 Jetpack Compose UI 에서 그 데이터를 collectAsState형태로 받게 됩니다. 하나씩 보도록 하겠습니다. 1-1. Repository 에서 흘러나오는 데이터 관찰 먼저 roomDB에서 아래와 같은 Repository가 있다고 가정해 보겠습니다. flow는 비동기적으로 데이터의 강을 obs.. 2023. 4. 10.
isNullOrEmpty 와 isNullOrBlank 의 차이점 # Kotlin 오늘은 Kotlin의 isNullOrEmpty 와 isNullOrBlank 의 차이점에 대해서 정리해 보겠습니다. 둘은 비슷하기 때문에 잘 알지 않고 사용하는 경우도 있는데요. 오늘 차이를 구분해 보도록 하겠습니다. 1. isNullOrEmpty 이 API는 만약 String이 null 이거나 empty 일 경우 true를 반환해 준다고 설명되어 있습니다. 그런데, empty는 어떤 것을 말하는 것일까요? 비어있다는 뜻 입니다. 즉 ""을 가리킵니다. String 값에 대해서 ""로 초기화하는 경우도 있는데요. 그대로 아무 값이 없는지 보려면 isNullOrEmpty로 충분합니다. val xInitValue: String? = "" println(xInitValue.isNullOrEmpty()) // t.. 2023. 4. 9.
MutableStateFlow 이용한 로딩 후 로딩 완료 기다리기 구현 방법 AdView처럼 라이브러리에 로딩을 시키고, 해당 로딩이 다 될 때까지 기다릴 때 어떻게 구현해야 하는지 정리해 보겠습니다. 1. Mode 설정 먼저 여러가지 모드를 설정하기 위해서 다음과 같이 Mode에 관한 sealed class를 하나 작성해 줍니다. 이것은 로딩에서 로드가 완료되었을 때를 알기 위해서 인데요. 광고라이브러리에서는 보통 콜백으로 로드가 다 되었을 때 호출되는 onAdLoaded 와 같은 함수를 제공해 주므로, 이러한 콜백함수에서 Mode를 Loaded로 해주고, 로딩을 시작할 때, Loading으로 모드를 설정해 주면 되겠지요. sealed class AdMode { object Loading : AdMode() object Loaded : AdMode() data class Err.. 2023. 4. 8.
lateinit 에 관한 정리 # Kotlin 오늘은 Kotlin 의 lateinit 에 대해서 정리해 보도록 하겠습니다. 1. lateinit lateinit은 키워드 자체로 설명이 되어있는데요. 초기화(initialize)가 late하게 된다는 의미를 가지고 있습니다. 이 키워드를 사용하면, 컴파일러는 변수 선언시에 초기화가 되지 않아도 아무런 에러를 보여주지 않구요. 개발자가 원하는 시점에 초기화를 할 수 있도록 해 줍니다. 게다가 lateinit 을 이용해서 선언할 경우, onDestroy에서 null 로 다시 값을 넣어줄 필요가 없습니다. 이 객체는 자동으로 가비지콜렉터에 의해서 해당변수가 포함된 클래스가 destroy 될 때 함께 처리됩니다. 예를 들어서 아래와 같이 adView나 adRequest를 초기화 하지 않은 상태에서 미리 선언하.. 2023. 4. 7.
RoomDB 에서 One to Many 관계 구현하기 # 채팅 DB 구현 오늘은 RoomDB에서 One to Many 관계를 구현하는 방법에 대해서 정리해 보도록 하겠습니다. 이 글에서는 채팅의 예를 볼 텐데요. 채팅의 경우, 하나의 채팅룸에 다량의 메시지가 들어가는 one to many 구조를 가지고 있기 때문입니다. 참고로 이 글에서는 RoomDB구현에 대해서는 다루지 않으므로, 이에 관해서는 아래 글을 참조해 주세요. >> Room DB 사용방법 총정리 # Android SQLite 1. 구현 전 필요한 채팅과 채팅룸 Entity 채팅과 채팅룸의 one to many 관계를 구현하기 전에 이들의 Entity가 있어야 하는데요. 먼저 채팅룸 Entity는 다음과 같습니다. @Entity(tableName = "chat_rooms") data class ChatRoom( @.. 2023. 4. 7.
Room DB 사용방법 총정리 # Android SQLite 오늘은 andoird의 Room DB에 대해서 정리해 보도록 하겠습니다. 개인적으로는 Realm을 선호하기는 하지만, Android Architecture Library의 LiveData나 ViewModel과 함께 잘 사용할 수 있는 라이브러리라는 점에서는 매력적이라고 생각합니다. 1. Room 1-1. Room 정식명칭은 Room Persistence library이고요. ORM(Object Relational Mapping)으로서, SQLite 데이터베이스를 사용하기 쉽도록, 데이터베이스를 객체로 매핑해 주는 역할을 합니다. SQLite를 Annotation을 이용해서 좀 더 사용하기 쉽게 추상화했다고 보면 될 것 같은데요. 1-2. Types Room 에서 지원하는 타입은 다음과 같은 것들이 있습니.. 2023. 4. 4.
RemoteConfig 이용해서 다이나믹하게 앱 업데이트 하기 # Android 안드로이드 앱을 만들면서 상황에 맞게 앱을 변경하거나 유저에게 알려야 할 경우가 있습니다. 가장 쉽게 생각해 보면, 앱에서 비정기적인 공지를 보여주거나, 앱의 업데이트된 버전을 확인할 수 있도록 하는 것인데요. RemoteConfig을 이용하면 이러한 일들을 쉽게 할 수 있습니다. 오늘은 RemoteConfig 을 이용하는 방법에 대해서 정리해 보겠습니다. 1. RemoteConfig 앱을 다운로드 할 필요없이 앱의 형태와 동작을 변경할 수 있도록, 구글에서 제공해주는 클라우드 서비스의 형태로 Firebase서비스의 일부인 RemoteConfig입니다. 공식문서에 소개된 이 API의 Architecture는 아래와 같이 구성되어 있습니다. 아직은 무슨 말인지 모를 수 있으니, 휙 둘러보고, 아래글을 다 .. 2023. 3. 23.
Jetpack Compose 화면 하단에 배치하기 Jetpack Compose 에서는 Constraint Layout 을 사용하지 않고도, 사용자의 화면 하단에 무언가를 쉽게 배치할 수 있습니다. 보통 앱의 광고배너가 화면하단에 사용되는데요. 오늘은 이것을 구현하는 방법에 대해서 정리해 보도록 하겠습니다. 1. Colomn 의 화면 하단에 배치하기 이것을 하기위해 필요한 핵심은, Column 과 weight 입니다. Column안에 들어있는 요소들에는 weight 를 줄 수 있는데요. 이를 이용해서, 화면상단부터 나열할 요소인 Column에는 아래와 같이 weight를 1f로 주고요. 그리고 화면 하단에 배치할 Box()에는 weight 관련해서는 아무것도 해주지 않기만 하면 됩니다. 2023. 3. 22.
Jetpack Compose 에서 자간 줄이는 방법 # letterSpacing 오늘은 Jetpack Compose 에서 자간을 줄이는 방법을 정리해 보도록 하겠습니다. 1. 자간 조절하기 Jetpack Compose 에서는 자간을 줄이기 위해서, letterSpacing 값을 수정해 주어야 하는데요. 이때 사용하는 타입이 TextUnit 입니다. 이 TextUnit 은 아래와 같이, sp나 em 단위를 사용하여 생성할 수 있습니다. 저희가 fontSize를 지정할 때 쓰는 단위와 같이 사용하시면 된다는 것이지요. 2. 자간 줄이기 이제 자간을 줄여보도록 하겠습니다. 여기서는 -1.sp 만큼의 자간을 줄여서 글자간격이 서로 달라붙도록 할 텐데요. 참고로 마이너스 값을 사용하기 위해서 앞뒤에 괄호를 붙여서 사용하였습니다. 2023. 3. 21.
ktlint 린트툴 적용하는 방법 정리 # Android Lint 오늘은 KTLint 라는 라이브러리에 대해서 정리해 보도록 하겠습니다. KTLint 에 대해 알아보기전에, lint 툴에 대해서 간단히 알아보고 가겠습니다. 1. lint 린트나 린터라고도 불리는 데요. 이것은 코드에서 버그나 익셉션이 발생할 만한 곳을 표시해주는 툴을 가르킵니다. 다양한 라이브러리가 이러한 툴로 사용되는데요. 추가적으로 Typo(타이핑에러)나 코드 스타일까지도 일관되도록 체크를 해 줍니다. Android Studio에서는 사실 이미 이러한 lint를 제공해주고 있습니다. 코드 작성시에 안드로이드에서 Typo나 발생할 수 있는 문제들을 알려주고 있는 것은, lint 툴들이 동작하고 있기 때문입니다. 특정 파일을 정해서 체크할수도 있는데요. 네비게이션에서 체크를 할 파일을 선택하고, 오른쪽.. 2023. 3. 15.
ChatGPT 데이터를 CSV 로 출력해 SQLite 로 저장하기 오늘은 ChatGPT의 데이터를 CSV 로 저장하는 방법에 대해서 정리해 보도록 하겠습니다. 1. CSV 로 저장하기 1-1. 리스트 형태의 데이터 요청하기 먼저 CSV 형태로 바꿀 데이터가 필요한데요. ChatGPT 에게 아래와 같이 10명의 세계 최고의 CEO들을 리스팅해달라고 하였습니다. 당연히 스티브 잡스나, 일론머스크도 보이네요. list 10 CEO's who have been considered some of the best in history 아래 명령어 하나면 쉽게 복사할 수 있는 코드로 변경됩니다. convert it to copiable CSV format 2023. 1. 26.
Elvis 연산자 의 활용법 총정리 # null 체크 throw 오늘은 Kotlin 의 Elvis Operator 의 활용법에 대해서 정리해 보도록 하겠습니다. 1. Elvis Operator Null 에 대해서 철저한 Kotlin 언어에서는 이에 대한 코드가 길어질 수 밖에 없는데요. elvis 연산자는 null이 나올 수 있을 때, null대신에 다른 값을 부여할 수 있도록 도와줍니다. 표현식이 매우 간결해서 보기에도 편하고 유지보수하기에도 좋습니다. 아래에서는 testValue 가 null 이면, "Default값"을 사용하라고 하는 것을 간결하게 표현해 준 것 입니다. testValue ?: "Default값" 아래와 같이 코드를 활용할 수도 있습니다. 2. return 을 사용한 Null 체크 Elvis 연산자에 null 대신 return 키워드도 넣어서 실.. 2023. 1. 15.
require 와 Check 로 코드에 조건 부여하기 # Kotlin Kotlin에서는 require 와 check 라는 함수를 제공해 주고 있는데요. 이 함수들을 이용하면, 코드에서 명시적으로 특정한 조건을 확인할 수 있습니다. Null 체크나 상태를 확인할 때 도움이 되는데요. 오늘은 이것에 대해서 알아보도록 하겠습니다. 1. require 와 requireNotNull 1-1. require require함수에 인자로 들어가는 조건을 맞추어 주지 못한다면, IllegalArgumentException 를 발생시켜 줍니다. 반드시 필요한 조건이 있을 때 이 함수를 사용해주면 좋습니다. 아래에서는 0이상인 숫자가 아니면 Exceptin이 나오게 하였습니다. 2023. 1. 14.
Firebase Analytics 에서 사용자 OS 분석하기 # API21 오늘은 Firebase Analytics에서 앱사용자의 OS버전을 알아보는 방법에 대해서 정리해 보도록 하겠습니다. 이 글은 Firebase 라이브러리가 이미 적용되었다는 가정하에 쓴 글로, Fireabase analytics 설치나 적용코드에 관한 글은 다른 글에서 정리하도록 하겠습니다. 1. API21 이하 찾아보기 안드로이드 OS의 큰 분기점이라고 할 수 있는 버전이 API21입니다. Retrofit 도 그렇고 여러가지 라이브러리들이 이 버전을 분기로, 더 이상 지원을 하지않고 있기도 합니다. API21은 14년도에 출시된 버전으로서 Android5 (Lollipop)버전이 되겠습니다. 그럼, 현재 앱 사용자들의 버전을 알아야 할 텐데요. Firebase가 그것을 가능하게 해 줍니다. 먼저 Fire.. 2023. 1. 5.
Javascript 함수와 화살표 함수에 대한 정리 # Arrow Function 오늘은 Javascript의 화살표 함수에 대해서 정리하려고 하는데요. 이에 대해서 알아보기전에, 기존의 함수에 대해서 알아보고 정리해 보도록 하겠습니다. 1. 기존의 함수 (Function) 표현 방법 기존의 함수를 선언하는 방법은 크게 2가지가 있었는데요. 함수선언(Function Declaration)과 함수표현식(Functoin Expression)입니다. 1-1. 함수 선언 ( Function Declaration ) 기존의 자바스크립트의 함수선언 방법은, function키워드로 시작해서, 함수의 이름과, 인자를 전달한 후 "{ }"로 감싸서 표현하였구요. return 키워드를 통해서 값을 반환하고, 함수를 종료하여 빠져 나갑니다. 아래와 같이 기본 값을 정해줄 수도 있습니다. 두번째 인수인 b.. 2022. 12. 22.
TypeScript 를 정리해 봅니다 # Optional Chaining 오늘은 TypeScript에 대해서 정리해 보도록 하겠습니다. 1. TypeScript TypeScript 는 마이크로소프트에서 개발한 언어입니다. 이를 사용하는 이유는 크게 아래의 2가지 인데요. Type을 정의해서 사용하여 의도하지 않는 타입의 값이 들어가는 것을 방지 작성하는 최신의 타입스크립트 혹은 자바스크립트를 구버전으로 변환해주는 역할 Javascript의 역할이 커진 요즘 시대에서, 첫번째의 역할도 매우 중요하기는 하지만, 두번째 역할도 매우 중요합니다. 최신 자바스크립트의 언어를 쓸 수 있게 해주기 때문입니다. TypeScript소개 화면도 마이크로소프트의 디자인느낌이 나는데요. 대기업이 관리하는 프로젝트인 만큼 유지보수에 걱정이 없습니다. 많은 프로젝트에서 사용되고 있기도 합니다. 2. .. 2022. 12. 19.
Java 프로젝트에 Kotlin 추가하기 # Android Studio 오늘은 Java로 되어있는 안드로이드 프로젝트에 Kotlin을 추가하는 방법에 대해서 정리해 보도록 하겠습니다. 1. Kotlin 파일 추가하기 안드로이드 공식사이트에서 제시하는 방법은, 먼저 Kotlin파일을 추가하고, 그에 따라서 나오는 인터랙션한 메뉴를 사용하라는 것 인데요. 한번 보도록 하겠습니다. java디렉토리에서 "New > Kotlin Class"를 선택해 줍니다. 2022. 12. 14.
Android Studio Java Runtime Version 에러 발생시 대응 방법 # Gradle 오늘은 Android Studio에서 라이브러리 설치 후에 Java Version에러 발생시 대응하는 방법에 대해서 정리해 보겠습니다. 1. Java Version 아래는 hilt 라이브러리를 dependency를 선언한 후 발생한 에러인데요. 현재 프로젝트에서 사용중인 Java버전인 52와 라이브러리의 플러그인에서 사용하는 버전인 55가 사용이 안된다는 말 입니다. 그럼 버전을 바꾸어 주어야 할 텐데요. 위에서 말하는 52버전은 Java8을 말하구요. 55버전은 Java11을 가르킵니다. 2022. 12. 10.
JSON 파일 로 데이터 변환해 저장하기 # NodeJS Path Serialize 오늘은 Javascript 의 데이터를 JSON스트링 타입으로 변환해 파일로 저장하는 방법에 대해서 정리해 보도록 하겠습니다. 1. 데이터를 JSON 파일로 변경하기 1-1. JSON.stringify() 먼저 Javascript 의 값들을 JSON string으로 변환하는 함수에 대해서 알아보겠습니다. json객체의 stringify()함수가 이 역할을 해주는데요. 아래와 같이 Javascript의 값들을 json string형태로 변환시켜 줍니다. 2022. 12. 8.
GoogleSheet 로 크롤링 하기 # IMPORTHTML IMPORTXML 오늘은 GoogleSheet 의 함수인, IMPORTHTML과 IMPORTXML을 활용하여서, 크롤링을 하는 방법에 대해서 정리해 보도록 하겠습니다. 1. IMPORTHTML 함수 구글시트에는 무려 html페이지에서 table 또는 리스트를 import 하는 함수가 존재합니다. 문서를 보면 아래와 같이 설명이 되어 있네요. 인자로 url, query, index만 넣어주면 되는데요. query는 "table" 또는 "list"를 넣어주면 되구요. index부분에는 2022. 12. 5.
Target Api 31 ( Android12 ) 에서 적용해야 하는 사항들 # Location Intent Filters exported mutability 이제 개발하는 앱들은 모두 targetAPI를 31로 잡아야 하는데요. 오늘은 어떤 것들에 대응해야 하는지 정리해 보도록 하겠습니다. 1. TargetAPI 31(Android12) 22년 11월 부터는 TargetAPI가 31이하일 경우에는 아래와 같은 경고메시지를 보게됩니다. 신규제출하는 경우에는 이미 22년 8월부터 적용되어 있었구요. 기존앱들의 업데이트의 경우 targetAPI31을 반드시 지켜야 합니다. 2022. 12. 1.
Admob 을 Jetpack Compose 에서 구현하는 방법 # AndroidView 오늘은 Jetpack Compose으로 Admob을 구현하는 방법에 대해서 정리해 보겠습니다. 참고로 Firebase가 현재 앱과 연결되어 있지 않다면, 먼저 아래 링크를 참조해서 firebase에서 프로젝트를 생성하고 google-services.json 파일을 저장해주어야 합니다. (https://firebase.google.com/docs/android/setup) 1. Admob 모듈 dependency 설정 1-1. project level build.gradle project 레벨의 build.gradle에는 다음과 같이 google-services를 추가해 줍니다. buildscript { repositories { google() // Google's Maven repository mave.. 2022. 11. 30.
Admob 테스트 기기등록하는 방법 # 부정클릭 방지 오늘은 Android 에서 Admob을 구현시에, 반드시 해야하는 테스트기기 등록하는 방법에 대해서 정리해 보도록 하겠습니다. 이것을 하지 않고 테스트를 하다가 광고를 클릭하게 되면, 무효클릭 혹은 부정클릭 에 해당되어서 페널티를 받게 될 수 있습니다. 1. Logcat 읽어오기 정상적으로 Test기기에 Admob을 구현해서 배포해 보면, 다음과 같은 로그를 볼 수 있습니다. 이 때, Arrays.asList안에 들어가 있는 값이 해당 device의 ID입니다. 2. Configuration 설정 Configuration은 최초에 한번만 해주면 되기 때문에, Initialize를 했던 Application클래스에서 추가해주면 되는데요. 아래와 같이 RequestConfiguration을 빌드해주면 되는데.. 2022. 11. 29.
Button Selector 구현 방법 # 버튼 눌렸을 때 Interaction Jetpack Compose 오늘은 Jetpack Compose에서 Button Selector를 구현하는 방법에 대해서 정리해 보도록 하겠습니다. 참고로 예전에 xml로 버튼 selector를 구현하는 방법은 아래 글에 정리되어 있습니다. >> Android 에서 Button 눌렸을 때 이미지 변경 방법 1. 예전방식 Selector 예전에는 아래와 같이 selector xml을 정의해서, pressed를 판별해서 눌려서 true이면 A이미지를, pressed 가 false이면 B이미지를 보여주도록 했습니다. 2. Compose 방식 Compose에서는 UI상태를 State을 통해서 얻고 변경하게 되는데요. pressed 상태는 Interaction State을 통해서 얻어올 수 있습니다. val interactionSource .. 2022. 11. 28.
Crashlytics 구현해서 catch 한 Exception 로그 받기 # 에러 로깅 CrashLytics는 앱이 Crash가 났을경우에 알림을 주는 역할을 해 줍니다. 마켓에 앱을 출시했다면, 필수로 사용해야 한다고 할 수 있는데요. Crash를 알려주는 주 기능이외에도, 다양한 기능들이 있지만, 그중에서도 catch한 Exception에 대해서도 알림을 받는 것이 특히 유용합니다. 오늘은 이 방법에 대해서 정리해 보겠습니다. 만약 Firebase내에 현재 앱의 project가 생성되어 있지 않다면, 먼저 아래 링크를 참조해서 프로젝트를 생성해 주세요. (https://firebase.google.com/docs/android/setup) 1. CrashLytics 라이브러리 implementation 1-1. project level의 build.gradle 먼저 project 레벨 .. 2022. 11. 26.