[Xcode] Target

Picnic·2024년 12월 12일

Xcode

목록 보기
2/3
post-thumbnail

안녕하세요 Picnic🧃입니다.
오늘은 Target에 대해 공부해보려고 합니다.

먼저 Target을 공부하려고 생각하게 된 이유는 프로젝트를 만들다가 Share Extension을 사용하게 되었는데 이 때 Share Extension에서 메인 타겟에 있는 코드를 사용해야 할 일이 생겼고, 그제서야 타겟이라는 단어가 눈에 들어왔는데요.

프로젝트를 작동하게 하는 게 목적인 경우는 검색을 통해 따라하면 쉽게 해결할 수 있겠지만 뭔지는 알고 해야 다음에 같은 과정을 겪을 때 쉽게 할 수 있고, 또 까먹었더라도 다시 찾아볼 수 있기 때문에 한 번 알아보려고 합니다.

레츠고..!

Target이란?


먼저 애플 개발자 문서에 나와 있는 Target에 대한 개념은 다음과 같습니다.

Target은 빌드할 제품을 지정하고 프로젝트 또는 작업 공간의 파일 세트에서 제품을 구축하기 위한 지침을 포함합니다.
Target은 단일 제품을 정의합니다; 해당 제품을 구축하는 데 필요한 소스 파일 및 해당 소스 파일 처리 지침과 같은 빌드 시스템에 대한 입력을 구성합니다. 프로젝트는 하나 이상의 target를 포함할 수 있으며, 각각 하나의 제품을 생산합니다.

Share Extension을 다뤄본 글에서 XCode의 File - New - Target을 통해 Share Extension을 추가해본 적이 있는데요, 그러면 위의 그림과 같이 하나의 프로젝트(PracticeShareExtension)에 두 개의 타겟(PracticeShareExtensionShareExtension)이 있는 것을 볼 수있습니다.

위에서 나온 개념에 따라, 각각의 Tartget은 일단 단일 제품을 구성한다는 것을 알았습니다.
같은 프로젝트에 있다고 해서 한 몸은 아닌…!

문서에 있는 글을 계속 봐보겠습니다.

제품을 빌드하기 위한 지침은 Xcode 프로젝트 편집기에서 검토하고 편집할 수 있는 빌드 설정(build settings) 및 빌드 단계(build phase)의 형태를 취합니다. Target은 프로젝트 빌드 설정을 상속하지만, Target 수준에서 다른 설정을 지정하여 프로젝트 설정을 재정의할 수 있습니다. 한 번에 하나의 활성 target만 있을 수 있습니다; Xcode Scheme은 활성 Target을 지정합니다.

제품을 빌드하기 위한 지침은 build settings와 build phase의 형태를 취한다고 하였으니 이걸 말하는 것이겠네요!

또한 타겟은 프로젝트 빌드 설정을 상속하지만, 타겟 레벨에서 다른 설정을 지정하여 프로젝트 설정을 재정의 할 수 있다고 합니다.

예를 들어 프로젝트의 build setting에 iOS Deployment Target이 있고, 타겟에도 iOS Deployment Target이 있는데요, 프로젝트에서 iOS 배포 타겟을 16.0으로 하더라도 타겟에서 iOS 배포 타겟을 18.0으로 하면 18.0이 설정된다고 할 수 있습니다. (왜 각자 같은 설정이 있었는지 몰랐었는데 이제 알았네요🤩)

그리고 한 번에 하나의 활성 타겟만 있을 수 있다고 했는데요.
이 말이 무슨 말이냐면, 위에 이미지에는 두 개의 타겟(PracticeShareExtension과 ShareExtension)이 있고 PracticeShareExtension앱을 실행할 때 이 두 개의 타겟을 모두 이용할 수 있습니다.

하지만, 앱이 실행될 때 이 두 타겟이 동시에 실행되는게 아니라, 메인 앱을 쓰면 PracticeShareExtension 타겟이 실행되고, 외부 앱에서 공유 버튼을 눌러서 Extension을 열면 ShareExtension 타겟이 실행되는 방식입니다.(라고 저는 이해했는데 맞으려나)

타겟 종속성


다음 글을 또 보겠습니다.

Target과 그것이 만드는 제품은 다른 target과 관련될 수 있습니다.
Target이 빌드하기 위해 다른 target의 출력을 필요로 하는 경우, 첫 번째 타겟은 두 번째 타겟에 의존한다고 합니다.

두 target이 동일한 작업 공간에 있는 경우, Xcode는 종속성을 발견할 수 있으며, 이 경우 필요한 순서로 제품을 빌드합니다. 그러한 관계는 암묵적 의존성(implicit dependency)이라고 불립니다.

또한 빌드 설정(build setting)에서 명시적 타겟 종속성(explicit target dependencies)을 지정할 수 있으며, Xcode가 암시적 종속성을 가질 것으로 예상할 수 있는 두 타겟이 실제로 종속성이 없다고 지정할 수 있습니다.

예를 들어, 라이브러리와 동일한 작업 공간에서 해당 라이브러리에 연결하는 응용 프로그램을 모두 구축할 수 있습니다. Xcode는 이 관계를 발견하고 자동으로 라이브러리를 먼저 구축할 수 있습니다. 그러나 실제로 작업 공간에 구축된 라이브러리 버전이 아닌 라이브러리 버전에 대해 연결하고 싶다면 빌드 설정에서 명시적 종속성을 만들 수 있으며, 이는 이 암시적 종속성을 재정의합니다.

“Target이 빌드하기 위해 다른 target의 출력을 필요로 하는 경우, 첫 번째 타겟은 두 번째 타겟에 의존한다고 합니다.” 라는 것은 예를 들어 Share Extension을 통해 주소를 얻어와서 해당 주소를 사용한다고 해보겠습니다.

만약 유튜브 앱에서 공유를 위해 Share Extension을 사용해서 해당 영상의 주소를 얻어왔다고 하면 그 주소는 Share Extension 타겟에서 얻은 것이기 때문에 메인 앱 타겟에서는 사용할 수 없습니다.

하지만 이 주소를 메인 앱 타겟에서 사용해야 한다면 위의 설명처럼 메인 앱 타겟은 Share Extension 타겟에 의존한다고 볼 수 있습니다! 그리고 위의 PracticeShareExtension 프로젝트처럼 두 타겟이 동일한 워크스페이스에 있으므로 Xcode는 종속성을 발견하고, 필요한 순서로 제품을 빌드해줍니다.

그래서 ShareExtenion 타겟을 만든 후 PracticeShareExtension의 build phase를 보면

위와 같이 Target Dependencies에 Share Extension이 자동으로 추가되어 있는 것을 볼 수 있습니다!
그리고 이를 암묵적 읜존성이라고 부릅니다.

종속성이 추가되었다고 다른 타겟에 있는 데이터를 전부 사용할 수 있는 것은 아닙니다!

Xcode가 자동으로 종속성을 추가해 주는 것은 Scheme의 Find Implicit Dependencies 옵션이 켜져있기 때문입니다.
만약 이 옵션이 꺼져있다면 직접적으로 종속성을 추가해주어야 합니다. 또한 Xcode가 쉽게 감지할 수 없는 타겟 간의 관계가 있는 경우에도 수동으로 추가해주어야 합니다. 그렇지 않으면 Xcode가 에러를 보고하거나 타겟을 잘못 빌드할 수 있습니다.

Find Implicit Dependencies 옵션은 Xcode 메뉴에서 Product - Scheme - Edit Scheme을 통해 들어가서 build 탭을 확인하거나 Xcode 중앙 상단에 Scheme을 고르는 곳에서 Edit Scheme을 눌러 찾을 수 있습니다.

그 다음 글인 “Build Setting에서 명시적 타겟 종속성을 지정할 수 있으며, Xcode가 암시적 종속성을 가질 것으로 예상할 수 있는 두 타겟이 실제로 종속성이 없다고 지정할 수 있습니다.”

만약 Xcode가 ShareExtension 타겟을 찾지 못하고 Dependencies에 넣지 못했다고 가정하면 ShareExtension 타겟을 +를 눌러 추가해주어 명시적 의존성을 줄 수 있다는 것이고,

또 예를 들어, 위에서 Target Dependencies에 있는 ShareExtension 타겟에서 얻은 데이터를 PracticeShareExtenion 타겟에서 사용할 일이 없다고 하면 두 타겟은 종속성이 없을 것이고, -를 눌러주어 제외시켜주면서 종속성이 없다고 지정할 수 있다고 생각할 수 있을 것 같습니다.




글에서의 마지막 예시는 직접 해본 적은 없지만 대략적으로 Build Setting과 Build Phase에서 설정을 해주어 명시적으로 종속성을 추가할 수 있다 정도로 저는 이해했습니다만…(이 부분은 추후 공부해서 더 넣도록 하겠습니다.🧐)

그리고 종속성은 Xcode에게 타겟 집합을 빌드할 올바른 순서를 알려준다고 합니다.
Xcode는 가능할 때 타겟을 병렬로 빌드하지만, 때로는 타겟을 직렬로 빌드해야 합니다.

예를 들어, 메인 앱 타겟에서 프레임워크 타겟을 사용해야 하는 경우라면 프레임워크 타겟이 먼저 빌드된 후 메인 앱 타겟을 빌드해야 합니다.


타겟에 소스파일 추가하기


종속성을 살펴보면서 다른 타겟에서의 데이터가 필요한 경우를 살펴봤습니다.
그렇다면 이번엔 특정 파일이 다른 타겟에서 필요하다면 어떻게 할까요?

Target Membership


그럴 때에는 Target Memebership을 이용하면 됩니다.

우리가 새로운 swift 파일을 만들었다고 하면 file inspector에 Target Membership이 있습니다. 아래와 같이 말이죠!

예를 들어 PracticingShareExtension 프로젝트에 외부 데이터베이스를 관리하는 DataBaseManager라는 파일이 있다고 해보겠습니다.

그리고 ShareExtension 타겟에서 얻은 정보를 외부 데이터베이스에 저장하고 싶다고 했을 때 ShareExtension 타겟은 PracticeShareExtension 타겟과 별도의 구성이기 때문에 DataBaseManager를 사용할 수 없습니다.

그래서 이 때 TargetMembership이 필요한데, 이 Target Membership을 이용해 다른 타겟에 기존 파일을 할당할 수 있습니다.

추가하고 싶은 파일의 file inspector에서 Target Membership의 +버튼을 누르면 위와 같이 이 파일을 어느 타겟에 넣고 싶은지 선택할 수 있는 창이 나옵니다.

여기서 ShareExtension에 체크를 하고 Save 버튼을 눌러주면 ShareExtension 타겟에도 DataBaseManager가 추가되었기 때문에 이 파일을 사용할 수 있게 됩니다!

그래서 위와 같이 TargetMembership에 DataBaseManager를 추가하지 않고 사용을 하려고 하면 위와 같은 컴파일 에러가 발생하지만

Target Membership에 추가를 해주면 컴파일 에러가 사라진 모습을 볼 수 있습니다.

이를 이용해서 메인 앱 타겟에서와 같은 뷰를 사용하는 경우에도 타겟 멤버쉽에 추가하여 뷰를 재사용할 수 있습니다.

마무리


사실은 Target Membership에 대해서 공부하려고 했던건데 Target Memebership을 알기 위해선 Target을 알아야 하니 Target도 알아보게 되었고 중요한 것을 많이 알아가는 기분입니다.

그럼 Target에 대한 글은 여기서 마치도록 하겠습니다.

틀린 내용에 대한 피드백은 언제나 감사히 받겠습니다!🙂‍↕️


참고


0개의 댓글