modular map 이란?

ellyheetov·2025년 7월 7일
0
post-thumbnail

모듈이란?

모듈이란 하나의 프레임워크, 라이브러리, 패키지 단위를 의미해요. Swift 에서 import XXX 할때 XXX 가 모듈명이에요. 라이브러리는 '모듈' 단위로 프로젝트에 통합되는 구조예요.

Swift Package 의 경우

Swift Package 는 Git repository 에 있는 Package.swift 파일로 정의된 라이브러리예요.

어떻게 import XXX 만으로 사용할 수 있어요?

Xcode 가 package 를 build target 에 통합하면 모듈 맵을 생성해요. 컴파일러는 이 맵을 토대로 모듈을 인식해서 import 하는 거죠.

모듈맵은 Swift 컴파일러에게 이 라이브러리는 이렇게 생겼고, 이렇게 import 할 수 있어라고 알려주는 파일인데요. 모듈맵에서 모듈 이름을 정의하여 import XXX 로 사용할 수 있어요.

swift 로 작성된 라이브러리는 모듈 시스템이 내장 되어있어 있어서 별도의 모듈맵 파일을 작성할 필요가 없어요.

C, Objective-C 라이브러리의 경우

C 나 Objective-C 라이브러리의 경우 모듈맵을 가지고 있지 않아요.

module.modulemap 파일은 아래처럼 생성해요.

module Alamofire {
  header "Alamofire.h"
  export *
}

이렇게 module.modulemap 파일을 작성하면 모듈 단위로 import 가 가능해요.

예시

직접 파일을 만들어서 예를 들어 볼게요.

C 언어로 작성된 MathLib 를 생성하고, add 메소드를 가지고 올거예요.

int add(int a, int b);

STEP1. C 프로젝트 생성

  • Sources/mathlib.c
#include "mathlib.h"

int add(int a, int b) {
    return a + b;
}
  • Sources/include/mathlib.h
#ifndef mathlib_h
#define mathlib_h

int add(int a, int b);

#endif /* mathlib_h */

STEP2. module.modulemap 생성

module MathLib {
  header "include/mathlib.h"
  export *
}

내가 만든 C 프로젝트를 MathLib 라는 이름으로 내보내겠다는 뜻이예요.

STEP3. Package.swift 생성

import PackageDescription

let package = Package(
    name: "ProejctName",
    products: [
        .library(
            name: "MathLib",
            targets: ["MathLib"]),
    ],
    targets: [
        .target(
            name: "MathLib",
            dependencies: [],
            path: "Sources",
            sources: ["mathlib.c"],
            publicHeadersPath: "include"
        ),
        .testTarget(
            name: "MathLibTests",
            dependencies: ["MathLib"]),
    ]
) 

STEP4. Package Dependency 추가하기

Swift 프로젝트로 돌아와서 Package Dependency 만 추가해 주면, import MathLib 으로 사용할 수 있어요.

import MathLib

MathLib.add(10, 10)

정리

정리하자면, module 은 import 가능한 코드 단위를 말해요. import 해서 사용하기 위해서는 module map 이 필요한 데요. module map 은 컴파일러에게 모듈의 정보를 알려주는 파일이에요. Swift 에서는 자동으로 생성해 주지만 C, Objective-C에서는 직접 생성해 주어야 해요.

profile
 iOS Developer 좋아하는 것만 해도 부족한 시간

0개의 댓글