분류 전체보기 29

Layout xml 그룹 관리

안드로이드 프로젝트를 생성하면 제일 먼저 만나는 layout 리소스는 activity_main.xml이다. "activity_main.xml 흠.. activity 성격에 화면 이름은 main 이구나"라고 추측이 가능하다. 하지만 이러한 layout 리소스 파일은 프로젝트 단위(앱) 사이즈에 따라서 개수가 많아지게 되면 유지보수 효율성 및 가독성이 떨어진다. 그러면 layout 리소스 파일을 관리를 어떻게 하면 될까? Layout 리소스 관리를 해야 하는 3가지 이유 xml 네이밍을 통해서 Root를 추적하기에 용이 유지보수 측면에서 효율성 xml 네이밍 가독성 증가 Layout 리소스 관리 방법 Layout 리소스 네이밍 플러그인 이용 Layout 리소스 네이밍 Layout 리소스 네이밍 방법은 네이밍..

Android 2021.11.16

디자인 아키텍처 2 - MVP

MVP는 MVC에서 View와 Model의 결합도가 높다는 단점을 보완하기 위해 만들어진 패턴이다. MVC에서 View는 Activity와 Fragment 그 자체이지만 MVP에서는 View가 Activity와 Fragment는 그 일부일 뿐이고 MVC에서의 Controller의 역할을 View가 담당하여 유저 액션 이벤트를 Presenter로 전달하는 역할을 한다. View와 Model이 Presenter를 통해서만 동작 하도록 함으로써 View와 Model의 의존성을 제거한다. 아래의 그림과 같이 MVP 패턴의 View는 Model을 직접 호출할 수 없으며 Model은 View에게 바로 데이터를 전달할 수 없다. View에서 유저가 이벤트를 발생 View는 Presenter로 전달 Presenter에..

Android 2021.11.16

카카오 주소 및 키워드 api를 활용한 주소 검색 서비스 제작

위치 서비스를 제공하는 앱이면 주소 검색 및 위치 검색 기능이 있기 마련이다. 배달의 민족, 요기요, 여기어때 등이 대표적이다. 이번에 기획팀에서 내 위치 주변의 매장만 보여줬던 기능에서 업그레이드하여 유저가 검색한 위치의 매장도 보이도록 기능을 추가해달라고 하였다. 주소 검색 서비스에서 정부 api, 카카오 api, 네이버 api 등 많은 오픈소스가 존재하였지만 이번 위치 검색은 카카오 api 기반으로 개발해 보았다. API 선정 통합 검색 기능의 Firebase Event Log 바탕으로 유저들의 위치에 관한 검색 케이스를 분석한 결과 크게 건물명, 주소 크게 두 가지 케이스로 검색하였다. 건물명? 주소? 그게 뭐가 달라? 라고 할 수 있지만 아래와 같이 예를 들면 검색 결과는 같아도 검색어는 다르다..

개발 이모저모 2021.11.16

지도에 중복 위경도 마커를 찍어보자

기획자와 개발자의 어느 대화... 🙋‍♂️ 매장의 위경도가 같으면 지도에 찍는 마커 위에 위경도가 중복되는 매장의 개수를 표시해주세요. 다만, 중복 위경도가 아니면 일반적인 마커를 찍어주시면 됩니다. 🙎🏼‍♂️ 네...? 지금 그러면...서버에서 내려주는 데이터에서 위경도에서 중복인 것을 묶어야겠네요! 한번 만들어 보겠습니다.(험난한 여정이 되겠군...) 기존 지도 매장 정보 데이터 data class StoreItem( @SerializedName("id") val id: Long, @SerializedName("name") val name: String, @SerializedName("latitude") val latitude: Double, @SerializedName("longitude") val..

개발 이모저모 2021.11.16

SharedPreference를 이용한 최근 검색어 리스트 만들기

검색 기능을 만들 때 부과적인 기능으로 최근 검색한 키워드를 저장하는 최근 검색어 기능을 만들어 보았다. 최근에 검색한 단어를 저장하는 방법은 백엔드에 저장하는 방법, Room, SharedPreference, SQLite를 사용하여 로컬에 저장하는 방법이 있다. 이번 개발에는 SharedPreference를 사용해서 개발하였다. 설계 최근 검색어 리스트는 ArrayList형으로 만들어서 JsonString형으로 변환시켜 저장한다. 기능 검색어 저장 기능 이전에 검색했던 검색어일 경우 이전 데이터 삭제 후 저장 기능 키워드 전체 삭제 및 개별 삭제 기능 검색어 저장 시나리오 유저가 검색어를 입력한다. 입력한 검색어가 이전에 저장되어 있는지 확인한다. 이전에 저장되어 있는 경우 → 이전에 입력되어 있는 데..

개발 이모저모 2021.11.16

HTTP 통신 로그 이쁘장하게 찍어보기

Retrofit2를 개발할 때 OkHttp3을 이용하여 HTTP 통신에 타임아웃, 쿠키, 로그 등 옵션을 설정할 수 있다. 여기서 로그 옵션을 설정하게 되면 HTTP 통신 요청과 응답 값을 로그를 통해서 알 수 있다. 하지만 로그에서는 pretty하게 프린트되지 않아서 가독성이 떨어진다. 이러한 로그를 pretty하게 출력되도록 하는 방법이 있다. HTTP 통신 로그 pretty하게 찍는 방법 HTTP 통신 로그를 pretty하게 찍기 위해서는 HttpLoggingInterceptor에 인자로 커스텀 클래스(CustomHttpLogging)를 넘겨야 한다. val interceptor = HttpLoggingInterceptor(CustomHttpLogging()) class CustomHttpLoggi..

개발 이모저모 2021.11.16

흔들어봐! 새로운 화면이 열릴꺼야~

스타벅스 어플에는 Shake Pay라는 기능이 있다. Shake Pay는 계정에 스타벅스 카드를 등록한 경우 앱에서 디바이스를 흔들면 등록한 카드의 바코드가 생성되어 결제할 수 있는 기능이다. 단순히 신기함에서 넘어갈 수도 있지만 이를 응용하여 흔들면 결제 바코드 화면으로 전환되는 기능을 한번 만들어 보았다. 동작 원리 안드로이드에서는 많은 센서를 지원하는 데 그중 하나인 SensorEventListener 클래스가 있는데 이게 바로 Shake Pay의 핵심이다. Shake Pay를 실행하려는 Activity에 SensorEventListener 인터페이스를 상속하여 가속도 감지 및 외부의 충격량과 방향 감지를 해서 이벤트를 발생시킨다. - SensorEventListener란? SensorEventLi..

개발 이모저모 2021.11.16

CustomView 1 - 이메일 입력창

앱 UI 중에 가장 많이 사용하는 UI는 이메일 입력이라고 생각한다. 이메일 기반의 로그인, 비밀번호 찾기 또는 이메일 통해서 아이디 찾기 등 이메일은 뗄 수 없는 UI 중 하나이다. 이메일 입력창의 대표적인 구조로는 단독으로 이메일 전체를 입력하는 EditText 또는 이메일 아이디, 주소 2개의 EditText가 있다. 전자의 경우에는 단순한 구조라 재활용의 개념이 없지만 후자의 경우에는 이메일 입력창을 사용하는 레이아웃마다 만들어야 하는 번거로움이 있다. 따라서 이번에 이메일 입력창을 CustomView로 만들어 보았다. 레이아웃 기능 - 이메일 아이디 단순히 키보드 또는 클립보드를 통해서 텍스트를 입력 양방향 데이터 바인딩 - 이메일 주소 이메일 주소 EditText는 Default로 비활성화 상..

Android 2021.11.16

디자인 아키텍처 1 - MVVM

MVVM이란? MVVM이란 MVC 패턴 특성상 Activity에 모든 코드를 다 집어넣으면서 Activity가 무거워지고 View와 Model 간의 의존성이 높아지며 앱 규모가 커질수록 코드가 복잡해지는 단점을 보완하고자 나온 패턴이다. MVVM은 Model, View, ViewModel로 구성되어 있다. View Activity/Fragment 비지니스 로직을 포함하지 않고 UI와 관련된 로직만 존재 유저의 Action을 감지(ex. 버튼 클릭) ViewModel을 Observe 하다가 값이 변경되면 해당 값을 처리 ViewModel View가 요청한 데이터를 Model에 요청 Model로부터 요청한 데이터를 받음 비지니스 로직만 존재 Model 실질적인 Data를 다루는 구성 요소 ViewModel로..

Android 2021.11.15