two22의 등록된 링크

 two22로 등록된 티스토리 포스트 수는 40건입니다.

compose 넣은 xml 불러오면 에러날 때 [내부링크]

java.lang.IllegalStateException: ViewTreeLifecycleOwner not found from androidx.coordinatorlayout.widget.CoordinatorLayout{25a0d04 V.E...... ......ID 0,0-0,0 #7f090122 app:id/common_container} at androidx.compose.ui.platform.WindowRecomposer_androidKt.createLifecycleAwareViewTreeRecomposer(WindowRecomposer.android.kt:244) at androidx.compose.ui.platform.WindowRecomposer_androidKt.access$createLi..

오픈소스 라이선스 만들기 [내부링크]

앱을 출시하기 위해선 오픈소스 라이선스를 작성해야한다. ( 앱 몇개 다운받아보니 거의 안쓰는 듯...? ) 직접 다 찾아서 타이핑하기에는 귀찮기도 하고, 뭘 써야하는지 모르겠어서 찾다보니 라이브러리가 있었다. gradle-license-plugin https://github.com/jaredsburrows/gradle-license-plugin jaredsburrows/gradle-license-plugin Gradle plugin that provides a task to generate a HTML license report of your project. - jaredsburrows/gradle-license-plugin github.com 1. 라이브러리 추가 buildscript { ... dep..

잘되던 쿼리 heroku 에서만 에러 날때 [내부링크]

개발은 mySql 로 하고 heroku 에 올리려니 postgreSQL 를 사용하라 해서 사용했다. 그러니 멀쩡하게 돌아가던 코드가 heroku 에 올라가니 에러가 발생했다... select user.id, user.last_name, a, b, c from join where endDate = 20201231 에러 1 django.db.utils.ProgrammingError: 오류: 구문 오류, "." 부근 LINE 1: select user.id, user.last_name , result.rank, result.total_u... 아무리 봐도 user.id 라는 구문이 이상하지는 않아 보이는데 에러가 발생한다. 찾아보니 postgreSQL 에서 user 가 예약어라서 테이블로 쓸려면 "user" ..

Error ) NavigationExtensions - does not have a NavController set [내부링크]

에러 내용 java.lang.RuntimeException: Unable to destroy activity .... does not have a NavController set Caused by: java.lang.IllegalStateException: View androidx.fragment.app.FragmentContainerView{d4cc327 V.E...... ......ID 0,143-1080,1868 #7f0900e0 app:id/main_nav_container} does not have a NavController set 재현 상황 android/architecture-components-samples Samples for Android Architecture Components. ..

Clean Agile - Chapter 5 [내부링크]

클린 애자일 애자일의 기본으로 돌아가라!애자일 선언이 첫선을 보인 지 20년 가까이 지난 지금, 살아있는 전설 로버트 C. 마틴(“엉클 밥”)은 새로운 세대에게 애자일 가치와 실천 방법을 다시 소개한다. 애 www.yes24.com 위의 책 내용을 참고하여 정리한 글입니다. 자세한 내용은 책에서 확인하세요. 애자일 하다는 것은 애자일에 포함된 기술 실천 방법을 도입하는 것이다. TDD, 리팩터링, 단순한 설계, 짝 프로그래밍 등의 기술 도입이 없다면 애자일이 아니다 테스트 주도 개발 TDD의 세 가지 규칙 1. 코드를 먼저 작성하면 안 된다. 2. 실패를 위한 테스트 코드를 만들려 하면 안 된다. 3. 테스트 통과를 위해 필요한 것 외에 더 많은 코드를 작성하면 안 된다. 장점 1. 디버깅이 거의 필요 ..

Dagger ( Hilt ) 2.31 - 변경된 ViewModel 주입 [내부링크]

Hilt 2.31에서 ViewModel 주입 방법이 바뀌었다. 기존 코드 implementation "com.google.dagger:hilt-android:2.30.1-alpha" kapt "com.google.dagger:hilt-android-compiler:2.30.1-alpha" implementation 'androidx.hilt:hilt-lifecycle-viewmodel:1.0.0-alpha02' kapt 'androidx.hilt:hilt-compiler:1.0.0-alpha02' class StartViewModel @ViewModelInject constructor( @Assisted private val savedStateHandle: SavedStateHandle, private ..

ViewModel - SavedStateHandle [내부링크]

ViewModel에서 상태 저장을 위해선 SavedStateHandle를 사용하면 된다. class SampleViewModel @ViewModelInject constructor( @Assisted private val savedStateHandle: SavedStateHandle ){ companion object { const val DATE_TYPE_KEY = "DATE_TYPE_KEY" const val IS_EMPTY_KEY = "IS_EMPTY_KEY" } private val _isEmpty = savedStateHandle.getLiveData(IS_EMPTY_KEY) val isEmpty: LiveData get() = _isEmpty private var dateType: Int? =..

Clean Agile - Chapter 4 [내부링크]

클린 애자일 애자일의 기본으로 돌아가라!애자일 선언이 첫선을 보인 지 20년 가까이 지난 지금, 살아있는 전설 로버트 C. 마틴(“엉클 밥”)은 새로운 세대에게 애자일 가치와 실천 방법을 다시 소개한다. 애 www.yes24.com 위의 책 내용을 참고하여 정리한 글입니다. 자세한 내용은 책에서 확인하세요. 메타포 ( = 유비쿼터스 언어 ) 팀에서 정한 어휘나 용어를 메타포라 하고, 이를 잘 활용하면 효율적으로 의사소통을 할 수 있다. 가장 흔한 예로 Cookie 가 대표적이고, Cookie 값을 추가할 때 "쿠키를 구웠다"라고 말하는 것도 마찬가지로 메타포이다. ( 헨젤과 그레텔에 바닥에 쿠키를 길을 찾기 위해 남겼다 => 정보를 남긴다. => 쿠키 가 어원이라는데 맞는진 모르겠다. ) 지속 가능한 속..

Clean Agile - Chapter 3 [내부링크]

클린 애자일 애자일의 기본으로 돌아가라!애자일 선언이 첫선을 보인 지 20년 가까이 지난 지금, 살아있는 전설 로버트 C. 마틴(“엉클 밥”)은 새로운 세대에게 애자일 가치와 실천 방법을 다시 소개한다. 애 www.yes24.com 위의 책 내용을 참고하여 정리한 글입니다. 자세한 내용은 책에서 확인하세요. 애자일 실천 방법 중 비즈니스와 연관된 것이 많고, 계획 세우기, 작은 릴리스, 인수 테스트, 전체 팀이 포함된다. 이 중 계획 세우기에 대한 내용이다. 계획 세우기 프로젝트의 크기를 추정하기 힘들다면, 더 작게 쪼개고 쪼개서 추정하면 된다. 하지만 추정이 매우 정밀하고 확실하면 의미가 없다. 추정은 추측이다. 작은 비용으로 대략 어느 정도 걸릴지 알고 싶은 것이다. 삼변량 분석 최선, 일반, 최악 ..

Clean Agile - Chapter 2 [내부링크]

클린 애자일 애자일의 기본으로 돌아가라!애자일 선언이 첫선을 보인 지 20년 가까이 지난 지금, 살아있는 전설 로버트 C. 마틴(“엉클 밥”)은 새로운 세대에게 애자일 가치와 실천 방법을 다시 소개한다. 애 www.yes24.com 위의 책 내용을 참고 하여 정리한 글입니다. 자세한 내용은 책에서 확인하세요. "우리 프로그래머가 세상을 지배한다. 그리고 아주 엉망으로 하고 있다." "테스트 묶음이 있는 소프트웨어는 얼마나 될까?" "테스트 묶음이 소프트웨어의 정상 작동을 엄밀하게 증명한다고 말할 수 있는 프로그래머는 얼마나 될까?" 관리자, 사용자, 고객이 개발자인 우리에게 기대하는 것들을 부응하는 것도 애자일 개발의 주요 목표이다. 기대하는 것들 우리는 쓰레기를 내보내지 않겠다. "사용자가 프로그래머처..

Clean Agile - Chapter 1 [내부링크]

클린 애자일 애자일의 기본으로 돌아가라!애자일 선언이 첫선을 보인 지 20년 가까이 지난 지금, 살아있는 전설 로버트 C. 마틴(“엉클 밥”)은 새로운 세대에게 애자일 가치와 실천 방법을 다시 소개한다. 애 www.yes24.com 위의 책 내용을 참고 하여 정리한 글입니다. 자세한 내용은 책에서 확인하세요. " 좋음, 빠름, 저렴함, 완성. 이 중 셋만 고를 수 있다. 네 번째 것은 가질 수 없다. " - Iron Cross 저렴하며 빠르고 완성은 가능하지만 과연 좋은 품질을 가질까? 빠르고 좋고 완성은 가능하지만 과연 저렴할까? 애자일에서 좋은 관리자는 네 가지 조건을 100%로 만들려 하지 않고 가중치를 관리한다. 뭘 보고 가중치를 정해야 할까? 프로젝트를 진행하고 있다. 마감 기한은 두달이 남았고..

Retrofit - 세션 유지하기 [내부링크]

https://github.com/square/okhttp/tree/master/okhttp-urlconnection square/okhttp Square’s meticulous HTTP client for the JVM, Android, and GraalVM. - square/okhttp github.com 세션 ( Session ) 을 유지한다는 것은 쉽게 서버가 응답으로 보내는 쿠키 정보 ( "Set-Cookie" ) 를 다음 요청에 포함시킨다는 것을 말한다. 서버 요청에 주로 사용되는 Retrofit 은 단발성 요청만을 지원하기에 내부적으로 따로 세션을 유지해주지 않는다. 사실 API 기반의 요청이 주가 되는 안드로이드에서는 이러한 세션 유지는 크게 필요가 없다. 연결을 보장하기 위해선 대부분 T..

Error ) ViewPager2 - onAttachedToRecyclerView [내부링크]

에러 내용 java.lang.IllegalArgumentException at androidx.core.util.Preconditions.checkArgument(Preconditions.java:36) at androidx.viewpager2.adapter.FragmentStateAdapter.onAttachedToRecyclerView(FragmentStateAdapter.java:132) at androidx.recyclerview.widget.RecyclerView.setAdapterInternal(RecyclerView.java:1209) viewpager2에 adapter 연결 시에 크래시 발생 재현 경로 발견한 재현 경로는 2가지다. 더 있을수도 있음 첫 번째 Activity의 클래스 변수로..

2020년 되새김질 [내부링크]

파트원들 다하는 것 같으니 나도 2020년 되새김질을 하려 한다. 1. 첫 숟가락 글 쓰기 3월부터 난생 처음으로 기술 블로그를 쓰기 시작했다. 거창한 마음으로 티스토리 만들고 딱 2개 쓰고 4개월을 안썻다. 그리고 6월 부터 다시 공부한 것들을 조금씩 정리하기 시작했다. 이때 블로그 이름도 "루크의 코드테라피" 로 바꿧다. 거의 한달 동안 열 댓개 넘개 글을 쓰고나니 진이 빠져버렸다. 이름이 "테라피" 인데 직원은 치료혜택이 없었다. 어느 순간 안 쓰다보니 5개월이 지났다. 두둥.. 플루터 파트에 플루터 바람을 일으켰다. 주구장창 플루터를 외친 끝에 스터디를 하게 됐다. 다들 Dart 부터 스터디를 하고, 문법을 다 외어야?.. 풀 수 있는 문제들을 만들어서 파트원들에게 던져 주었다. 앱으로 만들어서 ..

Day + 4 [내부링크]

잘 보면 보이는 물방울 행진곡

Hilt - @SingletonComponent [내부링크]

Hilt 2.28.2 버전부터 @ApplicationComponent 어노테이션이 @SingletonComponent 을 상속받는 형식으로 변경되었고, @ApplicationComponent 가 추후 릴리즈에서 제거된다고 알렸다. 이 말을 듣고 나니 @ApplicationComponent 인 모듈에서는 @Singleton 없이도 싱글톤으로 동작을 했었나??? @Singleton 을 없애고 돌려봤다. 미친 듯이 찍어 내는 걸 보니 아니다. 이슈를 훑어보니, hilt를 순수 자바 / 코틀린에서 도입할 경우 @ApplicationComponent 란 이름을 사용하는 것이 무슨 의미가 있는가? @ActivityScoped 와 같은 scope 역시 의미가 있는가? 라는 이슈가 있었고, 그에 대한 해답으로 @Sin..

Kotlin Channel - 코루틴간 데이터 통신 [내부링크]

Channel 이란? 앞에서 본 Flow가 단일방향으로 데이터를 던지고 받는 형식이라면 Channel 은 여러 방향에서 데이터를 던지고 받는 형식으로 코루틴 끼리의 데이터를 전달하기 위한 위한 친구이다. 구조는 BlockingQueue 와 비슷하며, 동일하게 ThreadSafe 한 형태의 구조를 가지고 있다. 기본적인 사용법 기본적인 사용법은 간단하다. val channel = Channel() CoroutineScope(Dispatchers.Default).launch { channel.send(it) channel.receive() } channel.close() Channel() 함수를 통해 생성할 수 있으며, 데이터를 스트림에 밀어 넣을 땐 send, 스트림에서 받을 땐 receive 를 사용하면..

Espresso intents - 카메라 촬영 테스트 하기 [내부링크]

오늘은 에스프레소 테스트 도중에 카메라 촬영을 진행하는 방법을 알아보자. 시작하기 전에 만에 하나라도 카메라에 보이는 장면을 실제로 촬영하기를 원한다면 에스프레소만으로는 불가능하며 카메라 기능을 직접 구현하거나, 내가 직접 만든 카메라 앱과 함께 테스트하거나 두 가지 방법뿐이다. ( 물론 본인이 모든 카메라 앱의 버튼의 위치나 버튼 ID를 때려 맞출 자신이 있다면 가능하다. ) 그러니, 만약 그런 걸 원한다면 정신건강에 매우 해롭기 때문에, 깔끔하게 에스프레소랑은 거리를 두자. 우리의 목적은 인텐트를 조작하여 카메라가 실제로 촬영된 것처럼 돌아가도록 로직을 만들 것이다. 라이브러리 androidTestImplementation 'androidx.test.espresso:espresso-intents:3...

Android - java.time 패키지 [내부링크]

안드로이드에서도 자바 8 지원으로 java.time 패키지를 사용할 수 있게 되었다. 이제 문제 덩어리 였던 Calender 버리고 java.time 패키지의 새로운 클래스인 LocalTime, LocalDate, LocalDateTime 들을 사용하면 된다. 코드는 전반적으로 joda-time 과 유사한 형태를 이루고 있고, 추가적인 개선이 이루어졌다고 한다. Java 8 은 gradle 에 아래와 같이 추가 하면 사용할 수 있다. compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = '1.8' } 날짜, 시간 가져오..

Kotlin Flow #4 - onXXX 함수와 예외처리 [내부링크]

이번에는 알아볼 것은 플로우에서 시작, 완료, 에러 등의 상태 처리 등을 하는 함수들이다. 시작할 때 flowOf(1, 2, "String", 3).onStart { emit("Start1!!!") }.onStart { emit("Start2!!!") }.collect { println(it) } result : Start1!!! Start2!!! 1 2 String 3 onStart 함수는 Flow 가 실행을 시작할 때 특정 데이터를 방출할 수 있도록 지원한다. 선언 위치는 사용전이면 상관없으며 여러 번 사용하면 순서대로 전부 실행된다. 비어있을 때 emptyFlow().onEmpty { emit("is Not Empty") }.collect { println(it) } result : is Not E..

Kotlin Flow #3 - Zip And Combine [내부링크]

Rx에서 zip이나 combineLatest 등으로 여러 응답을 결합하여 사용하듯이, 코틀린에서도 여러 개의 Flow를 결합하여 사용할 수 있는 함수를 제공한다. Flow 함께 사용하기 1. Zip val nums = (1 .. 3).asFlow() val strs = flowOf("one", "two", "three", "four").onEach { delay(1000) println("str") } nums.zip(strs) { a, b -> "$a -> $b" }.collect{ delay(1000) println(it) } result : 1 -> one 2 -> two 3 -> three 첫 번째 방법으로 zip 을 이용할 수 있다. zip 은 결합된 모든 Flow 가 데이터를 방출하기를 기다리..

Kotlin Flow #2 - 연산자들 [내부링크]

Flow에서 사용할 수 있는 다양한 연산자들을 정리한다. 아래 나오는 연산자들은 Flow 나 데이터의 조작을 위한 것으로 따로 실행을 시키지 않는다면 아무런 동작도 시작하지 않는다. ( collect, launchIn 등등 ) 개수 제한 연산자 (1..3).asFlow().take(2).collect{ println("$it") } take 연산자는 특정 개수까지만 데이터를 받고 싶을 때 사용하는 연산자이다. 지정한 개수까지만 방출한 후에 남은 데이터에 상관없이 Flow는 자동으로 취소된다. 숫자를 마이너스로 넣을 경우 에러가 발생한다. 버퍼 연산자 private fun getNumbers(): Flow = flow { for (i in 1..5) { delay(200) emit(i) } }.flowOn..

Kotlin Flow #1 - 기본 사용법 [내부링크]

Flow 란? 코틀린 플로우는 suspend function을 보완하기 위해 나온 친구이다. 비동기 동작의 결과로 suspend function 이 하나의 결과물 던진다면, 플로우를 이용하여 여러 개의 결과를 원하는 형식으로 던질 수 있다. 특징 비동기이며 코루틴에서만 동작 가능한 것은 suspend function 과 동일하다. 다른 점은 함수 앞에 suspend 를 붙이지 않아도 된다. cold stream ( kotlin의 sequence )으로 동작하며 hot stream 은 지원하지 않는다. 그렇기에 데이터는 요청할 때마다 처음부터 새로 발행되며, 요청 전에는 선언만 있을 뿐 아무런 동작도 하지 않는다. 직접 취소할 수 있는 함수는 따로 제공하지 않는다. Flow 생성 우선 Flow를 생성하는 ..

Android Hilt - WorkManager [내부링크]

Dagger - Hilt 에 이어서 Hilt에서 워크 매니저에게 주입하는 법을 알아보려 한다. 방법은 간단한데, 굳이 작성한 이유는 "E/WM-WorkerWrapper: Could not create Worker" 에러 때문이다. 시작하기 implementation 'androidx.hilt:hilt-work:1.0.0-alpha01' 워크 매니저를 힐트와 함께 사용하려면 위의 라이브러리를 추가해야 한다. WorkFactory 설정하기 @HiltAndroidApp class UsageApplication : Application(), Configuration.Provider { @Inject lateinit var workerFactory: HiltWorkerFactory override fun getW..

Android Espresso #1 - 시작 [내부링크]

Espresso? 간단하게 설명하면 안드로이드 UI 테스트를 위한 라이브러리이다. 간결한 코드로 화면 정보에 대한 어셜션을 진행할 수 있고, 테스트에 집중 할 수 있도록 백그라운드 실행에 대한 동기화는 에스프레소가 처리해준다. ※ 아래 과정을 진행하기 전에 Settings > Developer options으로 가서 애니메이션 관련 기능을 다 끄는 걸 권장합니다. ( 애니메이션이 도는 사이에 UI 테스트가 진행되어 원치 않은 결과가 나올 수 있습니다. ) 시작하기 android { ... defaultConfig { ... testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" // 이미 있음 } } dependencies { ... an..

Android & Java - Reflection [내부링크]

Reflection? 리플렉션은 자바 기능 중 하나로, 클래스나 인터페이스의 정보에 직접 접근할 수 있도록 하는 API이다. private 변수나, 함수, 생성자 등의 정보에 접근이 가능하다. 테스트 클래스 class SampleClass private constructor(private val privateInt : Int, private val privateString: String) { private var privateField: Boolean = true private fun privateFunction(): Boolean { return false } } 위의 코드와 함께 설명하려 한다. 코드를 보면 생성자, 변수, 함수 죄다 private이다. 리플렉션을 통해서 생성하고, 변수를 조작하고, ..

Android & Java - Dynamic Proxy [내부링크]

Dynamic Proxy? 간단하게 함수의 실행 전에 특정 인터페이스를 거치도록 만들 수 있는 자바 기능 중 하나이며, 컴파일 타임이 아닌 런타임에 만들 수 있는 프락시이다. 안드로이드에선 대표적으로 Retrofit 이 다이나믹 프록시를 사용하여 구현되어있다. 간단한 예제와 함께 설명하겠다. Dynamic Proxy 생성과 사용 interface ProxyInterface { fun doSomething() } val MyProxy = Proxy.newProxyInstance( ProxyInterface::class.java.classLoader, arrayOf(ProxyInterface::class.java), InvocationHandler { proxy, method, args -> doSomeTh..

Android Espresso #4 - ActivityRules [내부링크]

이번에는 UI 테스트에서 사용하는 ActivityRule 에 대해서 설명할 것이다. Rule 에는 ActivityTestRule, ActivityScenarioRule 두 가지가 존재한다. 또, Rule 없이 사용하는 방법으로 ActivityScenario 가 존재한다. 구글은 ActivityScenarioRule 나 ActivityScenario 를 쓰기를 권장하고 있으니 해당 부분만 보아도 된다. TestRule 우선 Rule의 동작은 간단하다. @Before 단계 이전에 실행되며 @After 단계가 끝난 후 종료된다. @Before, @After 가 없으면 모든 @Test의 시작과 끝에 맞춰 실행된다. ActivityRule의 경우로 보면 @Before 단계 이전에 액티비티 Rule이 생성되고 @A..

Android Espresso #3 - RecyclerView [내부링크]

이번에는 RecyclerView 관련 액션을 지원하는 RecyclerViewActions에 대해 설명하고, 예제와 함께 RecyclerView의 UI 테스트를 작성하려 한다. 시작하기 androidTestImplementation 'androidx.test.espresso:espresso-contrib:3.2.0' "espresso-contrib" 라이브러리는 몇 가지 뷰에 대한 추가적인 Matcher와 Action 들을 제공한다. ( 당연히도 직접 구현해도 동일한 기능이 가능하다. ) 리사이클러뷰에서 사용할 Action 들도 추가가 되어있다. RecyclerViewActions RecyclerViewActions 가 바로 RecyclerView를 위해 추가된 Action이다. 총 6개의 Action 이..

Android Espresso #2 - ViewMatcher, ViewAction, ViewAssertion [내부링크]

ViewMatchers, ViewActions, ViewAssertions에 포함된 함수들과 어떤 식으로 사용해야 하는지를 설명하고, 주의할 점들을 알아보려 한다. ViewMatchers 뷰의 상태와 Matcher 함수들을 모아 놓은 클래스이다. ViewMatchers는 뷰를 찾기 위해서도 ( onView ) 쓰고, 뷰의 상태를 확인하기 ( check ) 위해서도 사용한다. onView(withText("Welcome")) .check(matches(allOf(isDisplayed(),withText("Welcome")))) 위의 코드에서 사용된 withText, isDisplayed 같은 것들이 ViewMatcher이다. ViewMatchers안에는 몇십 개 이상의 함수가 있기에 모두 소개할 수 없고,..

[And] navigation #2 - 딥 링크 [내부링크]

네비게이션 딥링크 네비게이션에서는 외부에서 발생하고 url 을 이용한 암시적 딥링크, 알림이나 위젯등 내부에서 발생하고 PendingIntent 을 이용한 명시적 딥링크 두 가지가 존재한다. 1. 암시적 딥링크 딥링크 생성하기 암시적 딥링크는 네비게이션 툴에서 추가 할 수 있으며, 코드로는 위와 같이 작성하면 추가가 가능하다. 위의 경우는 fragment121 화면으로 이동하기 위해 "page/fragment121" 라는 딥링크를 설정하였다. 네비게이션의 딥링크는 앞에 scheme ( http, https ) 을 자동으로 붙여준다. 주의 할 점은 "app://page/fragment121" 식으로 작성한다고 "app" 이 scheme 으로 설정되지는 않는다. scheme 은 무조건 http 아니면 htt..

[And] navigation #1 - 기본 사용법 [내부링크]

Navigation? Navigation 은 Activity - Fragment 구조에서 빠질 수 없는 Transaction을 보다 쉽게 구현하기 위한 Jetpack Component이다. Transaction 외에서 애니메이션, 딥링크, 뷰 모델 공유들의 기능을 가지고 있다. 시작하기 -- project ------------ dependencies { classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.3.0-alpha06" } -- app ---------------- apply plugin: "androidx.navigation.safeargs.kotlin" dependencies { implementation "androidx..

안드로이드 paging 3.0 #2 - LoadState [내부링크]

#1 에선 기본적인 Paging3을 구현하였고 여기선 Paging3 에서 LoadStateAdapter, LoadState 를 알아보려 한다. ( #1에 포함된 코드는 적지 않음. ) 시작하기 위의 예제를 만드어보려 한다. LoadState sealed class LoadState( val endOfPaginationReached: Boolean ) { ... class NotLoading( endOfPaginationReached: Boolean ) : LoadState(endOfPaginationReached) { ... } object Loading : LoadState(false) { ... } class Error( val error: Throwable ) : LoadState(false) { ..

안드로이드 Paging 3.0 #1 - 맛보기 [내부링크]

Paging 라이브러리란? 페이징을 쉽게 구현하기 위해 안드로이드에서 제공하는 라이브러리이다. 최근 3.0 Alpha 버전이 릴리즈 되었단 걸 알게 되었다. Paging2와 변한 점 DataSource 관련 코드가 PagingSource 하나로 통합되었다. Header, Footer, separator를 넣을 수 있는 코드 (insertHeaderItem, insertFooterItem, insertSeparators)가 추가되었다. 로딩 처리를 쉽게 할 수 있다. 데이터 refresh 에 대한 처리가 추가되었다. 로딩 시 발생하는 에러 처리를 쉽게 할 수 있다. 더 이상 Config 생성 방식이 빌더 패턴이 아니다. 데이터의 캐싱이 가능하다. 위에 7가지 정도가 바뀌었다. 기존 Paging 보단 코드가..

Dagger - Hilt 간보기 [내부링크]

Hilt 란? Hilt는 기존 Dagger2를 보일러 플레이트 코드를 제거하기 위해 안드로이드의 구조에 맞춰 몇 가지 Annotaion을 추가한 라이브러리이다. 안드로이드 11 프리뷰에서 Hilt 를 공식적으로 Jetpack에 합류시킨다고 발표했다. 간단한 예제와 함께 살펴보자. 1. 시작하기 /-- build.gradel(project) --/ classpath 'com.google.dagger:hilt-android-gradle-plugin:2.28-alpha' ------------------------------------------------------------------------------- /-- build.gradel(app) --/ apply plugin: 'dagger.hilt.an..

Android 에서 미리보기 ( Open Graph ) 만들기 [내부링크]

앱을 사용하다 보면 링크들에 대해서 미리보기를 만들어 주는 경우가 있는데, 이럴 때 사용되는 게 바로 OpenGraph 이다. 그래서 Open Graph 가 간단하게 뭐냐? html 의 head 안에 있는 meta 정보중에 " og " 란 prefix 가 붙은 이 녀석들이 바로 openGraph 이다 property 의 종류는 아래 공식 사이트에서 정의 하고 있다. Open Graph protocol The Open Graph protocol enables any web page to become a rich object in a social graph. ogp.me 그럼 Android 에선 어떻게 하냐? 기본적으로 많이 알려진 내용은 Jsoup 을 사용하는 방법인데, 너무 많다. 그리고 난 이거 하나 ..

Android 에서 Firebase Test Lab 로그인 하기 [내부링크]

참고: 테스트 대상 앱 외부의 사용자 작업은 Robo 스크립트 기록으로 캡처되지 않습니다. 예를 들어 Facebook, Twitter, 기타 소셜 앱을 통한 로그인은 기록되지 않습니다. 위의 글을 읽고 로그인 기반 앱에서 3rd party 로그인을 사용하면 사전 출시 보고서에서 로그인을 뚫고 테스트를 할 수 없.. 는 줄 알았다. val isFromTestLab = Settings.System.getString(contentResolver, "firebase.test.lab") if (isFromTestLab == "true") { // do setting } 해결