본문 바로가기

[Android/UI-UX] 텍스트의 일부에 스타일 및 터치 이벤트 설정하기 안드로이드 TextView에 적용하는 Text의 일부의 스타일을 바꾸고, 터치 이벤트도 주고 싶다면 어떻게 해야 할까? Spannable Text로 이를 해결할 수 있다. 1. 적용하고자 하는 string을 toSpannable()을 사용해 Spannable로 만든다. 2. setSpan으로 적용할 Span을 필요한 만큼 설정한다. 클릭 이벤트를 주고 싶다면 ClickableSpan을, 텍스트 스타일을 변경하려면 TextApperanceSpan을 사용한다. 3. 설정이 완료된 Spannable을 적용하고자 하는 TextView의 text에 설정하면 된다. val textView: TextView val sampleString = "Clickable and styleable" val clickableSpa..
[Testing/Unit-test] Context를 포함하는 ViewModel의 Unit Test Problem 유닛테스트를 신규로 도입하게 되면 Testable 하지 않은 프로젝트 코드들과 마주하게 될 때가 있다. 아마 가장 손쉽게 맞닥뜨리게 되는 이슈는 Context를 인자로 받는 ViewModel일 것이다. ViewModel이 Context를 포함해야 하느냐는 논의에 앞서 , 기존 코드를 건드리지 않은 채 테스트 커버리지를 확보하는 방법에 대해 짧게 정리하려 한다. Environments - Kotlin 1.5.21 - Koin 3.1.2 - Mockito 4.2.0 Soluton 1. Context를 Mockito를 사용해 Mock 한다. @Mock lateinit var mockedContext: Context 2. Mocking한 context로부터 필요로 하는 사항에 대한 상세사항을 추가..
[Kotlin/UnitTesting] LiveData Mocking하기 유닛 테스트를 신나게 적용하다 보면, 검증해야 하는 변수나 결과가 LiveData와 맞물려 들어가는 로직과 맞닥뜨릴 수 있다. 여기서 특정 결과값이 특정 LiveData를 Observing하는 방식으로 도출된다면, Mocking하는 것도 쉽지 않을 것이다. 이런 케이스를 해결하기 위해 실 Stub LiveData를 만들어 초기값을 넣어줌으로써, 본래 수행하려던 테스트 케이스를 성공적으로 돌릴 수 있었다! 사용 예를 남기고자 Pizza라는 data class를 담는 LiveData를 예시로 테스트 코드를 작성해보겠다. 테스트 환경은 아래와 같다. Mockito LiveDataTesting https://github.com/jraska/livedata-testing Koin DI Coroutine Clean..
[Kotlin/Coroutine] Kotlin Coroutines 101 : 코루틴을 쉽게 이해해보자! 최근에 여유가 생기면서 코틀린부터 코루틴, flow 등 공부하고 싶던 부분들에 대해 다시 들여다보기 시작했다. 공부를 하면서 눈에 쏙 들어왔던 건 Android Developer 채널에 올라온 아래의 영상이었다. Kotlin Coroutines 101 - Android Conference Talks 일전에 Kotlin in action에서 코루틴에 대해 살펴보기는 했지만, 이 영상을 본 뒤론 이 영상만큼 코루틴의 장점과 사용 방법 등에 대해 잘 알려주는 영상은 앞으로도 없지 않을까 싶다! (개발 영상치고 8만회의 뷰를 기록한 것이 하나의 반증이 되지 않을까?) 해당 영상을 기반으로 코루틴의 장점과 의의, 사용 예 등에 대해 다시 한번 정리하고자 한다. 1. 코루틴은 무엇이며, 무엇을 해결해 주는 걸까? ..
[Android] Android lifecycle과 savedInstanceState 안드로이드의 시작과 끝은 Activity와 Fragment의 lifecycle이다 할 수 있을 정도로 lifecycle에 대한 중요성은 여러번 말해도 모자르지 않다 싶다. 이전부터 개발자들이 가져왔던 고민들은 앱의 화면방향 전환이 일어나는 경우, 언어가 변경되는 경우, 화면 해상도가 변경되는 경우 등 다양한 변수로 인해 기존의 Activity 혹은 Fragment가 destroy된 이후 다시 재생성되는 케이스를 어떻게 대처할 것인지 일 것이다. 이러한 환경에서 주요 변수를 보존하기 위해 안드로이드는 savedInstanceState를 제공한다. 재생성 및 savedInstanceState에 관해 중요한 내용들을 간단히 정리해 보았다! Activity 및 Fragment Activity가 Backgroun..
[Kotlin] 컬렉션의 lazy 연산을 짚어보자 (Sequence) 코틀린에서는 다양한 형태로 시퀀셜하게 결과값을 이어나가는 코딩이 가능하다. 문제는 컬렉션을 베이스로 시퀀셜하게 코드 블럭을 잇는 경우, 이에 대한 결과값들이 연산 이후마다 만들어지기 때문에 (우리는 최종적인 값만을 필요로 함에도 불구하고) 메모리적으로 비효율 적이라 할 수 있다. (특정 컬렉션에 사용하는 조건이 다양하고 많을 수록 받는 영향은 클 것이다) 이를 위해 코틀린은 Sequence를 제공하고 있는데, 컬렉션에 이를 사용하는 경우 호출 원본 리스트에서 이어진 시퀀셜한 모든 연산을 뒤로 이를 toList 등으로 추출하기 이전까지 어떠한 임시 컬렉션 변수를 생성하지 않는다는 것이다! 방법은 간단한데, 보통 사용하던 컬렉션 API 사용에 앞서 원본 리스트에 asSequence()를 호출하고 사용하는 것..
[Kotlin] 컬렉션 함수형 API로 컬렉션 쉽게 갖고 놀기 개발을 하다 보면 리스트형 변수와 필연적으로 마주하게 되는데, 단순히 이런 컬렉션 객체를 사용하는 것에서 넘어 특정한 조건에 따라 필터링을 한 목록을 얻는다던지, 검색한 모든 결과값에서 원하는 결과가 있는지 확인한다던지 하는 요구사항을 필요로 한 적이 있을 것이다. 코틀린을 사용할 때, 이러한 요구사항을 손쉽게 충족해주는 API를 정리해보고자 한다! 컬렉션 함수형 API 우선 Kotlin in Action에서 소개하는 함수 중 필수적인 함수로 소개하는 filter와 map에 대해 살펴보자. filter filter를 사용하는 경우, 호출하는 대상 컬렉션으로부터 필요한 조건을 filter 코드 블럭에 선언하면 조건에 맞는 List로 이를 반환하게 된다. val targetList = listOf("윤철수"..
[객체지향] 최소 지식의 원칙 퍼사드 패턴 리뷰에 앞서 책에서 객체지향의 최소 지식의 원칙에 대해 짚고 넘어가는 곳이 있어 리뷰 후에 넘어가고자 한다. 우선 최소 지식의 원칙은 드미트리의 원칙이라고도 불리며, 아래의 네 가지 규칙을 준수하는 것이 포인트이다. 자기 자신만의 객체 사용 메서드에 전달된 매개변수 사용 메서드에서 생성된 객체 사용 객체에 속하는 메서드 사용 적어두고 생각해보면 알겠지만, 네 가지 원칙을 준수하게 될 경우에 가질 수 있는 장점은 결합도를 낮추는 것이 될 것이다. 우선적으로 자기 자신만의 객체를 사용하고, 필요한 외부 데이터가 있는 경우 이를 매개변수로써 전달받기 때문에, 특정한 다른 클래스를 사용하게 되는 경우에 사용하는 클래스가 변경됨으로써 가질 수 있는 불이익으로부터 자유로운 것이다. (이는 메서드에 전달..