[iOS] Xcode Target이란?

2021. 2. 1. 02:03iOS

반응형

이번에 새로운 프로젝트를 보고 "어..? 이 프로젝트는 왜 이렇게 타겟이 많이 분리되어 있지..?"라고 느낌이 들었고,

지금까지 iOS 개발을 해오면서 Xcode 프로젝트에 대한 원론적인 이해(?)가 부족했다고 느끼면서 새롭게 공부를 해보았어요..

 

Target이라고 하면 여러분들이 알게모르게 다들 이런 화면 보셨죠..?

 

저는 지금 하나의 Target만 있는데, 프로젝트를 생성할 때 UI Test, Unit Test를 포함하셨으면 이 또한 Target이 될 수 있고 또한 빌드를 할 때 각자가 빌드하는 Target이 설정이 되어 있었을거에요..

 

근데 그렇다면 Target이란 무엇일까요?

 

한번 지금부터 제가 공부한 내용을 바탕으로 설명을 해보겠습니다‼️

 

 

Xcode Target

Target이란 빌드할 프로덕트를 정의하고 프로젝트 or 워크스페이스의 파일로부터 빌드되는 프로덕트에 지시들을 포함합니다. 또한 Target은 하나의 프로덕트를 정의하고 있습니다. 이러한 지시들에는소스파일, 어떤 소스파일을 처리할지 등의 정보들을 포함하고 있습니다.

A target specifies a product to build and contains the instructions for building the product from a set of files in a project or workspace. A target defines a single product; it organizes the inputs into the build system—the source files and instructions for processing those source files—required to build that product. Projects can contain one or more targets, each of which produces one product.

위는 애플 개발자 문서의 글인데, 제가 직독직해로 해석한 내용입니다..!! 🙃

 

한 번 제가 이해한 내용으로 다시 재구성을 해볼게요.

 

Xcode 프로젝트를 빌드할 때, 빌드의 과정에서 어떤 Resource(Asset, Xib, Info.plist), Source(.swift 파일)들을 포함할 지를 설정할 수 있고 또한 빌드의 과정의 순서 등 프로젝트의 큰 설정을 지정한 것이라고 이해했습니다. 그리고 중요한 점은 하나의 Target이 하나의 프로덕트라는 점입니다.

 

즉, Target에 따라 하나의 프로젝트에서 여러 버전으로 프로덕트를 분리할 수 있는 것 같아요.

그렇기 때문에 제가 이번에 투입된 프로젝트도 뭐 앱 스토어의 마켓에 따라 또는 inhouse, dev, release용으로 각각의 Target이 분리되어 있는 것 같아요‼️

 

요약해보자면

  • 하나의 Target은 하나의 프로덕트이다.
  • 한 프로젝트는 여러 개의 Target(프로덕트)로 이루어 질 수 있다.
  • Target별로 빌드 설정을 달리할 수 있다.

정도가 될 것 같습니다.

 

 

Q. 추가적으로 궁금한 점이 있었는데 바로 Xcode 프로젝트를 선택해도 Build Settings, Build Phases가 있고 Target을 선택해도 같은 메뉴가 존재했습니다.. 무슨 차이일까요?

A. 애플 개발자 문서에서 찾아본 바로는 기본적으로 Target이 Project Build Setting을 상속받는다고 합니다. 즉 그렇기 때문에, Override를 이용하여 Target별로 설정을 다르게 해줄 수 있습니다.

쉽게 말해서 별도로 Target의 Build Setting을 설정해주지 않으면 Project의 설정을 이어받아서 사용된다고 이해하시면 될 것 같습니다.

 

 

이렇게 Xcode의 Target에 대해 정리를 해보았는데, 이해가 좀 되셨나요...?

일단 저도 이론적으로는 이렇구나 이해가 된 것 같은데, 실제로 현업에서는 어떻게 쓰이는지 실제로 해봐야 감이 올 것 같아요.

 

그럼 이제 간단하게 Target을 어떻게 분리하고 어떻게 사용할 수 있는지 해보겠습니다.

 

 

Target 분리하기

우선 기존 Target의 오른쪽 클릭으로 Dulicate 선택하여 Dulicated Target을 생성합니다.

이렇게 해주게 되면 기본 Target에서 복사된 버전이 하나 생성됩니다.

이후, 원하는 이름으로 설정해줍니다. 저는 dev-sample로 설정하였습니다.

 

이제 빌드를 할 때, Target에 복사된 Target이 생성되어 있을 거에요..‼️

하지만 아직 이름은 처음에 생성된 채로 유지되어 있기 때문에 직접 변경을 해주어야 합니다.

Manage Schemes를 선택해서 이렇게 새롭게 설정해준 이름으로 직접 바꾸어주세요.

 

다음으로 dev와 release 버전을 구분하기 위한 App Icon을 하나 생성해볼게요.

밑의 그림처럼 새롭게 Assets.xcassets에서 새롭게 AppIcon-Dev를 생성해주세요.

 

아직까지는 완료되지 않았어요.

위에서 설명했을 때, Target이 뭐라고 했었죠? 빌드의 설정을 각자 다르게 할 수 있다고 했었죠.

당연히 Build Settings에서 App Icon에 대한 파일을 현재 생성한 파일로 설정을 변경해주어야겠죠?

이렇게 생성한 Target을 선택하고 Build Settings에서 새롭게 생성한 AppIcon에 대한 Asset 리소스로 파일을 설정해주세요.

 

이제 AppIcon에 대한 설정은 완료되었어요 🙌

 

다음으로 Info.plist에 대한 설정을 알려드리겠습니다.

아마 Target을 새롭게 생성할 때, Info.plist 역시 복사가 되어 자동으로 생성되었을 거에요.

근데 이름이 Copy... 으로 설정이 되어 있기 때문에 이 역시도 원하는 이름으로 변경해주세요.

다음으로 Build Setting에서도 역시 이름을 바꾸어주어야 빌드를 할 때, Xcode 프로젝트에서 인식을 하겠죠?

생성한 TargetBuild Settings -> Packaging에서 본인이 변경한 이름으로 똑같이 변경을 해주세요!

이렇게까지 완료한다면 이제 각각의 Target에 대한 설정은 어느정도 완료되었고 이제 본인의 프로젝트 개발 상황에 맞게 설정을 하면 될 것 같습니다.

 

그렇다면 마지막으로 설정이 완료되었는지 확인하기 위해 각각의 Target을 이름으로 구분해서 빌드시에 간단한 로그로 확인을 해볼게요.

 

새로운 TargetBuild Setting -> Swift Compiler - Custom Flags에서 전처리문에서 구분하고 싶은 이름으로 변경해주세요.

주의할 점은 꼭 -D라는 문장을 전에 입력해주어야 인식이 가능합니다.

 

이제 프로젝트로 돌아가서 확인하고 싶은 ViewController에서 다음과 같은 코드를 입력해주세요.

#if DEV
print("I'm Dev Target")
#else
print("I'm not Dev Target")
#endif

그리고 Target별로 실행을 해보시면 각각 Target에 따라 실행이 되고 안되는 것을 확인할 수 있습니다...‼️

 

 

오늘은 이렇게 Xcode의 기본 설정인 Target에 대해 작성을 해보았습니다 :)

평소 iOS 개발을 하면서 이런 쪽은 신경을 사용해본 적이 없어서 생소했지만 정말 기본적이고 중요한 내용이었던 것 같네요..☺️

혹시 글에 잘못된 점이나 더 궁금한 것이 있으면 자유롭게 말씀해주세요 :D

 

도움이 되셨으면 좋겠습니다!

 


참고 레퍼런스

 

Xcode Target

Xcode Target A target specifies a product to build and contains the instructions for building the product from a set of files in a project or workspace. A target defines a single product; it organizes the inputs into the build system—the source files and

developer.apple.com

 

반응형