LINE Corporation이 2023년 10월 1일부로 LY Corporation이 되었습니다. LY Corporation의 새로운 기술 블로그를 소개합니다. LY Corporation Tech Blog

Blog


한국 안드로이드 개발자 모임, Droid Knights 2019에 다녀왔습니다

안녕하세요. 이번 글에서는 지난 4월 5일 코엑스에서 열렸던 행사, 'Droid Knights 2019'에 대해 이야기하려고 합니다. Droid Knights는 국내 안드로이드 개발자 콘퍼런스로 안드로이드 개발과 관련된 최신 트렌드와 기술 적용 사례, 개발 경험담 등을 공유하는 자리입니다.  

 

LINE은 올해 메인 스폰서 자격으로 콘퍼런스를 후원했습니다. 덕분에 참가자 목걸이에는 'DROID KNIGHTS with LINE'이라는 멋진 문구가 새겨져 있었습니다.

 

설레는 마음으로 입장하니 제일 먼저 LINE 부스가 반겨주었습니다. LINE 부스에서는 Droid Knights에 참가한 분들에게 LINE을 소개하고 개발 문화를 알렸는데요. 많은 개발자 분들이 부스를 찾아주셨고 LINE 굿즈도 받아가셨습니다. 

어떤 기술들을 사용하고 있을까요?

세미나실로 들어가기 전, 행사장 한편에선 참가한 분들의 개발 취향을 한눈에 파악할 수 있는 스티커 설문조사가 진행되고 있었습니다.

먼저 아래는 현재 사용하고 있는 기술을 설문한 결과인데요. Reactive X를 사용하시는 분들이 많았습니다.

안드로이드에선 Reactive X 라이브러리의 언어별 세부 구현 중 하나인 RxJava를 사용하는데요. RxJava는 안드로이드 개발자가 반응형 프로그래밍(reactive programming)을 할 때 필수로 사용하는 라이브러리로 자리 잡았습니다. 그래서인지 이번 Droid Knights에서도 최신 트렌드인 RxJava를 소개하는 세션이 많이 열렸습니다. 또한 App Bundle이 많이 사용되는 것도 눈에 띄었습니다(App Bundle은 각 사용자가 필요한 리소스만 선택해서 빌드하는 방식으로 앱의 크기를 줄일 수 있는 기술입니다).

다음으론 현재 사용하는 메인언어(주 개발언어)가 무엇인지 물어본 결과인데요. 많은 분들이 Kotlin을 사용하고 있다는 걸 알 수 있었습니다.

Kotlin은 Google I/O 2017에서 안드로이드가 공식적으로 지원하는 개발 언어에 추가된 후 편리함을 무기로 널리 보급되고 있습니다. 현재 많은 IT기업에선 Java 대신 Kotlin을 안드로이드 개발 언어로 사용중이고, LINE 역시 적극적으로 Kotlin을 사용하고 있습니다. 이번 콘퍼런스에서도 Kotlin과 관련하여 많은 세션이 열렸는데요. 이제 Kotlin은 선택이 아니라 필수가 되었다고 해도 과언이 아닙니다.

다음은 보통 테스트 코드를 어디까지 작성하는지에 관하여 설문한 결과입니다. 보시다시피 아직 전반적으로 테스트 코드가 잘 작성되고 있다고 말하긴 어려울 것 같습니다.

테스트 코드 작성은 좋은 품질의 소프트웨어를 개발하기 위한 필수 과정입니다만, 아래와 같은 이유로 작성하지 않을 때가 많습니다.

  • 어렵고 복잡하다.
  • 개발할 시간도 부족하다.
  • 테스트는 QA가 한다(따라서 개발자인 나는 테스트 코드를 작성하지 않는다).
  • 테스트 코드를 작성하지 않고 수동 테스트만 하고 있다.

소프트웨어 개발은 설계와 구현만큼 검증도 중요한 분야입니다. 좋은 품질의 앱을 개발하기 위해서는 테스트 코드 작성이 선택이 아닌 필수로 인식되어야 합니다. LINE에서는 테스트 코드 작성과 수동 테스트로 개발자 본인 검증, 동료 개발자의 코드 리뷰를 통해 2차 검증, 그리고 QA 테스트의 최종 검증까지 여러 단계에 걸쳐 검증을 진행하고 있습니다.

마지막으로 현재 어떤 앱 아키텍처를 사용하고 있는지 설문한 결과입니다. 아키텍처로는 MVVM(model-view-viewmodel)과 MVP(model-view-presenter)를 주로 사용하고 있는 것으로 나타났습니다. MVVM이나 MVP를 Google I/O 2017에서 발표된 AAC(android architecture components)와 함께 사용하거나, 각종 DI(Dependency Injection) 툴과 함께 사용하고 있었습니다.  

아키텍처에 정답은 없습니다. 각 아키텍처의 개념과 장단점을 제대로 이해하고 각자의 서비스에 맞게 유연하게 적용하는 것이 중요하다고 생각합니다.

다음으로 콘퍼런스에서 흥미로웠던 세션 3개를 소개하겠습니다.

지금까지 이런 간단한 Logic 처리는 없었다. 이것은 Rx인가, UI 이벤트인가? – 하동현 님

RxBinding은 안드로이드 UI(user interface)와 RxJava를 쉽게 연결(binding)할 수 있도록 도와주는 라이브러리입니다. 이 라이브러리를 사용하면 UI 컴포넌트의 상태를 구독(subscribe)하여 각각의 상태에 맞게 적절하고 효율적으로 처리할 수 있습니다.

세션에서 발표된 첫 번째 적용 사례는 사용자가 입력한 개인 정보의 유효성을 여러 번 검사해야 하는 경우에 적용한 사례입니다. 사용자가 입력한 각 정보를 검사하는 로직 하나하나는 매우 간결하지만, 검사해야 할 총 항목의 수가 너무 많아 전체 로직은 복잡해질 수 밖에 없습니다. 최소한 아래 정도의 유효성 검사는 거치게 되는데요.

  • 전화번호에 숫자를 제외한 문자가 포함되어 있는지
  • 이메일이 패턴 형식에 일치하는지
  • 비밀번호 길이가 최소 길이 이상인지
  • 비밀번호에 특수문자가 포함되어 있는지

각 검사 로직은 서버에서도 필요하지만, 네트워크 자원을 아끼기 위해 클라이언트에도 구현하여 유효하지 않은 정보는 미리 차단해야 합니다. 

두 번째 사례는 사용자의 입력에 따라 view의 흐름을 적절하게 제어해야 하는 경우에 적용한 사례입니다. 예를 들어 보겠습니다.

  • 국가를 선택했을 때
  • 핸드폰 인증이 완료되었을 때
  • 필수 값이 입력되었을 때

위와 같은 경우에 특정 view를 보여주거나 감추는 등 view의 흐름을 제어할 필요가 있습니다.

발표에 따르면 RxBinding을 이용하면 이러한 view의 유효성 검사나 흐름 제어를 view의 상태 변화를 구독(subscribe)하는 메커니즘으로 처리하여 간결하고 이해하기 쉬운 코드로 작성할 수 있습니다. 위 두 사례에서는 view에서 발생한 이벤트를 구독가능한 형태로 바꾸고 이를 구독하고 있는 객체가 이벤트를 적절하게 처리하는 로직을 담당하게 만들었습니다. 

Kotlin 꼭 해야하나요? – 박상권 님

이번 행사엔 다양한 수준의 많은 개발자들이 참가한 만큼 초보 개발자들을 위한 세션도 있었습니다. 이번 세션에서 발표자는 Kotlin의 장점과 더불어 개발자가 갖춰야 할 태도에 대한 조언도 같이 해주셨습니다. 어떤 신기술이 널리 인정받으며 하나의 흐름이 되었을 때, '이 기술을 꼭 써야 할까요?'라는 질문을 많이 접하게 되는데요. 이 말은 하기 싫다는 말과 같은 말이라는 설명이 인상적이었습니다.

 세션에서 소개된 Kotlin의 장점은 다음과 같습니다.

  • Null Safety 
    • NullPointerException에 대한 간결한 처리와 루틴(Safe Calls, Nullable Type)을 지원합니다.
  • Data classes 
    • 컴파일러가 toString(), hashCode(), equals(), copy() 등을 자동 도출합니다.
  • String templates
    • Java에서는 문자열과 변수를 표현할 때 println("Welcome " + strName)같은 형식을 사용했습니다. Kotlin에서는 '$' 기호를 붙여 변수명을 템플릿 형식으로 나타낼 수 있는데요. 앞선 구문을 println("Welcome $strName")같이 작성할 수 있습니다.
  • Lambda & Scope Functions
    • Lambda는 함수를 선언하지 않고 표현으로 나타내는 함수 형식입니다. 주로 간결하게 표현하기 위해 사용하거나, 고차 함수의 인자 혹은 고차 함수의 결과 값에 사용합니다.
    • Scope Functions는 Kotlin lambda에서 지원하는 함수 형식입니다. Lambda를 사용하면 객체 내에서 범위(scope)를 형성하는데요. 이 범위에서 변수명 등을 명시하지 않고 접근할 수 있습니다. Kotlin에서는 범위 안의 객체를 어떤식으로 지정할지와 반환 유형에 따라 letrunwithapplyalso의 다섯 가지 scope function을 사용할 수 있습니다.
  • Calling Kotlin from Java
    • Kotlin이 빠르게 Java를 대체해 나갈 수 있었던 이유는 기존 Java코드와 호환이 된다는 큰 장점 때문입니다. Kotlin 코드에서 @JvmName@JvmField@JvmStatic@JvmOverloads 등의 어노테이션을 사용하면 Java에서 Kotlin 코드를 호출할 수 있습니다.
  • Extensions
    • Kotlin은 C#의 Extension Methods처럼 번거로운 상속 과정을 거치지 않고 원하는 기능을 추가할 수 있습니다.
  • Lazy Initialization
    • 객체의 불필요한 초기화를 방지하기 위해 고안된 방법입니다. 사용하지 않는 무거운 객체를 미리 초기화하지 않고 실행되는 시점에 초기화하는 방법으로 자원 사용을 줄일 수 있습니다.

위에서 열거한 것들 외에도 많은 장점이 있는데요. 그래서 이제는 이 세션 주제에 대한 답을 내릴 수 있을 것 같습니다.

'Kotlin, 꼭 해야 합니다.' 

Android Gradle Plugin 버그 잡기 - 차영호 님

이번에는 LINE의 안드로이드 개발자 차영호 님의 세션 내용을 공유하겠습니다. 이번 세션은 빌드한 앱을 실행하면 가끔 무작위로 앱이 다운되는 경우를 만나 그 원인을 파악하고 해결하기까지의 이야기가 담겨 있었습니다.

원인을 파악하기 위해 Android Studio에 포함된 APK Analyzer로 APK(android application package) 파일을 확인해봤는데요. APK 파일 안에 있어야 할 리소스 파일이 무작위로 누락되어 있는 걸 발견했습니다. 누락된 원인을 차근차근 조사해보니 사용하지 않는 코드와 리소스를 제외시켜주는 Proguard에 문제가 있다고 의심되어서 Proguard의 출력물을 확인했다고 하는데요. 확인하던 중 Proguard가 아니라 Gradle Plugin의 버그가 발견되어 이를 Google에 리포팅하고 스스로 고쳐보는 과정까지를 세션에서 소개해 주셨습니다. 더불어 업스트림에서 변경 사항을 받아들이지 않을 때 대응하는 몇 가지 팁까지 공유해 주셨습니다.

이 세션은 발표자 분의 경험이 잘 녹아있어서 굉장히 흥미로웠습니다. 세션 중 '여러분은 이미 안드로이드 생태계의 일부분이 되었다'는 말이 인상깊었는데요. 오픈소스에서 버그를 만났을 때 그냥 두지 말고, 이슈트래커에 공유하고 버그 수정도 공유해서 함께 더 나은 생태계를 만들어가자고 말했습니다. 발표자료는 여기에서 확인할 수 있습니다.

마치며

현재 안드로이드에서는 MVP, MVVM 등의 아키텍처, RxJava, Kotlin Coroutines와 같은 비동기 처리와 구독형 라이브러리, Data BindingLiveDataViewModel 같은 AAC(Android Architecture Component) 등 새로운 기술이 계속해서 출시되고 있습니다. 이번 콘퍼런스에서 뛰어난 실력을 갖춘 현업 안드로이드 개발자들과 최신 기술을 프로젝트에 적용하며 알게 된 각 기술의 장단점과 적용하면서 어려웠던 점 등의 관해 이야기를 듣고 나눌 수 있었는데요. 정말 소중한 경험이 되었습니다.