개발을 잘하고 싶은 주니어?

Swift Package Manager (SPM) 공부하기 - 이론 본문

개발/iOS

Swift Package Manager (SPM) 공부하기 - 이론

데쿠! 2021. 11. 27. 20:00
반응형

Swift Package Manager를 공부하기에 앞서서 공부해야 할 개념을 먼저 알아보겠습니다.

Module

Swift에서는 코드를 모듈화해서 이곳저곳에서 사용하도록 합니다. 프로그램에서는 dependencies를 통해서 다른 곳의 모듈을 import 하기도 합니다.

macOS의 Darwin같이 시스템이 제공해주는 모듈도 있고, 의존성을 통해 다운로드된 모듈도 있습니다.

프로그래밍 과정에서 모듈을 사용할 때에는 특정 상황을 해결하기 위해 사용할 때도 있고 해당 상황과 다른 상황에서도 사용될 수 있습니다. 예를 들어서 네트워크 요청 기능을 제공하는 모듈은 사진 공유 앱이나 날씨 앱에서 사용될 수 있습니다. (전혀 다른 앱이지만 하나의 공통된 모듈을 사용할 수 있다는 의미)

이렇게 모듈을 사용하면 같은 기능을 그대로 재작성해서 사용하는게 아니라 해당 모듈을 import 하는 방식으로 재사용할 수 있게 됩니다.

Packages

package는 Swift source file나 manifest file로 구성되어 있습니다. 이 manifest file은 Package.swift의 이름으로 생성이 됩니다. 이 파일은 PackageDescription 모듈을 사용해서 package의 이름과 내부 정보(의존성같은?)를 정의합니다.

// swift-tools-version:4.0
// manifest file 예시
import PackageDescription

let package = Package(
    name: "DeckOfPlayingCards",
    products: [
        .library(name: "DeckOfPlayingCards", targets: ["DeckOfPlayingCards"]),
    ],
    dependencies: [
        .package(url: "https://github.com/apple/example-package-fisheryates.git", from: "2.0.0"),
        .package(url: "https://github.com/apple/example-package-playingcard.git", from: "3.0.0"),
    ],
    targets: [
        .target(
            name: "DeckOfPlayingCards",
            dependencies: ["FisherYates", "PlayingCard"]),
        .testTarget(
            name: "DeckOfPlayingCardsTests",
            dependencies: ["DeckOfPlayingCards"]),
    ]
)
manifest file : 특정 프로그램의 버전, 의존성과 같은 프로그램의 정보를 설명하는 파일

애플 개발자 문서에서 보면 Swift Packages는 재사용 가능한 코드를 생성해서, Xcode 프로젝트 내에서 공유하거나 다른 개발자들과 공유하는 것이라고 적혀있습니다.

위의 그림과 같이 Swift, Objective-C, Objective-C++, C, C++ 코드와 binaries, resource들을 하나의 번들로 묶어서 프로젝트에서 쉽게 사용할 수 있도록 합니다. 

Xcode는 이러한 Swift packages를 추가, 제거할 수 있도록 지원해주며, package dependencies도 관리하도록 합니다. 

Dependencies

target의 dependencies는 특정 패키지에서 코드에 의해 요구되어지는 모듈이라고 합니다. 말이 좀 어렵게 쓰여 있는데 제가 해석했을 때는 Kingfisher의 경우에는 특정 url의 이미지를 불러오는 모듈입니다. 만약 개발 중에 url을 가지고 이미지를 불러오고 싶은 경우에 (코드에 의해 요구되어지는) Kingfisher라는 모듈을 import 해서 사용하도록 합니다.

dependency는 소스 패키지(위의 예시에서는 Kingfisher) 상대적인 or 절대적인 URL을 가지며, 패키지의 버전에 대한 요구사항도 가집니다.

Swift Package Manager

여기서 package manager의 역할은 현재 프로젝트에 대한 모든 dependency들을 생성해서 다운로드하는 과정을 자동화함으로써 자동화하지 않았을 때 들었던 비용을 줄이는 것입니다. 이 과정은 재귀적으로 일어나는데, 그 이유는 dependency는 또 자신의 dependency를 가질 수 있고, 그 dependency는 또 다른 dependency를 가질 수 있기 때문입니다. 

package manager는 이러한 dependency graph를 만족하기 위해 필요한 모든 것을 구성하고 다운받습니다. 

 

 

 

Reference

https://www.swift.org/package-manager/

 

Swift.org

Swift is a general-purpose programming language built using a modern approach to safety, performance, and software design patterns.

www.swift.org

https://developer.apple.com/documentation/swift_packages/

 

Apple Developer Documentation

 

developer.apple.com

 

반응형

'개발 > iOS' 카테고리의 다른 글

Collection View 공부하기 (실습)  (0) 2021.11.30
Swift Package Manager (SPM) 공부하기 - 실습  (0) 2021.11.27
Framework란? Library란?  (0) 2021.11.27
의존성(Dependency) 공부하기  (1) 2021.11.27
Hex to Color  (0) 2021.11.23
Comments