개발+IT

Kotlin Multiplatform을 살짝 맛만 보기

내가 볼 땐 이게 크로스 플랫폼의 미래다

얼마전에 Kotlin/Everywhere Seoul 2019를 다녀왔는데, 그때 젯브레인의 디벨로퍼 아드보케인 스베틀라나 이사코바의 'What's new in Kotlin'을 보면서 코틀린 멀티플랫폼에 흥미가 생겼더랬다. 코틀린 멀티플랫폼은 대부분의 안드로이드/iOS 크로스 플랫폼 프레임워크가 UI를 포함하는 공통 코드베이스를 구축하는 것과는 달리 철저히 앱의 비즈니스 로직 공유에 집중해 UI 플랫폼에 독립적으로 기능한다. 그리고 더 나아가서는 서버 - 웹프론트엔드까지 비즈니스 로직을 공유하려는 비전을 갖고 있더라. 여튼 나는 그렇게까지 시도해 볼 생각까지는 없고, 일단 안드로이드/iOS 비즈니스 로직을 공유할 수 있다는 것 만으로도 꽤 매력적이겠다 싶어 코틀린 공식 사이트의 Hands-on에 있는 코드랩을 한번 따라해봤다. 결과적으로 해당 코드랩을 잘 따라하면 다음과 같은 화면을 볼 수 있게 된다.

좌측은 스크린샷에 나와있듯이 iPhone11(iOS13) 시뮬레이터에서 앱을 실행한 것이고, 오른쪽은 픽셀2(Android PIE) 에뮬레이터에서 앱을 실행한 것이다. 잘 보이도록 텍스트사이즈를 키운 것 외에는 안드로이드/iOS 모두 앱 프로젝트를 만들자마자 기본으로 주어지는 레이아웃이고, 코틀린 멀티플랫폼으로 만든 라이브러리의 함수로부터 문자열을 받아와서 화면에 보여주는 앱이다. 그런데 이게 어떻게 작동하는 걸까?

코틀린/멀티플랫폼 라이브러리 함수의 사용

위의 두 코드가 공통으로 호출하는 createApplicationScreenMessage 이 함수가 멀티플랫폼 코드에 들어갈 것이다. 물론 이것만으로는 도대체 뭘 어떻게 해서 저 문자열을 받아왔는지를 이해할 수 없다. 일단 안에서 무슨 일이 일어났는지 알기 위해 코틀린 멀티플랫폼 프로젝트의 구조에 대해서 대략적으로 알아보자.

프로젝트 구조와 코드 구현

Building Multiplatform Projects with Gradle

위 이미지에 대한 상세한 설명은 이 링크에서 확인해보자.

위 이미지는 프로젝트가 jvm과 js를 타겟으로 하는 경우를 그림으로 그려준 것이다. 모든 플랫폼에서 공유하는 commonMain/commonTest(소스셋이라고 부르자) 가 있고, 특정 플랫폼에서만 사용되는 ***소스셋(위 경우에는 jvmMain, jsMain...)이 있다. 플랫폼별로 달리 동작해야 하는 코드의 경우에는 common소스셋에서 선언을 하고, ***소스셋에서 실 동작하는 코드를 구현하게 된다.

이와 같은 식이다. 물론 플랫폼별로 별도로 동작하는게 아니라면 common에서 expect 키워드 없이 그냥 일반적인 코틀린 코드 구현을 하면 된다. 다음 코드를 보면 이해하기 쉬울 것이다.

이해가 되는가? whatNow 함수의 경우 단순히 getPlatformName 함수를 사용하고 있기 때문에 별도의 플랫폼 소스셋에서 구현할 필요가 없는 것이다(실제로 저 위에서 예시로 들었던 안드로이드/iOS 스크린샷 역시 같은 구조로 만들어져있다). 다만 getPlatformName함수가 expect 키워드를 사용하고 있기 때문에 각 플랫폼 소스셋에서 해당 expect 함수를 actual 키워드로 구현하지 않으면 빌드되지 않는다. 여기까지 이해됐다면 코틀린/멀티플랫폼 프로젝트를 통해 무엇을 할 수 있을지 대략적으로 감을 잡을 수 있을 것이다.

빌드 구성

상세한 설명은 이 링크에서 볼 수 있다.

코틀린 멀티플랫폼은 gradle을 통해 프로젝트 구성을 할 수 있다. 만약 gradle 프로젝트 구성이 익숙하지 않다면 따로 공부해야한다. 하지만 코틀린 멀티플랫폼에 관심을 가질 정도의 코틀린 사용자라면 아마 익숙하리라 생각한다. 

gradle 버전에 따라 groovy나 kotlin으로 build.gradle 구성을 할 수 있는데, 내 경우에는 예제가 kotlin을 통한 빌드 구성을 제시하고 있어 한번 체험해볼겸 kotlin으로 해보았다. 사실 세부 구현부 외에는 거의 같다.

위의 빌드 구성으로 프로젝트를 생성하면 

  • src/commonMain/kotlin/
  • src/androidMain/kotlin/
  • src/iosMain/kotlin/

의 세 폴더를 직접 생성해서 구동 코드를 작성해 실행할 수 있다. 물론 그 외에도 안드로이드/iOS 각각 프로젝트 구성을 해줘야 하는데, 이에 대해서는 다음 포스팅에서 더 자세히 다뤄보도록 하겠다.

GAE BAL JA

구본본 님의 창작활동을 응원하고 싶으세요?

hell yeah, world
hell yeah, world
구독자 101
멤버십 가입

3개의 댓글

SNS 계정으로 간편하게 로그인하고 댓글을 남겨주세요.
새로운 알림이 없습니다.