[iOS] OpenSource와 SPM

 

 

개발을 하다보면 이미 누군가가 불편한 부분을 쉽게 사용하라고 코드를 미리 만들어 둔 것들이 있다. 덕분에 개발자들은 다른 부분에 더 신경을 쓸 수 있고, 리소스도 절약할 수 있다. 이번엔 오픈 소스가 정확히 어떤 것들이 있는지 iOS 생태계에 대표적인 오픈 소스는 무엇인지 공부해보자.

 

 

 

1. OpenSource

 

 오픈 소스란 ‘오픈소스 소프트웨어(Open Source Software, OSS)’의 줄임말로 누구나 자유롭게 접근하여 활용, 수정, 배포할 수 있는 코드를 뜻한다. 개발자들이 모인 커뮤니티(GitHub...)에서 자유롭게 개발하고 보완하며 누구나 사용할 수 있도록 만든 소프트웨어이기 때문에, 개인이나 기업이 만든 것보다 저렴하고 유연하며 지속성이 있다.

 

 오픈 소스 특성상 초기부터 높은 완성도를 갖고 있진 않지만 수천 명의 개발자가 함께 사용하며 주고받는 피드백을 통해 빠르게 발전해나가는 특성이 있다. 그래서  버그나 취약점이 노출되었을 때 패치가 빠르게 나오며, 혁신적인 기능과 개선 사항도 계속해서 업데이트된다. 그렇기에 많은 기업들이 오픈 소스를 사용하고 있으며, 이름만 들어도 아는 기업들 역시 오픈 소스를 많이 사용한다.

 

 

 1. 오픈 소스의 종류

 생각보다 많은 것들이 오픈 소스이다. 오픈 소스의 대표적인 예로는 프로그래밍 언어가 있다. 지금 우리가 공부하는 Swift 역시 오픈 소스이며 2015년 공개된 Mac 전용 프로그래밍 언어이다. 마찬가지로 안드로이드 앱을 개발하기 위한 Kotlin 역시 마찬가지이다. 이 외에도 파이썬, R, 텐서플로우, 파이토치 등도 있으며 Linux 역시 오픈 소스이다. 

 

 

 

 

2. 오픈 소스의 장점

 

 "그래서 오픈 소스가 뭐가 좋은데?"라고 묻는다면 크게 두 가지 이유가 있다.

 

 첫번째로는 비용을 절감할 수 있다. 오픈 소스는 특성상 공유를 목적으로 제작되었기에, 독점 소프트웨어에 비해 개발 비용을 많이 절감할 수 있다. 또한 이미 만들어진 코드를 참고하고 수정하여 적용하기에 개발 시간을 단축하고 오류나 버그들의 발생을 예방하여 기업 입장에서는 보다 더 효율적으로 프로젝트를 진행할 수 있다. 

 

 두번째 이유는 네트워킹이다. 오픈 소스의 가장 큰 특징 중 하나는 '커뮤니티'이다. 오픈 소스의 발생 근간인 커뮤니티에서는 모든 소스코드가 공개되어 있어서 그 어떤 개발자도 자유롭게 개발하고 배포할 수 있다. 그래서 유연한 개발이 가능해 시장 변화에 대응하기 수월하다. 또한 어려운 점이나 지원이 필요하면 커뮤니티를 통해 도움을 받을 수 있다는 장점도 있다.

 

 

 

 

3. 주의할 점

 

 이름이 오픈 소스라서 오해가 있을 수 있다. 모든 오픈 소스가 무료이거나 지적재산권, 라이선스가 없는 것이 아니다. 물론 없는 것도 있지만 우리가 개발을 하며 사용할 오픈 소스들은 적어도 라이선스를 가지고 있을 것이다. 따라서 지적재산권의 문제가 있는지 없는지를 확인해야할 필요가 있다. 또 라이선스(소프트웨어 저작권을 가진 소유자가 일정한 조건에 따라 사용자에게 사용 권한을 허가해 주는 계약)가 있는 경우 그 조건을 이행해야 사용이 가능하다. 예를 들자면 MIT License 는 그 오픈 소스를 사용했다고 표시하면 사용 조건을 충족한다.

 

 

 

 

 

2. SPM(Swift Pacakge Manager)

 

 1. SPM이란?

 

 SPM을 알기 전에 2가지 미리 알아두면 이해하기 쉬운 개념이 있다. 바로 모듈(Module)과 패키지(Packages)이다.

 

Module

모듈이란 무엇일까? 모듈은

  • 보다 작고 이해할 수 있는 단위로 나뉘어진 것
  • 그 자체로 하나의 완전한 기능을 수행할 수 있는 독립된 실체
  • 본체에서 분리되어 작은 부분으로 유기적으로 구성되어 있다가 필요할 때 본체에 합류하여 그 기능을 수행할 수 있는 것

이라 정의되어 있다. 따라서 코딩에서 모듈이란 '한가지 일을 수행할 수 있는 코드의 모음'이라고 할 수 있다.

 

Package

그럼 패키지란 뭘까?

패키지는 '모듈들을 한 묶음으로 묶어놓은 것'이다. 컴퓨터로 예시를 들자면 여러 파일(모듈들)을 모아놓은 폴더와 비슷한 개념이다.

 

 

 SPM(Swift Package Manager) 종속성 관리를 위한 Apple의 공식 도구이다. Cocoapods이나 Carthage와 같은 써드 파티 툴이 아닌 퍼스트 파티 툴이다. 더 쉽게 설명하자면 Swift 언어로 개발된 애플리케이션 및 프로젝트에서 코드를 구조화하고 관리하는 핵심 도구이다. 또 소스 코드의 모듈화, 종속성 관리, 빌드 프로세스 자동화, 테스트 지원 및 패키지 공유를 위한 다양하고 강력한 기능을 제공한다. 하지만 이 글에서 자세히 다루는 SPM의 주요역할은 다른 라이브러리의 다운로드하는 과정을 자동화해서 편리하게 사용하는 것이다. 

 

※ 여기서 종속성 관리의 예를 적어보겠다. 예를 들어 A라는 오픈 소스는 B,C라는 오픈 소스들을 사용해서 만들었다. 하지만 만약 B와 C가 버전이 달라진다면, 달라진 버전에 의해 오류가 날 수 있는데, 이를 오류가 나지 않게 관리해주는 것이다. (만약 틀렸다면 알려주세요!!) 

 

 

Dependency Manager

- CocoaPods(코코아팟) : 워크스페이스에 라이브러리를 추가해서 사용
   - 장점 : 거의 모든 라이브러리들이 지원
   - 단점 : build speed 느림


- Carthage(카르타고) 
   - 장점 : build speed 빠름
   - 단점 : 이제 업데이트 안됨.... 지원안하는게 많음


SwiftPM(SPM) 

   - 장점 : 애플이 만들었음
   - 단점 : 지원하는 오픈소스가 적음 (다만 최근에 많이 지원하는 경향)


- Manually(수동) : 수동으로 코드 복붙해서 추가하는 방식
   - 단점 : 코드가 업데이트 될때 거기에 대한 대응이 어려움

 

 

 

 2. 유명한 오픈 소스

 

 

 아이폰 키보드의 여러 커스텀 기능 제공
 https://github.com/hackiftekhar/IQKeyboardManager

 

GitHub - hackiftekhar/IQKeyboardManager: Codeless drop-in universal library allows to prevent issues of keyboard sliding up and

Codeless drop-in universal library allows to prevent issues of keyboard sliding up and cover UITextField/UITextView. Neither need to write any code nor any setup required and much more. - GitHub - ...

github.com


 잠깐 떴다가 사라지는 토스트 뷰

 https://github.com/scalessec/Toast-Swift

 

GitHub - scalessec/Toast-Swift: A Swift extension that adds toast notifications to the UIView object class.

A Swift extension that adds toast notifications to the UIView object class. - GitHub - scalessec/Toast-Swift: A Swift extension that adds toast notifications to the UIView object class.

github.com

 
 textfield: textfield에서 여러 애니메이션이 가미된 UI를 제공

 https://github.com/raulriera/TextFieldEffects

 

GitHub - raulriera/TextFieldEffects: Custom UITextFields effects inspired by Codrops, built using Swift

Custom UITextFields effects inspired by Codrops, built using Swift - GitHub - raulriera/TextFieldEffects: Custom UITextFields effects inspired by Codrops, built using Swift

github.com

 

 calendar의 여러 기능 제공
 https://github.com/WenchaoD/FSCalendar

 

GitHub - WenchaoD/FSCalendar: A fully customizable iOS calendar library, compatible with Objective-C and Swift

A fully customizable iOS calendar library, compatible with Objective-C and Swift - GitHub - WenchaoD/FSCalendar: A fully customizable iOS calendar library, compatible with Objective-C and Swift

github.com

 

 텝메뉴 기능
 https://github.com/uias/Tabman

 

GitHub - uias/Tabman: ™️ A powerful paging view controller with interactive indicator bars

™️ A powerful paging view controller with interactive indicator bars - GitHub - uias/Tabman: ™️ A powerful paging view controller with interactive indicator bars

github.com


인터넷에 있는 이미지를 url을 통해 가져와서 바로 쓰는 이미지 기능
 https://github.com/onevcat/Kingfisher

 

GitHub - onevcat/Kingfisher: A lightweight, pure-Swift library for downloading and caching images from the web.

A lightweight, pure-Swift library for downloading and caching images from the web. - GitHub - onevcat/Kingfisher: A lightweight, pure-Swift library for downloading and caching images from the web.

github.com


 네트워크 통신
 https://github.com/Alamofire/Alamofire

 

GitHub - Alamofire/Alamofire: Elegant HTTP Networking in Swift

Elegant HTTP Networking in Swift. Contribute to Alamofire/Alamofire development by creating an account on GitHub.

github.com

 

 위의 오픈 소스들은 SPM을 지원하는 대기업들도 사용하는 오픈 소스들이다. 

 

링크를 타고 들어가보면

 

 

 이런 화면을 볼 수 있다.!!

 

오른쪽 상단을 보면 Star가 있는데 이는 북마크로 몇백개만 되도 엄청 많은 것이라고 한다!

 

또 커밋이 얼마전에 됐는지(업데이트), 릴리즈는 언제했는지 그리고 About 부분을 보면 MIT License도 있는 것을 확인할 수 있다.

 

이 페이지를 아래로 내리면

 

 

 리드미가 있는데 이 리드미를 통해 어떤 목적으로 만들어졌고, 어떤 기능을 가졌는지 또 누가 기여했는지, 어떻게 사용하면 되는지 등이 적혀있다.

 

 

지금까지 읽었다면 이 오픈 소스에 관한 궁금증이 몇개가 떠오를 수 있어서 미리 답하고 가려한다.

 

믿고쓸만한가?
- 많이 쓰는 앱들의 설정에 가서 사용된 오픈소스 라이선스 와 비슷하게 쓰여진 버튼을 누르면 어떤 오픈소스들이 사용되었는지 나온다
- 이 중 많이 겹치는 것들은 믿고 쓸 수 있지 않을까?

왜 무료로 공유할까?
- 개발 자체가 공유문화
- 다른 사람들이 많이 쓰고, 잘 쓰는 것 자체가 이력이자 인정 받는 것이기 때문에

만약 라이브러리를 만든 분께서 라이브러리를 삭제하면 어떡하나?
- 못 쓰게 된다..(주의!)

 

 

 

 

 3. 사용법

 

 우선 오픈 소스를 추가할 프로젝트를 열고 좌상단에 프로젝트를 누른다.

 

 

 

그 후 Project 아래 있는 자신의 프로젝트를 누르고, 탭에서 Package Dependencies를 누른 후 아래에 있는 + 버튼을 누른다.

 

 

 

 

 그럼 오픈 소스를 검색할 수 있는 창이 나오는데, 오른쪽 상단 텍스트필드에 위에서 내가 다운로드할 오픈 소스의 Github 주소를 붙여 넣고 검색한다. 이때 오픈 소스의 버전 관리를 내가 원하는 대로 가능하다. 버전 관리 룰을 설정하고 오픈 소소가 맞는지 확인 후 Add Package를 눌러보자.

 

더보기

※ 추가할 때 버전 관리 룰 정하기

 

 

 패키지를 추가할 때 위의 사진과 같이 Dependency Rule을 변경할 수 있다.

 

  • 버전 범위 지정
    • Up to Next Major – Major 버전으로 지정 
    • Up to Next Minor – Minor 버전으로 지정 
    • Exact – 특정 버전만으로 특정하기 
    • Range – 직접 지정하기 
  • Branch
    • git branch 이름으로 지정 
  • Commit
    • 특정 git commit으로 지정 
라이브러리 뒤에 숫자들이 있는데 (ex. 2.8.4)
맨 앞이 메이저 버전의 번호이다. 보통 대규모 업데이트를 할때 사용하며, 메이저 번호가 달라지면 코드가 많이 달라져서 새로운 코드로 대응을 해줘야한다. (ex. 2.8.9 -> 3.0.1  이런 경우 새로운 대응 필요)
두번째에 위치한 숫자는 마이너 버전의 번호인데, 기능 하나가 추가되었을때 달라진다. 기존버전과 호환이 된다. (ex 2.9.1)
마지막 숫자는 patch나 버그 수정, 기능이 크게 수정되지 않았을 때 이 버전을 올린다. (ex 1.7.1)

 

 

 

 위와 같이 진행률이 나오며 좀 기다리면 패키지 추가가 완료되었다고 나온다! 처음에는 느릴 수 있지만 2~3개 다운 받으면 빨라진다.

 

 그럼 아까 확인했던 Package Dependencies 탭에 내가 추가한 오픈 소스들이 있는 것을 볼 수 있다.

 

 

 또 파일을 볼 수 있는 네비게이터 영역 아래에 패키지(내가 추가한 오픈 소스)가 추가된 것을 확인할 수 있다.

 

 

 

 여기까지가 SPM을 사용해 오픈 소스를 사용하기 위한 준비였다. 각 오픈 소스의 사용 방법은 리드미를 읽어보길 바란다!!!!