kotlin을 사용하는 개발자 사이에서 많은 관심을 받고 있는 KMP(Kotlin MuliPlatform)을 사용하여 간단한 개발을 해보았습니다.
kotlin multiplatform wizard을 사용하면 좀 더 간편하게 개발환경을 설정할 수 있다는 주변분들의 조언을 들어서, kotlin Multiplatform Wizard를 사용하여 손쉽게 개발환경을 구현할 수 있었습니다.

처음에는 모듈이 굉장히 많아서 굉장히 당황했었는데, 인터넷을 찾아보니 모듈마다 명확한 역할들이 있었고, KMP에서는 이러한 역할들을 지켜가며 코드를 작성하기를 권장하고 있습니다.
모듈은 크게 composeApp, shared으로 나뉩니다.
- composeApp: 각 플랫폼별 Application의 진입점과 플랫폼별 UI 코드를 담는 최상위 Application Module입니다.
- shared: 모든 플랫폼에서 공유되는 공통 코드를 담는 라이브러리 모듈입니다. 이 모듈은 플랫폼에 독립적인 비즈니스 로직, 데이터 모델, 네트워크 통신 인터페이스 등을 정의하여 코드 재사용성을 극대화합니다.
그리고 composeApp, shared 모듈의 내부에는 모든 플랫폼에서 공통으로 사용되는 코드를 작성하는 commonMain 모듈이 있고, 그 외에도 사용자가 프로젝트를 생성할 때 선택한 플랫폼에 해당하는 모듈들이 존재합니다. 이 모듈에서는 특정 플랫폼에 따라 다르게 작성해줘야 하는 코드들이 들어갑니다.
처음에는 굉장히 복잡한 구조라고 생각했었는데, 개발이 끝날 때쯤에는 공통적인 코드들을 효율적으로 관리할 수 있는 구조라는 생각이 들었습니다.
다양한 플랫폼을 지원하기 때문에 플랫폼마다 중복으로 사용되는 코드가 많을 텐데, 이렇게 여러 번 사용되는 코드들을 공통으로 관리해 줌으로써 개발자가 작성해야 하는 코드가 확 감소하게 되지 않을까 라는 생각이 들었고, 실제로 작업을 했을 때도 코드 양이 감소하는 것을 체감할 수 있었습니다.
++ kotlin Multiplatform Wizard에서 server도 함께 선택한 경우에 이에 맞춰서 server 모듈도 생성되고, 생성된 모듈에서 서버 관련 작업을 해주면 됩니다.
또한 expect / actual을 사용하면 각 플랫폼에 맞춰서 코드를 구현할 수 있기 때문에, 좀 더 효율적인 코드 작성이 가능해집니다. 하단의 링크를 참고하면 expect / actual의 사용법에 대해 살펴볼 수 있습니다.
https://www.jetbrains.com/help/kotlin-multiplatform-dev/multiplatform-expect-actual.html
조심해야 하는 부분
1. 플랫폼 별로 실행하는 방법이 다릅니다. 그중에서 데스크탑, 웹은 터미널에 명령어를 입력해 주어야 하는데, 이게 참고한 자료마다 조금씩 달라서, 혹시 이 글을 보시는 분들에게 도움이 될까 싶어 글 남깁니다.
- 데스크탑 실행 : ./gradlew :composeApp:run
- 웹 실행 : ./gradlew :composeApp:wasmJsBrowserProductionRun
++ 글 작성하면서 좀 더 찾아보았는데, 개발 중에는 wasmJsBrowserDevelopmentRun을 사용하는 것이 더 빠르고, 최종 배포나 성능 테스트 시에는 wasmJsBrowserProductionRun을 사용하는 것이 좋다고 합니다 😊
Windows에서는 ./gradlew 대신 gradlew.bat을 사용하면 됩니다.
2. 'java.net.ConnectException: Connection refused' 에러 발생 (로컬 서버를 생성하는 경우)
Android 에뮬레이터는 독립적인 가상기기이기 때문에 에뮬레이터 내부에서 localhost는 자기 자신을 의미합니다. 그렇기에 Android에서 localhost으로 연결하려고 하면, 자기 자신(에뮬레이터)에게 연결하려고 합니다. 그 결과 에뮬레이터 내부에는 서버가 없기 때문에 Connection refused 에러가 발생하게 됩니다.
실제 기기 또한 localhost는 자기 자신을 의미합니다. 그렇기에 localhost로 연결하려고 하면, 자기 자신에게 연결하려고 합니다. 실제 Android 기기 내부에도 서버가 없기에 동일한 에러가 발생합니다.
이를 해결하기 위해서
- Android 에뮬레이터의 경우: 호스트 PC의 localhost에 접근하기 위해 특수한 IP 주소를 제공합니다. 그렇기에 '10.0.2.2' 를 입력해 주면 문제를 해결할 수 있습니다.
- 실제 Android 기기에서 테스트하는 경우: 실제 기기에서는 10.0.2.2가 작동하지 않습니다. 대신 PC의 실제 로컬 네트워크 IP 주소를 사용해야 합니다
ios 시뮬레이터에서도 동일한 에러가 발생할 수 있으며, ios의 경우 위에 언급한 특수한 IP 주소가 제대로 동작하지 않습니다. 그렇기에 장기적인 관점에서 PC의 실제 로컬 네트워크 IP 주소를 입력하여서, Android 에뮬레이터와 ios 시뮬레이터에 대해 일관성을 유지하는 방법을 좀 더 추천드립니다!
3.공통으로 사용하는 코드들이 있다면 공통 모듈에서 작업해주세요! 훨씬 더 간략하게 코드를 작성할 수 있습니다 (저는 공통으로 사용하는 모듈이 있는지 모르고 코드를 작성했다가 나중에 코드를 수정해야 했습니다 😥)
느낀 점
KMP 개발을 하면서 아직 KMP가 익숙하지 않아서 개발환경 세팅 및 플랫폼에 맞춰서 실행하기까지 제법 많은 시간이 소요되었습니다. 그렇기에 처음 시작했을 때, 무작정 프로젝트를 생성하고 구현해 보는 것도 좋지만, 시간 여유가 있다면 KMP에 대해 조금만 공부해 보고 시작한다면 좀 더 완성도 높은 결과물을 만들 수 있을 겁니다!
KMP는 확실히 koltin 이라는 언어 하나만을 사용해서 여러 플랫폼을 구현할 수 있다는 굉장히 큰 매력이 있습니다.
작업을 하면서 왜 많은 사람들이 KMP에 열광하는지 알 수 있었습니다. 저 또한 한번 KMP를 사용해 보니까 그 매력을 알 수 있었습니다!
'코딩 토막 지식' 카테고리의 다른 글
| SHA1 해시값 구하기 (0) | 2022.11.03 |
|---|---|
| [Android] viewModels 사용하기 (0) | 2022.04.15 |
| [Android] .gitignore 사용하기 (0) | 2022.02.24 |
| 쿠키 / 세션 / 토큰에 대해 (0) | 2022.01.14 |
| REST API란? (0) | 2021.12.24 |