전체 글
-
Android AdMob Native AdAndroid 2023. 3. 6. 21:07
안녕하세요 MashUp 11기 양민욱입니다 :) 좋은 앱 서비스를 완성했다면 그다음 고민은 수익 모델이죠. AWS 등 클라우드 서비스를 통해 서버를 구축했다면 다달이 나오는 서버 비용을 무시할 수 없기 때문이에요… 그렇기 때문에 우리 Android 개발자들은 Admob 광고 SDK를 앱에 잘 녹여들 수 있게 고민을 시작해야 합니다. 최근 Admob 네이티브 광고를 개인 프로젝트에 적용하느라 아주 고생을 많이 했습니다. 라이브러리 자체를 적용하는 것은 어렵지 않았지만 우리 프로젝트 앱들은 모든 코드가 Activity class 하나 파일에 들어가 있는 형태는 아니잖아요? 여러 가지 다양하고 복잡한 구조로 구성되어 있는 데, 공식 문서에서 소개해준 코드는 간단하게 적용한 방법뿐이고 커스텀하게 이용할 수 있는..
-
SDK를 어떻게 설계하고 개발했는가Android 2023. 3. 6. 21:03
개요 기존에 내가 하던 업무는 하이브리드 앱 개발을 위한 API를 설계하고, 제공하는 것이었다. 어쨌거나 유지보수이기 때문에 일은 늘 비슷했다. (어떻게든 구조를 개선해 보고자 노력했지만 혼자만의 노력이었다는 후문이^_ㅠ) 그러던 중 굉장히 갑작스럽게 SDK를 기획, 설계, 개발, 테스트까지 해야 하는 상황이 되었다. 그것도 상반기에 하나, 하반기에 하나 총 두 건이나… 유경험자나 인력은 당연히 없었기 때문에 바닥부터 시작해야 했다. 그래서 이 글은, SDK를 위해 북도 치고 장구도 친 삽질기이다. 설계부터 막막해요 안드로이드 개발자라면 새로운 프로젝트 설계 시 이미 만들어진 패턴(MVC, MVP, MVVM 등) 중 프로젝트에 적합한 패턴을 적용한다. 그리고 나 또한, 첫 번째 SDK를 설계할 때 MVV..
-
확장 함수, 람다 함수, 고차 함수의 기초Kotlin 2023. 3. 6. 20:58
Kotlin에서는 확장함수, 람다 식, 고차함수를 적절하게 사용하면 코드가 깔끔해지고, 공통 코드 구조를 뽑아낼 수 있습니다. 확장 함수의 기본 확장 함수는 간단합니다! 확장 함수는 어떤 클래스의 멤버 메소드인 것처럼, 즉 원래 클래스 안에 선언되어 있는 것처럼 호출이 가능하지만 사실은 그 클래스 밖에 선언된 함수입니다. 아주 쉬운 예제로 확인을 해보면, 한 문자열의 가장 마지막 문자를 출력해보는 예제입니다. fun String.lastChar(): Char = this.get(this.length - 1) 확장 함수는 일반 함수의 선언처럼 fun 키워드로 시작합니다. 이후에 확장할 클래스 이름( 이를 수신 객체 타입이라고 한다 )을 적고 점(.) 뒤에 함수의 이름을 적어주고, 함수 답게! 괄호 ()를 ..
-
Clean Architecture - Use case in AndroidAndroid 2023. 3. 6. 20:49
안녕하세요:) 안드로이드 팀 10기 유희진입니다. (꾸벅) 이번 뀨니뀨니와 아이들 안드로이드 팀에서 들어만 보았던 Clean Architecture를 적용해보았습니다. 적용하면서, 아예 처음 들어보았던 레이어가 있었는데요, 바로 UseCase 입니다. 네 녀석 누구더냐!!? 진호님께서 유즈케이스레이어에 대해서 설명해주실 때 제가 한 대답이 아직도 생각나네요. “(띠용) 그.. 소프트웨어공학에 UML에 나오는 유즈케이스 말하는건가요..?” 하지만 결국 그 유즈케이스가 이 유즈케이스가 맞더라구요!?!? Use case란? In general Use case란 만들고 있는 서비스를 사용하는 유저가 이 서비스(또는 시스템)을 통해 하고자 하는 것을 말한다고 합니다. 예를 들어, ‘음식점’이라는 서비스가 있다고 ..
-
Jetpack Compose 를 도입하기 전에 알아야할 6가지Android 2023. 3. 6. 20:43
Jetpack Compose는 구글에서 개발한, 모던한 안드로이드 개발을 위한 UI Toolkit 입니다. 컴포즈는 기존의 View System 대비 보다 적은 코드로 네이티브 UI 를 구축할 수 있게 해줍니다. 최근 개발 생태계에서는 선언형 프레임워크가 주목받고 있습니다. React, SwiftUI, Flutter, Jetpack Compose 등 다양한 플랫폼에서 마크업이 아닌 선언형으로 UI 를 구축하는 방식에 대해 채택하고 있는 것이 그 증거입니다. 안드로이드는 태생부터 xml 기반의 레이아웃 구성을 기반으로 UI 를 구축해왔기 때문에 새로운 패러다임인 Jetpack Compose 로 전환하는 것이 꽤나 큰 변화인데요. 만약 Jetpack Compose 로의 마이그레이션을 검토하고 계시다면, 혹은..
-
Airbnb Mavericks 살펴보기Android 2023. 3. 6. 20:40
안드로이드 앱을 개발하다가 보면, 현재 화면에 필요한 데이터들을 어떻게 관리하는게 좋을까 하는 고민거리가 생깁니다. 데이터들은 이전화면에서 받아온 extra 일수도 있고, SQLite/Preference/Server api 등 각기 다른 DataSource에서 가지고 올 것입니다. Activity / Fragment의 전역변수로 가지고 있거나, ViewModel의 LiveData 형태 등등 다양한 형태로 저장을 하고 있습니다. 하지만, 특정 시점에 어떤 데이터를 가지고 있는지, 반대로 데이터만 보고 사용자가 어떤 행동을 해왔었는지를 추적하고 싶은 요구사항이 생겼을 경우에 손쉽게 해결할 수 있을까요? 혹은, 이벤트처리 / 데이터 처리를 좀 더 손쉽게 할 수 있는 방법이 있지 않을까요? 해서 등장한 개념인 ..
-
How do Kotlin coroutines work internallyKotlin 2023. 3. 6. 13:00
안녕하세요 안드로이드 11기 강다현입니다. Coroutine under the hood 이번엔 코루틴의 내부 동작에 대해 살펴보도록 합시다. 이 내부 동작에서의 핵심 키워드는 Continuation (Continuation-Passing-Style)입니다. 우리가 코루틴을 사용할 때, 기본적으로 suspend function은 함수를 중간에 멈출수가 있습니다. 그러나 suspend function을 사용하다 보면 이런 의문이 생깁니다. 다시 멈추고 다시 돌아갈 땐 (resume) 내부적으로 어떻게 동작하는 걸까요? 어떤 포인트에서 다시 시작해야할지 어떻게 알까요? (일종의 마법같은? 현상!) 이 문제를 해결하기 위한 개념이 바로 Continuation-Passing-Style. CPS입니다. 먼저 간단한..
-
Transformation map과 switchMapAndroid 2023. 3. 6. 12:53
LiveData를 조금 더 유연하고 확장성 있게 사용하는 방법을 알아봅니다. LiveData 먼저 Transformation.map과 Transformation.switchMap에 대해서 알기 전에 알아두어야 할 것이 있습니다. 바로 LiveData와 MediatorLiveData 입니다. 먼저 올라온 포스트에 준비님께서 LiveData의 장점을 아주 잘 설명해주셨는데, 그 장점중에서 LiveData가 Inactive 상태, Activity가 Backstack에 있는 듯한 상태에서는 LiveData의 이벤트를 받지 않는 것에 대해서 부터 이야기 해보겠습니다. LiveData는 onActive()와 onInActive()라는 메소드를 가지고 있는데, 이는 활성화된 옵저버가 0과 1사이로 변하는 것을 알림 ..