ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Xcode Configurations으로 프로젝트 환경 분리하기
    iOS 2022. 11. 21. 19:33

    안녕하세요 :)

    오늘은 Xcode 프로젝트에서 서비스의 환경을 분리하는 작업을 해보도록 하겠습니다

     

    환경을 분리하는 방법은 다양합니다

    - 코드상에서 if else로 분리하는 방법

    - 단일 타겟에 대해 여러 Configurations을 설정하는 방법

    - 타겟 여러개를 사용해서 각 환경에 맞게 구성하는 방법

     

    첫번째는 가장 간단하지만 코드가 반복되고 휴먼에러가 쉽게 발생합니다

    두번째는 설정된 Config 파일을 통해 환경 변수를 설정하여 휴먼 에러를 방지하지만 단일 타겟이라는 점 때문에 각 환경별 커스터마이징이 쉽지 않습니다

    세번째는 환경 별로 타겟을 분리하여 각 타겟이 설정된대로 작동하기 때문에 환경 분리가 가장 잘 이루어진다고 할 수 있지만 단일이 아닌 다중 타겟을 사용하기 때문에 관리 포인트가 많아지고 xcode의 Build Settings를 직접 설정해야되기 때문에 복잡성이 올라갑니다

     

    저는 중간 정도의 타협점임 두번째 방법으로 진행하고자 합니다

     

    1. 프로젝트 생성

    먼저 프로젝트를 생성해주시고 프로젝트 파일에서 타겟이 아닌 PROJECT - Configurations을 확인하시면 기본적으로 Debug / Release 두가지로 구성되어 있는 것을 확인 하실 수 있습니다

    다만 기본적으로 No Configurations Set이라고 아직 설정된 Config 파일이 없다는 것을 볼 수 있습니다

    저희는 이 Configurations를 활용하여 환경 구성할 계획입니다

     

    2. Config 파일 추가 및 설정

    New - File - Configuration Settings File을 선택해서 추가해주세요

    방금 추가한 파일을 프로젝트의 Configurations에서 설정을 해줍니다

    기본적으로 해당 파일 내에 정의되는 값들은 프로젝트의 Build Settings - User-Defined 항목에 자동으로 생성됩니다

    Configurations 설정 전 / 후

    3. User-Defined 키 접근

    정의된 환경 변수들을 사용하기 위해 Info.plist 를 통해 접근하는 방법을 알아보겠습니다

    Info.plist 자체는 dictionary 형태이기 때문에 어떤 방식으로 구성하든 상관 없습니다

     

    4. 코드에서 환경 변수 확인

    if let config = Bundle.main.object(forInfoDictionaryKey: "Config") as? [String: String] {
        if let test = config["TEST"] {
            print(test)
        }
    }

    해당 코드를 실행하여 정상적으로 값이 조회되는지 확인해봅시다

    Config.xcconfig 파일에서 변경된 값이 정상적으로 잘 표시되는 것을 확인할 수 있습니다

     

    이처럼 간단하게 환경 변수를 "주입" 받을 수 있도록 프로젝트를 설정해봤습니다

    휴먼 에러가 발생하지 않는 환경을 구성함으로써 개발자의 실수를 방지하고 환경을 분리할 수 있는 기반을 만들었습니다

    다음은 이 기반을 통해 개발 / 상용 환경을 구성해보도록 하겠습니다

     

    5. 개발 / 상용 Configurations 추가

    먼저 Config-dev.xcconfig 와 Config-prod.xcconfig를 추가하고 프로젝트의 Configurations에서 Configurations를 추가해줍니다

    - Debug (Dev)

    - Release (Dev)

    - Debug (Prod)

    - Release (Prod)

     

    6. 개발 / 상용 Scheme 추가

    위에 새롭게 생성된 Configurations를 수동을 스위칭 하는것이 아닌 Scheme을 통해서 스위칭일 하기 위해 Scheme을 추가해보겠습니다

    Manage Schemes에서 새로운 Scheme을 추가하고 기존 Scheme 이름을 변경해줍니다

     

    Edit Schemes에서 각 항목 별 Configurations를 설정해줍니다

     

    7. 개발 / 상용 환경 변수 확인

    각 개발 / 상용 Configurations 파일에 값을 다르게 입력하고 정상적으로 노출되는지 확인해보겠습니다

    선택된 Scheme에 따라 환경 변수가 다르게 출력되는 것을 확인할 수 있습니다

     

    이러한 기능을 통해

    환경 별로 특정 SDK의 키를,

    서버의 기본 호스트 주소를,

    앱 내에 사용되는 특정 웹뷰의 주소를,

    등등 다르게 제공할 수 있습니다

     

    이처럼 코드 내에 직접적인 if-else 방법이 아닌 Scheme를 통한 스위칭을 활용하여 개발자의 휴먼 에러를 방지하고 각 환경 별로 고립된 작업 환경을 제공 할 수 있습니다

    감사합니다!

    댓글

Designed by Tistory.