[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으로 변환해 전송 제가 세운 규칙..
[회고][스위프 후기] 6주 만에 기획부터 출시까지, '해봄'을 출시해보자! (스위프 앱 4기 앱 개발 후기)
·
Collaboration
🚀현재 '해봄'은 플레이스토어에서 만나볼 수 있어요!👉🏻 바로가기 👈🏻 동기항상 장기 서비스를 운영하고 싶다는 생각을 해왔는데, 출시가 쉽지 않더라구요..취업할 때가 오니 운영 중인 서비스가 없다는 사실에 불안감이 커지기도 했습니다🥲 그러던 중 인스타그램에서 '스위프'를 발견했어요!스위프는 수익화를 목표로 6주 안에 출시까지 완료해야 하는 활동으로, '단기간'이라는 것이 가장 큰 매력이었어요.그래서 저는 앱 개발자로, 친한 언니는 서버 개발자로 동반 참여하게 되었습니다! 앱 4기 팀빌딩 & 일정먼저 스위프 노션에 자신을 어필하는 '프로필 카드'를 쓰게 됩니다.노션 페이지를 자유롭게 꾸미면 돼요.저는 협업 경험, 작업/소통 스타일, 프로젝트 경험을 포트폴리오 쓰듯이 작성했습니다. 팀빌딩 전에 미..
[Android] Fastlane으로 App distribution 배포를 자동화해보자! (APK CD)
·
Launching
동기팀원 모두가 고생한 끝에 1차 개발이 완료되고..! 남은 건 QA입니다.QA를 원활히 진행하기 위해 Fastlane + App distribution 두 가지 도구를 활용해 자동 배포 파이프라인을 만들어볼게요!이 두가지 도구를 사용하는 이유는 본문에서 자세히 다루겠습니다 😊 App distribution : 왜 쓰나요?QA 진행을 위해 팀원에게 설치 파일을 제공해야 하는데, 저는 이때 App distribution을 사용합니다.이유는 크게 두 가지가 있어요.1. APK 파일 직접 전달의 불편함2. 버전 관리 용이성 저희 팀은 주 소통 도구로 디스코드를 사용합니다.무료 요금제를 이용 중이기 때문에, 10MB를 초과하는 파일은 메시지로 전송할 수 없어요. 현재 저희 서비스는 MVP만 구현한 상태로 화면..
[Android] 릴리즈 해시 키를 뽑아보자 (??? 출시하려니 로그인이 안돼요 ㅠㅠ)
·
Launching
동기이제 슬슬 개발한 앱을 배포할 때가 왔습니다!배포를 위해서는 릴리즈 키 등록과정을 꼭 거쳐야 해요.특히나 제 앱은 구글 소셜 로그인을 지원하기 때문에 키를 등록하지 않으면 로그인 기능이 차단됩니다. 과거의 기억이 떠오르는데요.. 소셜 로그인이 분명 잘 되었는데 출시된 앱을 다운 받아 보니 로그인이 안 되어 멘붕이 왔던 적이 있습니다..여러분은 울지 마시고 차분히 릴리즈 키 등록하시기 바랍니다 🥲(플레이스토어 출시 후 해시 키 다시 등록하는 것도 잊지 마세요!!) 1. 키 생성안드로이드 스튜디오 Build > Generate App Bundle or APK > APK > Create new 찾아줍니다. [아래 내용은 제미나이가 알려줬어요!!]Key store path: 오른쪽에 있는 폴더 아이콘을 누..
[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는 디폴트로 크기/투명도 관련 애니메이션..