Kotlin Multiplatform 설치법

Kyu hyunSung·2025년 6월 1일
0

KMP

목록 보기
1/1

2025년 5월 21일 기준

Environment

Kotlin Multiplatform quickstart

OS

Mac OS (윈도우는 Kotlin Multiplatform Plugin 지원 예정)

IDE

  • IntelliJ IDEA 2025.1.1.1

or

  • Android Studio Narwhal 2025.1.1 Canary 10.

    K2 Mode

and

  • Xcode 15+ (최신 버전)

Kotlin & Gradle

Kotlin: 2.1.21
Gradle: 8.6 이하

참고: Gradle 8.7-8.10도 지원하지만 withJava() 함수에서 deprecation 경고 발생

JDK

  • 최소 요구사항: JDK 11 이상
  • 네이티브 배포용: JDK 17 이상
  • 권장: JDK 17 또는 21


Kotlin Multiplatform wizard

그냥 이거 쓰셈

수동 작업 방법 : Kotlin Multiplatform quickstart

README.md

This is a Kotlin Multiplatform project targeting Android, iOS.
Android와 iOS를 대상으로 하는 Kotlin Multiplatform 프로젝트입니다.

* `/composeApp` is for code that will be shared across your Compose Multiplatform applications.
* `/composeApp`은 Compose Multiplatform 애플리케이션 간에 공유될 코드를 위한 폴더입니다.

  It contains several subfolders:
  여러 하위 폴더를 포함합니다:

  - `commonMain` is for code that's common for all targets.
  - `commonMain`은 모든 대상에 공통적인 코드를 위한 폴더입니다.

  - Other folders are for Kotlin code that will be compiled for only the platform indicated in the folder name.
  - 다른 폴더들은 폴더 이름에 표시된 플랫폼에서만 컴파일될 Kotlin 코드를 위한 것입니다.

    For example, if you want to use Apple's CoreCrypto for the iOS part of your Kotlin app,
    예를 들어, Kotlin 앱의 iOS 부분에서 Apple의 CoreCrypto를 사용하고 싶다면,

    `iosMain` would be the right folder for such calls.
    `iosMain`이 그러한 호출을 위한 적절한 폴더입니다.

* `/iosApp` contains iOS applications. Even if you're sharing your UI with Compose Multiplatform,
* `/iosApp`은 iOS 애플리케이션을 포함합니다. Compose Multiplatform으로 UI를 공유하더라도,

  you need this entry point for your iOS app. This is also where you should add SwiftUI code for your project.
  iOS 앱을 위한 이 진입점이 필요합니다. 프로젝트에 SwiftUI 코드를 추가해야 하는 곳이기도 합니다.

* `/shared` is for the code that will be shared between all targets in the project.
* `/shared`는 프로젝트의 모든 대상 간에 공유될 코드를 위한 폴더입니다.

  The most important subfolder is `commonMain`. If preferred, you can add code to the platform-specific folders here too.
  가장 중요한 하위 폴더는 `commonMain`입니다. 원한다면 여기에 플랫폼별 폴더에도 코드를 추가할 수 있습니다.

Learn more about [Kotlin Multiplatform](https://www.jetbrains.com/help/kotlin-multiplatform-dev/get-started.html)…
[Kotlin Multiplatform](https://www.jetbrains.com/help/kotlin-multiplatform-dev/get-started.html)에 대해 더 알아보세요…

Structure

루트 디렉토리

KotlinProject/
├── README.md                    # 프로젝트 설명 파일
├── build.gradle.kts            # 루트 빌드 스크립트 (Kotlin DSL)
├── settings.gradle.kts         # 프로젝트 설정 파일
├── gradle.properties           # Gradle 설정 프로퍼티
├── local.properties            # 로컬 환경 설정 (Android SDK 경로 등)
├── gradlew                     # Gradle Wrapper 실행 파일 (Unix/Linux/Mac)
└── gradlew.bat                 # Gradle Wrapper 실행 파일 (Windows)

gradle/ 디렉토리

gradle/
├── libs.versions.toml          # 의존성 버전 카탈로그 (Version Catalog)
└── wrapper/
    ├── gradle-wrapper.jar      # Gradle Wrapper JAR 파일
    └── gradle-wrapper.properties # Gradle Wrapper 설정

composeApp/ 디렉토리 (Compose Multiplatform UI 코드)

composeApp/
├── build.gradle.kts            # composeApp 모듈 빌드 스크립트
├── build/                      # 빌드 결과물 디렉토리
│   └── generated/              # 자동 생성된 파일들
│       └── compose/
│           └── resourceGenerator/
│               ├── kotlin/     # 리소스 접근용 자동 생성 Kotlin 파일들
│               │   ├── androidMainResourceAccessors/    # Android 리소스 접근자
│               │   ├── androidMainResourceCollectors/   # Android 리소스 수집기
│               │   ├── commonMainResourceCollectors/    # 공통 리소스 수집기
│               │   └── commonResClass/                  # 공통 리소스 클래스 (Res.kt)
│               └── preparedResources/                   # 준비된 리소스 파일들
└── src/                        # 소스 코드 디렉토리
    ├── androidMain/            # Android 플랫폼 전용 코드
    │   ├── AndroidManifest.xml # Android 앱 매니페스트
    │   ├── composeResources/   # Compose 리소스
    │   │   └── drawable/       # Drawable 리소스
    │   ├── kotlin/             # Android Kotlin 소스 코드
    │   │   └── org/example/project/
    │   │       ├── App.kt      # Android 앱 컴포넌트
    │   │       └── MainActivity.kt # Android 메인 액티비티
    │   └── res/                # Android 네이티브 리소스
    │       ├── drawable/       # 일반 Drawable 리소스
    │       ├── drawable-v24/   # API 24+ Drawable 리소스
    │       ├── mipmap-*/       # 앱 아이콘 (다양한 해상도)
    │       └── values/         # 문자열, 색상 등 값 리소스
    └── androidUnitTest/        # Android 단위 테스트
        └── kotlin/
            └── org/example/project/
                └── ComposeAppAndroidUnitTest.kt

iosApp/ 디렉토리 (iOS 네이티브 앱)

iosApp/
├── Configuration/
│   └── Config.xcconfig         # Xcode 빌드 설정
├── iosApp/                     # iOS 앱 소스 코드
│   ├── Assets.xcassets/        # iOS 앱 에셋 (아이콘, 색상 등)
│   │   ├── AccentColor.colorset/
│   │   ├── AppIcon.appiconset/
│   │   └── Contents.json
│   ├── ContentView.swift       # SwiftUI 메인 뷰
│   ├── Info.plist             # iOS 앱 정보 설정
│   ├── Preview Content/        # SwiftUI 프리뷰용 에셋
│   │   └── Preview Assets.xcassets/
│   └── iOSApp.swift           # iOS 앱 진입점
└── iosApp.xcodeproj/          # Xcode 프로젝트 파일
    ├── project.pbxproj        # Xcode 프로젝트 설정
    └── project.xcworkspace/   # Xcode 워크스페이스
        ├── contents.xcworkspacedata
        └── xcshareddata/
            └── swiftpm/
                └── configuration/

shared/ 디렉토리 (공유 비즈니스 로직)

shared/
├── build.gradle.kts            # shared 모듈 빌드 스크립트
├── build/                      # 빌드 결과물
│   ├── internal/kmp/           # KMP 내부 빌드 파일
│   ├── kotlin/                 # Kotlin 컴파일 결과
│   ├── kotlinProjectStructureMetadata/ # 프로젝트 구조 메타데이터
│   └── tmp/                    # 임시 파일
└── src/                        # 소스 코드
    ├── androidMain/            # Android 플랫폼별 구현
    │   └── kotlin/
    │       └── org/example/project/
    │           └── Platform.android.kt  # Android 플랫폼 구현
    ├── commonMain/             # 모든 플랫폼 공통 코드
    │   └── kotlin/
    │       └── org/example/project/
    │           ├── Greeting.kt     # 공통 비즈니스 로직
    │           └── Platform.kt     # 플랫폼 추상화 인터페이스
    ├── commonTest/             # 공통 테스트 코드
    │   └── kotlin/
    │       └── org/example/project/
    │           └── SharedCommonTest.kt
    └── iosMain/                # iOS 플랫폼별 구현
        └── kotlin/
            └── org/example/project/
                └── Platform.ios.kt     # iOS 플랫폼 구현

주요 개념 정리

composeApp vs shared

  • composeApp: UI 코드 (Compose Multiplatform)를 공유하는 모듈
  • shared: 비즈니스 로직을 공유하는 모듈

플랫폼별 코드 구조

  • commonMain: 모든 플랫폼에서 공통으로 사용되는 코드
  • androidMain: Android 플랫폼 전용 구현
  • iosMain: iOS 플랫폼 전용 구현

expect/actual 패턴

  • Platform.kt (commonMain): 플랫폼별 기능을 추상화한 expect 선언
  • Platform.android.kt, Platform.ios.kt: 각 플랫폼의 actual 구현

빌드 시스템

  • Gradle 기반 빌드 시스템
  • Version Catalog (libs.versions.toml)로 의존성 버전 관리
  • 각 모듈별 독립적인 build.gradle.kts 파일

빌드 방법

안드로이드는 원래 하던듯이 빌드하면 된다.

IOS 에서는 안됌.따로 해줘야하ㅣㅁ

  1. Xcode 프로젝트 열기

  1. IOS 프로젝트 설정
  • Xcode에서 Project navigator의 프로젝트 이름을 더블클릭하여 iOS 프로젝트 설정을 열기

  • 왼쪽 Targets 섹션에서 프로젝트를 선택한 후 Build Phases 탭을 클릭.
    ( 아이콘을 클릭하고 New Run Script Phase를 선택합니다. )

  • 생성된 Run Script 항목을 확장하고 텍스트 필드에 다음 스크립트 넣기.
    ( 오른쪽 Full Path 경로보고 따라 치면됨 )

cd "$SRCROOT/.."
./gradlew :shared:embedAndSignAppleFrameworkForXcode

만약 안돼면

cd "$SRCROOT/.."
./gradlew clean
./gradlew :shared:embedAndSignAppleFrameworkForXcode

  • 컴파일 전 단계로 드래그해서 올리기

  • User Script Sandboxing 비활성화

  • 그럼 이렇게 ContentView에서 프리뷰로도 볼 수 있음.

안드로이드 스튜디오에서 작동시키기

IOS 애뮬레이터 추가하기

1) 메인 메뉴에서 File | Sync Project with Gradle Files를 선택합니다. Android Studio가 자동으로 simpleLoginIOS라는 실행 구성을 생성합니다.
2) 실행 구성 목록에서 simpleLoginIOS를 선택합니다. iOS 시뮬레이터를 선택하고 Run을 클릭합니다.

  • 트러블이슈 : IOS 애뮬레이터를 찾질 못함.

06/03 정정 : 버젼이슈. 2025.1.1 이상 안드로이드로 설치.

  • 트러블 이슈: 빌드는 됐으나 애뮬레이터에 뜨질 않음.

Failed waiting too long for the connection to be established

버젼을 다르게해도 똑같아서 그냥 포기.

애뮬레이터 대안 방법

1) 아이폰을 직접 기기에 연결해서 사용하기


2) Xcode 상에서 UI 작업하고 돌리기

  • Shard 모듈 임포트 필수

어차피 안드로이드 스튜디오에서 UI 볼수가 없어서 Xcode 키는게 낫긴 할듯.

profile
디지털 치매 예방

0개의 댓글