[Android] StateFlow와 SharedFlow를 알아보자
·
Android
동기UDF 패턴으로 presentation을 구현할 때 UiState는 StateFlow로, 사이드 이펙트는 SharedFlow 사용이 권장됩니다.StateFlow는 UI에 최신 정보를 제공하기에 적합하고 SharedFlow는 일회성 이벤트에 적합하다 정도로만 알고 있어 내부 구현과 그 동작 방식을 알아보겠습니다. StateFlow항상 최신 데이터를 제공하는 Hot Flow입니다. // -- 사용 예 --// ViewModelprivate val _uiState = MutableStateFlow(initialState)val uiState: StateFlow = _uiState.asStateFlow() private fun getData() { viewModelScope.launch { val n..
[Kotlin] The following declarations have the same JVM signature: JVM과 제네릭 타입 소거를 알아보자
·
Android
동기프로젝트를 하던 중, 레포지토리에서 DTO를 model로 변환하는 과정이 필요했습니다.저는 레포지토리에서 직접 변환하는 대신, DTO 확장함수 형태의 매퍼 함수를 구현했어요. 팀 컨벤션에 맞게 "쇼핑" 관련 DTO 매퍼 함수를 "ShoppingMapper.kt" 파일 안에 두었습니다.쇼핑 API 두 종류가 모두 DTO가 List로 래핑된 응답구조였어서,저는 "List.toModel"까지 구현해주었어요. 제가 작성한 매퍼와 레포지토리는 아래와 같습니다.// ShoppingMapper.ktfun ShoppingHighlightResponseDto.toModel(): ShoppingHighlightModel = ShoppingHighlightModel( id = this.id, ..
[Kotlin] Scope Functions를 알아보자
·
Android
종류Scope function의 종류는 다음과 같습니다.letrunwithapplyalso무엇을 의미하는지, 어떤 경우에 사용하는지 차근차근 알아볼게요! let안드로이드 개발을 하며 가장 많이 사용한 것 같습니다.저는 nullable한 변수의 값이 null이 아닐 때에만 실행하고 싶은 코드가 있을 때 사용해왔어요. 📃 내부 코드@IgnorableReturnValueinline fun T.let( block: (T) -> R): R T.let은 제네릭의 확장함수로 정의한 것으로, 모든 객체가 let을 호출할 수 있습니다.let 블록 내부 코드는 block이라는 람다가 되어 let을 호출한 T 객체를 it으로 참조해, it에 대한 연산의 결과로 R을 반환합니다.let 블록 내 마지막 줄의 결과가 R..
[Android] Amplitude를 연동해보자 (진짜 쉽다)
·
Android
동기 / Amplitude란?대표적인 사용자 분석 도구입니다!리텐션 파악에 용이하고, 유저 행동을 '이벤트'라는 이름의 로그로 찍을 수 있습니다.그래서 유저가 어떤 기능을 어떤 경로로 이용하는지, 어디서 앱을 이탈하는지 등 세세한 추적이 가능해요. 아직 실사용자가 많은 앱은 아니지만, 미리 앰플리튜드를 심어두어야 유저가 모인 후에 원활하게 지표를 분석할 수 있어요!그래서 제가 먼저 PD분께 제안하고, 이벤트를 설계해 구현해보았습니다. 이벤트 설계1. 이벤트/프로퍼티 모두 snake_case 사용 (소문자, 언더바만 사용)2. 닉네임 등 사용자가 직접 입력한 값을 프로퍼티로 보내는 경우, 대소문자 신경쓰지 않고 있는 그대로 전송3. 이벤트명은 동사_명사 id값은 String으로 변환해 전송 제가 세운 규칙..
[Android Studio] 삼성 에뮬레이터를 만들어보자
·
Android
동기그동안 기본으로 제공되는 에뮬레이터 프레임만 써왔는데, 이들은 사람들이 주로 쓰는 디바이스와 달라요.일단 저부터 삼성 갤럭시를 쓰기 때문에~! 기종 별로 에뮬레이터 하나씩 만들어 두고 싶어졌어요. 아래처럼 실기기와 동일한 크기의 에뮬레이터 프레임을 만들고, 삼성이 제공하는 스킨까지 적용해 줄거예요! 1. Samsung Account 계정 생성먼저, Samsung Account에서 계정을 만듭니다.로그인 후 Profile에서 Email ID가 채워져 있는지 확인해주세요! 계정에 등록된 메일이 없으면 다음 단계로 넘어갈 수 없어요. 2. 기종 확인 및 스킨 발급Samsung Developer > Galaxy Emulator Skin에서 원하는 스킨을 다운 받고, 압축 풀어줍니다. 상단에서 주요 스킨을 바..
[Android][Jetpack Compose] 이미지를 불러와, 최적화하고, 서버에 전송해보자 (feat. presigned-url)
·
Android
동기프로젝트 기능 중 '게시글 등록'이 있어요. 게시글에는 '이미지' 등록이 포함되며, 이미지는 presigned-url 방식으로 서버에 전송해야 합니다. 이미지를 효율적으로 처리하며, 클린 아키텍쳐를 위배하지 않고 잘 활용하기 위해 고민한 점이 많아요!제가 겪은 과정을 자세히 작성해보려해요. 갤러리에서 이미지 가져오기 사용한 도구버튼 클릭으로 갤러리를 열어 이미지를 선택하기 위해 Pick(Multiple)VisualMedia를 사용했어요.📷 PickVisualMedia란?안드로이드가 지원하는 이미지 선택 도구로, 별도의 권한 없이 갤러리 접근이 가능해요.사용자가 선택한 이미지를 uri로 반환해 이 uri로 이미지를 처리할 수 있습니다.단, 권한없이 불러온 만큼 file-uri가 아닌 content-u..
[Android][Jetpack Compose] 커스텀 드롭다운 메뉴를 구현해보자
·
Android
동기프로젝트에서 드롭다운 메뉴를 구현했어야 했는데요!드롭다운 메뉴의 기본 UX는 다음과 같습니다.- 필드 클릭 시 메뉴 오픈 또는 클로즈 토글- 메뉴 아이템 클릭 시 선택값 반환 및 메뉴 클로즈- 메뉴 바깥 영역 클릭 시 메뉴 클로즈- 메뉴가 열릴 때 레이아웃 내 다른 요소가 밀리면 안 됨. 즉, 레이아웃과 별개로 동동 떠 있어야 함 여기까지는 컴포즈가 제공하는 DropdownMenu로 구현이 가능해요!! 그러나 저는 DropdownMenu의 몇가지 제약으로 인해, 직접 활용하지 못하고 커스텀 드롭다운을 구현해야했어요. DropdownMenu 제약1. 애니메이션디자인 요구사항으로 메뉴를 여닫을 때 슬라이드 애니메이션 적용이 필요했어요.컴포즈의 DropdownMenu는 디폴트로 크기/투명도 관련 애니메이션..
[Android] 업데이트 안 해도 아이콘을 요리조리 바꾸는 법 (Dynamic App Icon / feat. 듀오링고)
·
Android
동기듀오링고를 아시나요?연속 학습일을 채우지 않으면 앱 아이콘이 바뀌며 링고가 화내고 얼어붙고 난리난리가 납니다.지금은 울고 있네요, 조금 미안한 마음이 듭니다.듀오링고 뿐만 아니라 무신사의 경우도 이벤트 기간에 무진장으로 앱 아이콘을 변경하는 등업데이트 없이 특정 기간 동안 앱 아이콘을 변경하는 서비스가 많아요! 요거 어떻게 할까요?따라해보고 싶어서 무작정 박치기 해봤어요 (^///^) 0. 아이콘 에셋 추가🐱 res 우클릭 > new > image asset > png 파일 불러오기 위 방법으로 아이콘 파일 추가해, mipmap에 저장될 수 있게 해주세요! 1. activity-alias 설정여러 개의 아이콘을 관리할 수 있는 핵심 기능입니다!AndroidManifest.xml 에서 사용하는 태그예..
[Kotlin] Kotlin in Action 3장. 함수 정의와 호출
·
Android
코틀린에서 컬렉션 만들기코틀린은 자바 컬렉션을 그대로 사용하여, 자바와 높은 호환성을 보입니다.listOf, setOf이 그 예 입니다. 코틀린 자체 컬렉션은 없지만, 자바보다 더 많은 기능을 제공합니다.예를 들어 listOf에 last(), max()를 사용하여 마지막 원소와 최댓값을 찾을 수 있어요. 함수를 호출하기 쉽게 만들기이 단원의 목표는 컬렉션을 다루는 커스텀 함수를 만드는 것입니다.커스텀 함수의 조건은 다음과 같습니다.1. 제네릭하다2. 가독성이 좋다 제네릭하다의 의미는, 컬렉션에 저장된 데이터 타입의 영향을 받지 않는다는 것입니다![1, 2, 3]과 ["a", "b", "c"] 두 컬렉션 모두에 적용할 수 있어야 해요. 가독성이 좋다의 의미는 구현부를 찾아보지 않고도 헷갈리지 않게 호출할 ..
[Kotlin] 클래스를 알아보자 (클래스와 프로퍼티 심화편)
·
Android
클래스와 프로퍼티 간단한 정리코틀린의 클래스는 비공개 필드, 공개 게터, (선택적으로) 공개 세터를 디폴트로 제공합니다.class Person( val name: String, // 비공개 필드, 공개 게터 var isMarried: Boolean // 비공개 필드, 공개 게터, 공개 세터)👇person.name = "new name" // ❌ 불가능person.isMarried = true // ⭕ 가능 + 비공개 필드란, 프로퍼티가 저장되는 곳입니다.필드는 비공개하여 직접 접근을 막는 대신 getter/setter를 통해 값을 읽거나 쓸 수 있게 해요. 커스텀 접근자도 만들 수 있어요.내부적으로 관리가 필요하지 않지만, 외부에서 알고싶은 값에 사용하면 될 것 같아요.class Rectangle (v..