오픈소스

소스코드를 공개해 누구나 특별한 제한 없이 그 코드를 볼 수 있도록 한 소스코드

iOS 개발 생태계만 하더라도 정말 많은 오픈소스가 존재합니다. 네트워킹 라이브러리인 Alamofire 부터 이미지 다운로드를 관리해주는 Kingfisher 까지 어렵지 않게 많은 애플리케이션에서 사용되는 오픈소스를 접할 수 있습니다. 해당 기능을 구현하는 시간을 절약함은 물론 수 많은 개발자들에게 검증받은 질 좋은 기능을 자신의 애플리케이션에 담을 수 있는 것입니다. 오픈소스 라이선스 종류에 따라 다르지만 보통 누구나 자유롭게 사용할 수 있고 라이브러리 개선에도 참여할 수 있습니다

의존성 관리도구

애플리케이션 기능을 개발하기 위해 외부 라이브러리를 사용할 때 프로젝트와 해당 라이브러리의 상관관계를 용이하게 관리해주는 도구가 의존성 관리도구 입니다. 내부 모듈을 분리하여 관리할 때도 사용할 수 있습니다.

Java에는 Maven, Javascript에는 Yarn 혹은 NPM, Python에는 pyenv 등 언어별로 의존성 관리도구는 매우 다양합니다. 환경마다 다양한 의존성 관리도구가 있듯이 코코아(Cocoa) 및 코코아터치(Cocoa Touch) 애플리케이션 개발 환경에서는 코코아팟(Cocoapods), 카르타고(Carthage), 스위프트 패키지 매니저(Swift Package Manager)가 있습니다.

의존성 관리도구를 사용하는 것이 필수는 아닙니다. 하지만 사용하지 않을 경우 그 만큼 불필요한 공수가 발생할 수 있습니다. 예를 들어, 외부 라이브러리를 직접 프로젝트에 적절히 포팅하여 삽입하는 작업 같은것 말이죠. 여기까지는 문제가 없을지 몰라도 해당 라이브러리에 대한 업데이트가 생겨 버전이 올라간다면 라이브러리를 교체해줘야 하는 경우가 발생할 것입니다. 일일히 기존 라이브러리를 삭제하고 새로 삽입시켜야 하는 일이 생기게 되겠죠. 이 때 발생하는 휴먼 에러(사실상 제일 큰 문제…인 인간…) 또한 무시할 수 없을 것입니다. 하지만 이런 작업들이 명령어 한 줄 혹은 클릭 몇 번으로 해결 된다면 시간이 매우 절약되고 안정성 또한 보장될 것입니다.

코코아팟 vs 카르타고 vs 스위프트 패키지 매니저

코코아팟

장점

  • 사용하기 쉽다.
  • Dynamic, Static 라이브러리를 모두 지원한다. (1.5.0 버전 이상)

→ 동적 라이브러리 : 완성된 프로그램을 실행할 때 포함시키는 동적 라이브러리

→ 정적 라이브러리 : 프로그램을 컴파일하는 과정에서 포함시키는 오브젝트 파일들의 모임

  • 의존성의 의존성까지 자동으로 관리해준다.
  • 누구나 쉽게 어떤 의존성이 애플리케이션에 있는지 알 수 있다.
  • pod outdated 명령어로 쉽게 새로운 버전이 있는지 체크할 수 있다.
  • 거의 대부분의 라이브러리가 코코아팟을 지원한다. 👍

단점

  • 라이브러리를 다운받아 설치(pod install or update)하는데 오랜 시간이 걸린다.
  • 프로젝트를 빌드 할 때마다 모든 팟 라이브러리가 같이 빌드되므로 다른 도구를 사용할 때 보다 프로젝트 빌드 시간이 느리다.

카르타고

장점

  • Dynamic, Static 라이브러리를 모두 지원한다. (0.30.0 버전 이상)
  • 의존성의 의존성까지 자동으로 관리해준다.
  • 누구나 쉽게 어떤 의존성이 애플리케이션에 있는지 알 수 있다.
  • carthage outdated 명령어로 쉽게 새로운 버전이 있는지 체크할 수 있다.
  • carthage update 를 실행할때만 한 번 프레임워크를 빌드하므로 코코아팟에 비해 프로젝트 빌드 속도가 빠르다. 👍
  • 처음에 프레임워크를 추가하는 것 외에 프로젝트 설정이 바뀌지 않는다.

단점

  • 의존성이 추가될 때마다 해줘야 하는 번거로운 작업이 있다.
  • 사용자나 인기가 많은 라이브러리가 아니라면 카르타고를 지원하지 않을 수도 있다.

스위프트 패키지 매니저

장점

  • 애플이 지원한다. 👍
  • Dynamic, Static 라이브러리를 모두 지원한다. (4.0 버전 이상)
  • 의존성의 의존성까지 자동으로 관리해준다.
  • 누구나 쉽게 어떤 의존성이 애플리케이션에 있는지 알 수 있다.
  • 스위프트 언어에 built-in 되어있어 별다른 설치가 필요없다. (Swift 3 이상)
  • 스위프트 언어에 built-in 되었기 때문에 Xcode Project 파일이 꼭 필요한 것이 아니므로 리눅스에서도 사용할 수 있다.
  • Package.swift 파일 이외에 수행할 설정이 없다.
  • Xcode의 GUI 환경에서 관리가 가능하다 (11.0 버전 이상)

단점

  • 아직은 지원하지 않는 라이브러리가 많다.
  • 현 시점, 해결되지 않은 이슈가 270건이 있다. (참조: SPM 이슈 목록)

오픈소스 라이브러리 만들기 - 야곰닷넷

Getting to Know Swift Package Manager - WWDC 2018 - Videos - Apple Developer

접근제어 (Access Control)

접근제어란?

접근제어는 코드끼리 상호작용을 할 때 파일 간 또는 모듈 간에 접근을 제한할 수 있는 기능입니다. 접근제어를 통해 코드의 상세 구현은 숨기고 허용된 기능만 사용하는 인터페이스를 제공 할 수 있습니다.

접근제어의 필요성

객체지향 프로그래밍 패러다임에서 중요한 캡슐화와 은닉화를 구현하는 이유는 외부에서 보거나 접근하면 안 되는 코드가 있기 때문입니다. 불필요한 접근으로 의도치 않은 결과를 초래 하거나 꼭 필요한 부분만 제공해야하는데 전체 코드가 노출될 가능성이 있을 때 접근제어를 이용합니다. 프로그래머에게 우리가 의도한 대로 코드를 작성하도록 유도할 수 있습니다.

스위프트의 접근제어는 모듈과 소스파일을 기반으로 설계되었습니다.

모듈

모듈(Module)은 배포할 코드의 묶음 단위입니다. 통상 하나의 프레임워크(Framework)나 라이브러리(Library) 또는 애플리케이션(Application)이 모듈 단위가 될 수 있습니다. 스위프트에서는 import 키워드를 사용해 불러옵니다.

소스파일

소스파일은 하나의 스위프트 소스 코드 파일을 의미합니다. 자바나 Objective-C와 같은 기존 의 프로그래밍 언어에서는 통상 파일 하나에 타입을 하나만 정의합니다. 스위프트에서도 보통 파일 하나에 타입 하나만 정의하지만, 때로는 소스파일 하나에 여러 타입(여러 개의 클래스나 구조체, 열거형 등)이나 함수 등 많은 것을 정의하거나 구현할 수도 있습니다.

공개 접근수준 – public

public 키워드로 접근수준이 지정된 요소는 어디서든 쓰일 수 있습니다. 자신이 구현된 소스 파일은 물론, 그 소스파일이 속해 있는 모듈, 그 모듈을 가져다 쓰는 모듈 등 모든 곳에서 사용할 수 있습니다. 공개(Public) 접근수준은 주로 프레임워크에서 외부와 연결될 인터페이스를 구현하는데 많이 쓰입니다. 우리가 사용하는 스위프트의 기본 요소는 모두 공개 접근수준으로 구현 되어 있다고 생각하면 됩니다.

개방 접근수준 – open

open 키워드로 지정할 수 있는 개방(Open) 접근수준은 공개(Public) 접근수준 이상으로 높은 접근수준이며, 클래스와 클래스의 멤버에서만 사용할 수 있습니다.

기본적으로 공개 접근수준(public)과 비슷하지만 다음과 같은 차이점이 있습니다.

  • 개방 접근수준을 제외한 다른 모든 접근수준의 클래스는 그 클래스가 정의된 모듈 안에서만 상속할 수 있습니다.
  • 개방 접근수준을 제외한 다른 모든 접근수준의 클래스 멤버는 해당 멤버가 정의된 모듈 안에서만 재정의할 수 있습니다.
  • 개방 접근수준의 클래스는 그 클래스가 정의된 모듈 밖의 다른 모듈에서도 상속할 수 있습니다.
  • 개방 접근수준의 클래스 멤버는 해당 멤버가 정의된 모듈 밖의 다른 모듈에서도 재정의(override)할 수 있습니다.
  • 클래스를 개방 접근수준으로 명시하는 것은 그 클래스를 다른 모듈에서도 부모클래스로 사용 하겠다는 목적으로 클래스를 설계하고 코드를 작성했음을 의미합니다.

라이브러리나 프레임워크 설계시 open과 public 접근수준의 선택

라이브러리 혹은 프레임워크를 설계할 때 라이브러리나 프레임워크를 사용하는 프로그래머가 이 타입을 사용할 수 있도록 하려면 open 혹은 public 공개수준으로 타입을 정의하면 됩니다. 그때 라이브러리 사용자(프로그래머)가 상속받아 사용하면 좋겠다거나 상속 후 재정의하여 사용하면 좋겠다는 생각을 한다면 open 개방 접근 수준으로, 그렇지 않고 클래스를 상속받거나 재정의할 수 없도록 막고싶다면 public 공개 접근 수준으로 정의하면 됩니다.

open 및 public 접근 수준이 아닌 다른 클래스 및 타입은 모듈 외부에서 접근할 수 없으므로 라이브러리 혹은 프레임워크를 사용하는 프로그래머가 사용할 수 없습니다.

내부 접근수준 – internal

internal 키워드로 지정하는 내부(Internal) 접근수준은 기본적으로 모든 요소에 암묵적으로 지정하는 기본 접근수준입니다. 내부 접근수준으로 지정된 요소는 소스파일이 속해 있는 모듈 어디에서든 쓰일 수 있습니다. 다만 그 모듈을 가져다 쓰는 외부 모듈에서는 접근할 수 없습니다. 보통 외부에서 사용할 클래스나 구조체가 아니며, 모듈 내부에서 광역적으로 사용할 경우 내부 접근수준을 지정합니다.

파일외부비공개 접근수준 – fileprivate

파일외부비공개(File-private) 접근수준으로 지정된 요소는 그 요소가 구현된 소스파일 내부에서만 사용할 수 있습니다. 해당 소스파일 외부에서 값이 변경되거나 함수를 호출하면 부작용이 생길 수 있는 경우에 사용하면 좋습니다.

비공개 접근수준 – private

비공개(Private) 접근수준은 가장 한정적인 범위입니다. 비공개 접근수준으로 지정된 요소는 그 기능을 정의하고 구현한 범위 내에서만 사용할 수 있습니다. 비공개 접근수준으로 지정한 기능은 심지어 같은 소스파일 안에 구현한 다른 타입이나 기능에서도 사용할 수 없습니다.

스위프트 기초 - 야곰닷넷

profile
iOS Developer

0개의 댓글