[후기] DevFest Android 2019 컨퍼런스 후기
by Yena Choi
컨퍼런스는 일 년에 서너 번 정도 가는 것 같은데 막상 후기를 쓰는 건 처음이다. 글을 쓰는 번거로움보다도, 컨퍼런스 내용을 이해하지 못했다거나 혹은 나와 크게 관련 없는 주제여서 정리를 하고 싶어도 할 수 없던 경우가 참 많았다.
GDG Korea 에서 준비해준 이번 안드로이드 데브페스트는 아주 규모가 큰 행사는 아니었지만, 안드로이드 전용 컨퍼런스인만큼 거의 모든 세션에 흥미가 갔다. 이미 다른 곳에서도 여러 번 다뤄진 메이저한 주제들이기도 했고, 세션 발표자들이 실무에서 사용하기 편하도록 간결히 정리해서 발표해 주어서 내용을 편하게 들을 수 있었다. 여기에, 업무를 하며 얻은 경험과 회사 동료들로부터 들은 지식이 조금이나마 쌓여서 이제는 간단히나마 정리를 할 수 있을 것 같다.
DevFest Android 2019
GDG Korea 주최라고 하니 왠지 세종대학교 아닌가? 싶었는데, 이번에는 삼성역에 있는 구글 스타트업 캠퍼스에서 진행되었다. 구글 스타트업 캠퍼스에서 무려 장소 협찬을 해주셨다고 한다. 이처럼 좋은 취지의 두 단체가 만나서 그랬던건진 모르겠지만, 이번 행사는 유난히 푸짐했던 것 같다. 다만 나중에 준비된 간식에 힘(?)이 집중되다보니 입장할 때에는 물이나 커피 같은 게 준비되지 않아서 목마른 좀비들이 여럿 돌아다니기도 했다. 현대 오토웨이 건물 내에 있던 편의점도 닫았었는데 쉬는 시간이 10분밖에 없다는 걸 깨닫고 정말절망.
스푼라디오, 아이디어스, 헬로우봇 부스가 준비되어 있었다. 와글와글한 분위기가 아니었던 만큼 부스에 가서 서비스에 대해 물어보거나 여유있게 경품을 받아올 수 있었다.
스푼은 인스타그램 광고에서 많이 봐서 개인 라디오 스트리밍인 서비스인걸 알고 있었다. 아이디어스는 핸드메이드 위주의 마켓으로, 나는 이미 두 번의 구매 경험이 있는 곳이었다. 헬로우봇은 처음 봤는데, 인공지능을 이용한 카테고리 특화 챗봇 서비스라고 하셨다. ‘타로카드-연애상담’ 카테고리를 담당하는 캐릭터와 채팅을 시작했는데 갑자기 챗봇이 ‘당신이 솔로인 이유를 알려드릴게요-‘해서 조금 슬프기도 했고, 그 와중에 어떻게 알았지 하며 신기해하기도 했다.
타임테이블을 보니 20-30분 정도 세션을 진행하고 10분 휴식시간이 있는 구조로 되어 있었다. 반 정도 진행한 후 간식 시간이 있었고, 뒷 세션은 비교적 가벼운 내용들로 준비되어 있다고 하셨다. 코틀린 익스텐션, 데이터 바인딩, 다크 테마, 테스트 코드, 플러터 등에 대한 내용이었다.
festa 에서 티켓을 구매하면서 사전 설문조사를 했는데, 피자 치킨 샌드위치 등 어느 음식을 선호하냐는 질문과 맥주나 커피 중 어느 것이 좋은 지에 대해 묻는 항목이 있었다. 그 비율에 맞춰 간식을 준비한 듯했다. 12,000원 하는 행사에 먹거리를 이렇게나 많이 준비하시다니 정말로 네트워킹이나 연말 분위기에 신경을 많이 쓰신 것 같았다. (그래도 단체 행사에서는 뼈치킨보다는 순살로 해주세요)
치맥에 정신 팔렸던데다가 행사장에 책상이 없어 허벅지에 올려놓고 타이핑 해야했던 환경이라 모든 세션의 모든 내용을 다 담지는 못했지만, 최대한 기억을 되살려보았다.
Android KTX, DataBinding 으로 코드 생산성 개선하기
안성용 / 네이버웹툰
첫 세션의 이름은 ‘코드 생산성 개선하기’였다. 하지만 코드 개선의 목적에 초점을 두어 제목을 ‘KTX / DataBinding 으로 View Layer 코드 줄이기’로 다시 정하신 것 같았다. KTX는 Jetpack 중의 하나로, 코틀린의 확장 기능이다. ‘이런 코드가 있어요’ 하고 넘어가기보다는 실제 쓰고 있는 코드 중에 간결하게 바꿀 수 있는 부분을 자세히 설명해주셔서 좋았던 세션이었다.
가령, 어떤 boolean값에 따라 View
를 VISIBLE
혹은 GONE
처리를 해야 할 때 기존에는 if
혹은 삼항 연산자를 거쳐야했다. KTX를 사용하면 isVisible
처럼 간결한 확장 속성을 제공하기 때문에 loadingView.isVisible = isLoading
같은 짧은 코드가 가능해졌다. 사실 내부 코드를 열어보면 별 거 아닌데, 귀찮은 부분들을 숨겨두고 간단하게 꺼내 쓸 수 있게 정리를 미리 해두었다는 점에서 KTX에 매력을 느꼈다.
이외에도 Html Text 처리, StringBuilder와 비슷한 spannableStringBuilder
, Bundle의 자료형 처리를 간단하게 해주는 bundleOf
등 KTX를 이용해 코드를 훨씬 간결하게 쓰는 꿀팁들을 알려주셨다. KTX 리스트 에서 확인할 수 있다.
여기에 DataBinding
으로 데이터와 UI 요소를 묶을 수 있다. KTX에서 확장 속성을 쓸 수 있었다면, 데이터 바인딩에서는 BindingAdapter
를 통해 xml에 어트리뷰트를 추가한 것처럼 쓸 수 있다. Visible 처리, 클릭 처리 등에서 흔히 쓰인다. 2-Way Binding 에서는 조금 호불호가 갈리지만, 체크박스 처럼 view에서 toggle한 후 로직을 처리하고 view로 재전달하는 식으로도 사용된다고 하셨다.
발표하신 분의 Medium 블로그 에서 자세한 내용을 확인할 수 있었다.
실제 운영중인 서비스에 다크모드 적용 과정
김종식 / 원티드
실제 원티드 서비스에 다크모드를 적용하는 스토리를 들려주셨다. UI 편의성을 위한 부분이라 리소스를 천천히 들여, 다른 프로젝트와 병행하면서 조금씩 안정적으로 진행하신 것 같았다.
발표를 들으며 사람들이 다크 모드에 관해서 은근히 모르고 있었다는 걸 알게 됐다. 개인적으로는 다크 러버라서 안드로이드 신 버전에서 다크 모드를 밀어주려는 움직임이 보여서 행복하다.
앱 테마는 DayNightTheme
를 사용했다고 하셨다. 필수는 아닌데, 필수로 하는게 좋다고. 이미지 리소스에는 tint를 적용했다. 키 값이 같은 color
리소스를 Light/Dark 모드에서 각각 다른 색을 지정해주었다. 특히 convertingcolors.com 사이트를 이용하면 컬러에 관련된 이슈 거의 없었을 정도로 색을 잘 뽑아주었다고 한다. Light 테마 색상 기준으로 밝기와 채도를 20-40% 다운시키면 Dark 테마 색으로 적절하다고 했다. 텍스트는 #RRGGBB
의 16진수 값을 반전해서 사용했지만,(#111111 -> #eeeeee) 배경이 있는 경우 조금 더 신중하게 했다고 하셨다.
색상 외에도 레거시 코드를 정리하고 미사용 리소스 제거(레이아웃, 이미지, 스타일, 컬러 등)하며 필요한 리소스는 디자인 팀과 협업해서 받았다고 하셨다.
만약 다크 테마 적용한다면 추가로 고려해야 할 것들은 다음과 같았다.
- 컨텐츠 원본 이미지 (쇼핑 등 이미지가 큰 비중을 차지하면 서비스면 고민 필요)
- 아이콘, 위젯, swipeRefreshLayout
- 구글지도 다크테마 (한국 미지원)
- 인앱 웹뷰
머신러닝을 이용한 Android 앱 자동화 테스트 방법
안창남 / HP
사실 이 세션은 내가 이해할 수 있는 지식의 범위를 넘어선 것 같다.
기존에는 수동으로(매뉴얼) 테스트를 진행했다. 즉 QA팀과 같은 사람이 시나리오대로 테스트하는 게 전부였다. 이제는 Selenium
, Selendroid
, Appium
등을 이용해 test script를 작성하고 자동화 테스트를 하는 단계인 것 같았다.
물론 인력을 사용하지 않고 자동화 시키는 게 베스트이긴 하겠지만, 초기 테스트 케이스 만드는게 힘들다는 문제점이 있다고 하셨다. 테스트에서 오류가 발생하면 테스트 코드를 재수정하는 데에 리소스가 많이 투입된다. 오류가 발생하지 않는다 하더라도 디바이스, OS버전, 앱 업데이트, 외부 의존성 등으로 인하여 유지관리가 쉽지는 않다고 하셨다.
그래서 도입을 고려중인 머신러닝 테스트 하면 좋은점
- Training set 이 자동으로 만들어짐
- 강화학습을 통해서 테스트 정확성 증가
- Report(보고서) 시스템
우선 오픈소스를 찾아서 상용 앱에 Random Test를 진행한다. Visualization(테스터가 결과를 보고 확인할 수 있는 agent 개발)도 이 단계에서 진행했다고 하셨다. 그 데모를 보고 전체적인 full path를 찾으면 각 액티비티에 대한 라벨링을 하고 앱 스크린을 분류한다.
그리고 그 UI를 캡쳐해서 어느 상황을 테스트 할 건지 input을 작성한다. 사용자가 CSV파일에 어떤게 Pass/Fail 인지 작성하여 강화 학습(Reinforcement Learning)에 던져주면, 결과도 CSV 파일로 제공해준다고 했다. 그리고 시나리오대로 수행하면서
- 다음 상태로 이동 : +1
- 이전 상태로 이동 : -1
- 제자리(Checkbox, Scroll 등) : 0
의 기준으로 스코어를 매긴다. 하지만 각 액티비티마다 실행할 수 있는 액션과 개수가 달라서 일반화가 필요하다고 하셨다. 여기서부터는 내 뇌에 Out of Memery Exception …
Android 앱개발과 Flutter 개발의 큰 차이점 5가지
남반석 / Lawfully
컨퍼런스 도중에는 사진 안 찍는 편인데, 그래도 한 장 찍어야하지 않겠냐며 찍은 한 컷
Native 앱 개발과의 큰 차이점 5가지를 설명해주셨는데, Flutter에 좋은 쪽으로 뽑아와주신 것 같았다.
- 크래시가 나지 않는다.
강제로 앱이 죽지 않는다. 단 native 과 연동하면 앱이 강제종료 될 수도 있다고 하셨다. 코드가 문제에 생기면? 위젯 안에 빨간 바탕의 노란 글씨 에러 코드들이 도배되었다. 발표자의 입장에서는 약간 Ugly 하더라도 죽는 것보다는 낫다고 하셨는데… 내 기준에는 그 빨간 화면이 많이 어글리했다.
오류 코드는 잡을수 없냐는 이야기가 나왔었는데, Firebase Crashes
필터 -> non-fatal 로 바꾸면 라인을 볼 수 있다고 하셨다.
-
획기적인 화면 사이의 통신
Android에서는onActivityForResult
,ViewModel
,Listener
,Dialog Listener
,EventBus
등등을 통해 액티비티 간 데이터를 전달한다. 하지만 액티비티 시작, 받는 위치가 다르고 생명주기에 따라 데이터 전달이 안 될 수 있다. ViewModel 패턴을 사용하는 경우, 뷰모델 코드가 커질 우려가 있다. Listener를 사용할 때에는 참조가 끊겼을 때 전달되지 않는 어려움이 있고, Dialog Listener 에서는 일일이 수동으로 dismiss를 해주어야 한다. 무엇보다 안드로이드에서는Intent
Bundle에 넣기 위해Serializable
,Parceleable
을 구현하는 데에 불편함이 있다. “Flutter에서는 객체 그대로 싣고 보낸다.” -
쓰레드 스트레스에서 해방
안드로이드에서는 AsyncTask(Deprecated), Rx, Coroutine을 사용해 비동기 처리를 한다. Flutter 에서는 JavaScript와 비슷하게 Single Thread로 이루어져 있고, 대신Event Loop
가 흐름을 제어한다. 단일 스레드 방식으로 동작하지만, 통신이나 이미지뷰 처리가 UI를 느리게 하지 않는다. Dart 언어에서 제공하는isolate
기능을 사용한다고 설명해주셨다. -
만들고 스기 쉬운 커스텀뷰 (widget) 안드로이드에서는 커스텀뷰를 만들 때에
attrs.xml
쓴 다음에 자바 코틀린에서 속성을 하나씩 가져와 정의해주어야 한다. 레이아웃을 xml에 그리기 때문에 생기는 번거로움이다. View는 자바 객체이기 때문에 이 과정도 사실 불필요한 과정이라고 말씀하셨다. Flutter 에서는 필드에 필요한 생성자를 정의하고 각 필드에 원하는 변수를 배치한다. MVVM 처럼 데이터 바인딩되고,setState
쓰면 알아서 갱신된다고 한다. + Hot Reload 는 덤 (편-안-) -
쉽고 직관적인 Animation 처리 안드로이드에서는 우선 id로 View를 찾고, transitionX, alpha, scale 등 타겟값 세팅하고, duration 세팅, start 까지 수동으로 지정해줘야 한다. Flutter에선 암시적으로(implicit) 처리한다고 했다. implicit animated widgets에 다양한 기본 위젯이 있어 비교적 쉽게 애니메이션 구현이 가능한 것 같았다.
발표자 총평: UI 개발 프레임워크 끝판왕
나의 첫 실무에 Test 반영기
김정원 / KineMaster
이 때 하필이면 뼈치킨 먹느라 집중을 못했는데… 테스트코드에 관련된 얘기를 했다. 기억에 남는 건, 다른 회사에서 테스트 코드를 어떻게 적용하고 있는지 이야기를 공유하는 식으로 세션이 진행되었다. 네 명 정도가 이야기를 공유해주었는데, 다들 실행하고는 싶지만 실질적으로 코드가 테스트 하기 좋게 정리되어있는 것도 아니고, 테스트를 진행하기 위해 일이 더 많아지는 경우가 빈번하다고 말씀해주셨다. 현실적으로 아직은 Unit Test 정도가 가장 최선이 아닐까 싶었다.
컨퍼런스 진행자가 ‘혹시 좋은 케이스는 없나요?’ 라고 되물어봤는데, 100명 가량의 사람들 중에 아무도 대답을 못 했다고 한다.
본인 방금 매니저되는 상상함ㅋㅋ
이승민 / 뱅크샐러드
매니저(라고 쓰고 리드라고 읽었다)가 된 지 한 달 정도 된 발표자분께서 리드 후기를 말씀해주셨다.
사실 세션 제목부터 쓰고 드립부터 치고 싶으셨다고…
발표자가 생각한 리드의 역할은 크게 두 가지, Visioning 과 Managing 이 있다. Visioning은 말 그대로 ‘우리팀은 이렇게 가야한다’하는 팀의 방향을 설정하는 일이며, 가장 중요한 업무라고 하셨다. 예를 들어 안정적인 앱을 만드는 것이 목적인 경우 충분한 작업/리뷰시간 확보하거나, 개인의 성장이 목표인 경우 비동기/기록 커뮤니케이션 문화 확립하는 데에 힘썼다고 하셨다. Managing은 추상적인 키 액션을 실행하기 위한 구체 업무를 말한다. 좋은 코드리뷰를 위한 PR정책 개선, 코드리뷰 오너 도입, 배포주기 2주로 연장, 스케줄 주도권 확보, 빌드/배포 자동화 등 아주 세부적이고 오픈된 예시를 들어 설명해주셨다.
발표자 분의 리드에 대한 생각은 ‘팀원들이 달릴 수 있는 좋은 환경을 제공하고 싶어한다’고 했다. 실제로 의사 결정권을 더 가져오고 싶어 하시는 모습을 보고, 좋은 의미로 업무에 대한 욕심이 있는 사람이구나, 하는 생각이 들었다. 더불어 나쁜 리드와 좋은 리드에 대한 생각을 말해주셨는데,
나쁜 리드는
- 비전이 없는 기준이 없는/바뀌는 일관성 없는 리드
- 구름 위를 걷는 리드 - 무슨 일을 하는지 잘 모르겠지만 바쁨, 일 시키고 관리만 하는 사람 (ex 이슈가 터졌습니다. 담당자 누구죠? 하고 끝나는 케이스)
좋은 리드가 되려면?
- 실무를 팀원만큼 잘해야 한다 -> 이슈의 해결책을 내놓을 수 있어야 하니까.
- 문화는 정책으로 개선되지 않는다. -> 내가 먼저 실행하고 그 결과로 유용함을 설득/증명해야 한다.
하는 것이 결론이었다. 실제로 안드로이드에서 시작하셨지만 웹 프론트와 iOS 개발을 열심히 공부하고 있다고 하셨다.
마무리
SWAG
자본 최고
선물 최고
[성실도]
성공한 것
- 컨퍼런스를 다녀와서 그냥 일상으로 돌아가버리면 분명 잊어버린다. 처음으로 블로그에 기록을 해봤는데, 다시 되새겨보니 기억 안 나는 부분은 검색도 해보며 복습할 수 있었다.
- 네트워킹 시간을 가지면서 다른 개발자들과 간단히 몇 마디 한 게 꽤 재미있었다. (근데 에어팟 당첨자 발표 직후에 바로 전원 해산해버렸다)
실패한 것
- 에어팟 프로 당첨 안됨.
- 블로거라는 사명감을 가지고 사진을 좀 더 많이 찍어야겠다.
- 이런 날에는 명함을 가지고 와야겠구나.
도달한 결론
- 벌써 새로운 기술들을 익히고, 회사 프로젝트에 적용하고, 발표까지 하는 사람들이 부럽기도 했다. 내 공부를 열심히 하고, 적용할 수 있는 부분은 회사에 도입할 시점이 되면 나도 발표자 자리에 서있을 수 있지 않을까. 일단 회사 사람들에게부터 연습해보며 개발 공부/정리/발표하는 방법까지 두루 통달하고 싶다.