Develop21 [KMP] Kotest로 알아본 Stub vs Fake (테스트 더블) 📚 책의 가장 마지막 장인 12장에서는 "코루틴 단위 테스트"에 대해 다룬다.이때 테스트 더블에 대해 설명해주면서 그 종류 중 하나인 Stub을 들어주었다. 그러나 책을 읽던 당시의 나는 테스트 코드를 처음 접했기에 Stub을 왜 사용하는지 이해가 되지 않았다. 그러다, KMP 프로젝트에서 kotest를 이용해 테스트 코드를 작성할 기회가 있었는데 기존에 사용한 Mockk 라이브러리는 멀티플랫폼에서 사용이 불가하기에 Stub으로 구현해야만 했었다. 이 과정 덕분에 Stub이 무엇인지 이해가 되었고 그 과정을 설명해보려 한다. 테스트 더블우선 테스트 더블에 대해 먼저 알아보자.테스트 더블이란, 다른 객체와 의존성을 가진 객체를 테스트하기 위해 사용하는 것으로 "객체에 대한 대체물"을 의미한다.위 그림처.. 2025. 3. 22. [KMP] Kotest로 테스트 코드 멀티플랫폼에 적용하기 Kotest멀티플랫폼인 KMP에서 테스트코드를 작성하기 위해서는 Kotlin에서 제공하는 테스트 프레임워크인 Kotest를 사용해야 한다. Kotest에는 종류가 여러 가지가 있는데 나는 BehaviorSpec을 선택했다.그 이유는 BehaviorSpec은 아래처럼 given - when - then 형식으로 표현이 가능하여 더 체계적으로 작성할 수 있겠다고 생각했기 때문이다.class UiStateTest : BehaviorSpec({ given("테스트 조건 환경이 주어졌을 때") { ... `when`("테스트 대상 행위가 발생하면") { ... then("의도한 결과가 검증될 것이다.") { ... .. 2025. 3. 9. [Android] Baseline Profile로 성능 개선하기 앱 성능을 개선해보고 싶다는 생각이 들어 찾아보던 도중 Baseline Profile이 있어 이를 적용해보고자 했다.Baseline Profile의 의미와 적용 과정에서의 트러블 슈팅을 담았다. Baseline ProfileBaseline Profile을 사용하면 포함된 코드 경로의 해석과 JIT(Just In Time) 컴파일 단계를 피하여 최초 실행 후 코드 실행 속도가 약 30% 향상된다.사용자가 느끼는 이점으로는 앱 시작 시간 최적화, 상호작용으로 인한 버벅거림 줄임, 전반적인 런타임 시간 개선 등이 있다. Baseline Profile을 적용하지 않더라도 플레이스토어에서 Cloud Profile을 사용하기는 한다.다만, Cloud Profile은 업데이트 후 배포되기까지 수 시간에서 수일이 걸리.. 2025. 2. 18. [Android] ProcessPhoenix 오픈소스 뜯어보기 안드로이드에서 앱을 재시작 해야 할 때 ProcessPhoenix를 사용하면 간편하게 프로세스를 종료하고 다시 앱을 실행할 수 있다.나는 이러한 사실만 알고 있었고, 아래처럼 코드를 작성했을 때 문제가 없어 보였다.Handler(Looper.getMainLooper()).post { Toast.makeText(context, TOKEN_EXPIRED_ERROR, Toast.LENGTH_LONG).show() // 토큰 만료 토스트 메세지 ProcessPhoenix.triggerRebirth(context) // 앱 재실행 코드} 위 코드는 토큰 만료 시 사용한 코드인데 정작 토큰이 만료됐을 때 토스트 메세지만 뜨고 IllegalStateException이 발생하며 앱이 비정상 종료가 되어버린 것이.. 2025. 2. 2. [Android] SnackBar 디자인시스템 구현기 (Material 뜯어보기) 지난 포스팅에 있었던 BottomSheet에 이어, SnackBar도 디자인시스템을 구현하면서 공부했던 것을 기록하고자 한다.스낵바도 바텀시트와 동일하게 컴포즈로 작성이 되어 있으며 Material3 라이브러리를 사용하지 않는다. 사실 스낵바 관련 포스팅은 여러 번 올렸었다.📍스와이프 이벤트 처리: https://comyou.tistory.com/130📍LineBreak 속성: https://comyou.tistory.com/131📍단어 단위 개행: https://comyou.tistory.com/136 그래서 이번 글에서는 Material 속성에 기반한 구현방식에 집중해서 작성할 것이다. SnackBarHostStateSnackBarHostState는 스낵바의 상태를 관리하는 클래스이다.Mate.. 2025. 1. 30. [Android] BottomSheet 디자인시스템 구현기 (Material 뜯어보기) BottomSheet를 디자인시스템으로 구현하면서 Material의 동작 방식을 공부했던 것에 대해 기록하고자 한다.해당 디자인시스템은 컴포즈로 작성이 되어 있으며 Material3 라이브러리를 사용하지 않는다. BottomSheetType우선, Maeterial과는 상관 없는 바텀시트의 디자인이다. 내가 만드려는 디자인시스템의 바텀시트 타입은 두 가지였다. 버튼이 한 개 있는 OneButton 타입버튼이 두 개 있는 TwoButton 타입 각 타입에 대한 각 버튼의 텍스트를 무조건 작성해 줘야 되기 때문에 Sealed Class로 묶어 작성했다.sealed class BottomSheetType { data class OneButton( val buttonText: String .. 2025. 1. 29. [Android] Compose Compiler Metrics로 성능 측정하기 RecompositionJetpack Compose로 안드로이드를 개발하다보면 Recomposition을 경험하게 된다.Recomposition이란, 상태가 변경될 때마다 Composable을 다시 그리는 현상을 의미한다. 만약 컴포즈가 stable한 상태가 아니라면 컴포즈는 불필요한 Recomposition을 자주 발생시킨다.이를 방지하고자 나는 현재 상태가 stable인지 혹은 unstable인지 알 수 있는 방법을 찾아보았다.그러다 Compose Compiler Metrics를 알게 되어 이에 대해 설명해보고자 한다.Compose Compiler Metrics컴포즈 컴파일러는 composable 함수를 컴파일할 때 function(함수)과 type(타입)에 대해 몇몇 태그를 작성한다.이 태그를 통해.. 2024. 12. 27. [Android] 단어 단위의 개행하기 (Compose) 지난번 나는 Jetpack Compose로 단어 단위의 개행을 하기 위해 LineBreak 속성에 대해 알아보았었다.정리한 내용: https://comyou.tistory.com/131 [Android] LineBreak 속성 알아보기Compose의 Text에 있는 LineBreak 속성에 대해 알아보자! Text( text = "터닝에서 내 계획에 딱 맞는 대학생 인턴 찾기를 도와드릴게요", style = TerningTheme.typography.title1, modifier = Modifier .padding(bottom = 36.dp) .bacomyou.tistory.com 그러나, LineBreak의 경우, 한국어는 제대로 반영이 되지 않았다.LineBreak의 Simple, Paragraph .. 2024. 11. 22. [Android] LineBreak 속성 알아보기 Jetpack Compose의 Text에 있는 LineBreak 속성에 대해 알아보자! Text( text = "터닝에서 내 계획에 딱 맞는 대학생 인턴 찾기를 도와드릴게요", style = TerningTheme.typography.title1, modifier = Modifier .padding(bottom = 36.dp) .background(Color.LightGray),) 위처럼 작성 시 나오는 기본 화면은 아래와 같다. 기본적으로 텍스트가 한 글자씩 잘려 줄바꿈 되는 것을 볼 수 있다. 하지만 나는 내가 원하는대로 개행을 하고 싶었고, 이를 위해 Text의 속성 중 하나인 LineBreak에 대해 알아보았다.LineBreak와 관련된 공식문서도 같이 첨.. 2024. 11. 8. [Android] 스와이프 이벤트 AnchoredDraggable로 처리하기 (Compose) 디자인 시스템을 개발하던 중, 내가 구현한 스와이프 기능에 대해 소개해보고자 한다.AnchoredDraggable스와이프 기능이 들어가는 컴포넌트는 스낵바이다.화면에 띄워진 스낵바를 아래로 스와이프 했을 때 사라지도록 해야 하는 것이다. 처음에 나는 Modifier에서 제공하는 swipeable 속성을 사용하고 싶었다.하지만 이는 Deprecated 되었다고 한다ㅜㅜ그래서 찾아보니, swipeable을 대신해줄 AnchoredDraggable라는 속성이 있어서 이를 활용해주고자 했다. 아래는 AnchoredDraggable에 대해 설명하는 공식문서 링크이다!https://developer.android.com/develop/ui/compose/touch-input/pointer-input/migrate.. 2024. 10. 31. [Android] 엠플리튜드(Amplitude) 안드로이드에 설치하기 에서 앱을 릴리즈 한 후, 유저의 경험을 바탕으로 앱을 업데이트 하기 위해 엠플리튜드(Amplitude)를 도입하기로 했다.그래서 안드로이드 프로젝트에 엠플리튜드를 설치하는 방법에 대해 설명하도록 하겠다. 엠플리튜드엠플리튜드란, 사용자의 행동 분석을 용이하게 해주는 도구이다.유저의 데이터가 쌓이면, 어느 버튼을 많이 누르는지, 앱의 리텐션은 얼마나 되는지 등을 분석할 수 있다. 그럼 지금부터 어떻게 설치하는 지 알아보자. 엠플리튜드 사용을 위해서 메니페스트에 권한을 추가해준다. 그리고 엠플리튜드 사용을 위한 라이브러리도 추가해준다.[versions]amplitude = "1.17.3"[libraries]amplitude = { group = "com.amplitude", name = "analytics-.. 2024. 10. 15. [Android] 릴리즈 키 해시 뽑기 앱을 릴리즈 하면 릴리즈 키 해시 값을 별도로 넣어줘야 한다. 릴리즈 해시 키란, 앱을 배포하기 위해 생성한 릴리즈 인증서로부터 해시한 값이다.그래서 이번에 키 해시를 뽑는 방법을 간단하게 알아볼 것이다. release key hash터미널에서 키 해시 값을 뽑는 방법이다. 우선 아래 링크에서 openssl을 다운받는다.https://code.google.com/archive/p/openssl-for-windows/downloads Google Code Archive - Long-term storage for Google Code Project Hosting. code.google.com 그리고 아래 링크에서 jdk도 다운받는다.https://www.oracle.com/java/technologies/.. 2024. 8. 29. 이전 1 2 다음