티스토리 뷰

 

iOS 프로젝트를 진행하면서 데이터 손상에 대한 위험을 최소화하기 위해, 테스트 서버와 릴리즈 서버를 분리하여 운영하기로 결정했다. 이를 통해 개발 환경에서의 실수를 릴리즈 환경에 영향을 주지 않도록 하고, 안정적인 배포를 보장할 수 있다. 

 

이러한 환경 분리를 위해 개발용, 릴리즈에 따라 Build 환경을 구축하는 방법에 대해 알아보자.

 

 


1. Configuration Setting File 생성 후 설정

 

1️⃣ info.plist 파일 사용

 

 

  • Project -> Build Settings에서 + 버튼을 눌러 User-Defined setting으로 추가

 configuration별로 세팅할 수 있는 옵션을 생성한다.

 

 

생성된 곳에 DEPLOY_PHASE를 key 값으로 넣고 Debug와 Release를 기입한다.

 

 

 

info.plist에 위에서 생성한 DEPLOY_PHASE 정보를 알 수 있도록 설정한다.

 

  • key: "DeployPhase"
  • value: $(DEPLOY_PHASE)

 

 

그리고 debug, release에 따라 세팅할 수 있는 ApiPathConfiguration 클래스를 생성한다. 

 

import Foundation

class ApiPathConfiguration {
    enum DeployType: String {
        case debug
        case release
    }

    private static let configKey = "DeployPhase"

    static func getDeployPhase() -> DeployType {
        let configValue = Bundle.main.object(forInfoDictionaryKey: configKey) as! String
        guard let phase = DeployType(rawValue: configValue) else {
            Log.fault("Something wrong in project configurations fot Deployment Phase! Check User Defined Settings.")
            return DeployType.release
        }
        return phase
    }
    
    public static func serviceBaseURL() -> URL {
        switch getDeployPhase() {
        case .debug:
            return URL(string: "https://debug.com")!
        case .release:
            return URL(string: "https://release.com")!
        }
    }
}

 

참고(https://ios-development.tistory.com/278)

 

 

2️⃣ xcconfig 파일 사용
 

Xcconfig 폴더를 만들어서 Configuration Settings File을 만든다.

 

 

 

 

Secrets.xcconfig는 보안키가 저장된 파일이어서 Debug와 Release 파일에 공통으로 사용하기 위해 include 했다.

 

//🟢 공통으로 사용하는 Secrets 파일은 각 파일에 include 필요

//Secrets.xcconfig
APP_KEY = ...


//Debug.xcconfig
#include "Secrets.xcconfig"
BASE_URL = (개발용 URL)


//Release.xcconfig
#include "Secrets.xcconfig"
BASE_URL = (배포용 URL)

 

프로젝트 Configurations에 만든 xcconfig 파일 적용하면 

  • Project -> Configurations -> Based on Configuration File에 적용

 

 

 

🔎 프로젝트에서 xcconfig 파일 방식을 선택한 이유 

 

 

  • info 파일

Info.plist 파일에서는 ApiPathConfiguration과 같은 Swift 코드를 사용해야 하므로, 추후에 비즈니스 로직을 수정하게 될 경우, 코드도 함께 수정해야 하는 불편함이 발생할 수 있다.

이처럼 설정값과 코드가 섞여 있을 경우, 작은 설정 변경에도 코드 수정이 필요해 유지보수가 어려워질 수 있다,,,,

 

 

  • xcconfig 파일

이 방법을 사용하면 코드와 설정을 명확하게 분리할 수 있다.  xcconfig 파일에 필요한 설정값을 정의하고, 이를 빌드 설정에 반영함으로써 코드 수정 없이 설정만 변경할 수 있다. 

 

또한, 보안적인 측면에서도 .xcconfig 파일을 활용하는 것이 장점이 있다. .gitignore에 .xcconfig 파일을 포함시켜, 해당 파일에 저장된 민감한 정보가 버전 관리 시스템에 포함되지 않도록 할 수 있다.

 

 

이러한 이유로, 프로젝트에 .xcconfig 방법을 선택해 더 효율적이고 안전한 환경을 구축했다!!

 


2. Scheme 설정

 

 

개발용, 릴리즈에 따라 빌드 스키마를 만들어 Configurations를 매칭해보자.

 

Xcode 상단의 sheme를 선택해 New Scheme로 새로운 scheme를 만들어준다.

 

Target은 프로젝트로 지정하고 Name에 scheme 이름을 적어주면 된다.

 

 

build sheme에 따른 configuration 설정을 해주기 위해 아래와 같이 설정하였다.

 

  • Run, Test, Analyze는 Debug
  • Profile, Archive는 Release

 

 

 


3. info.plist에 xcconfig 파일의 BASE_URL 가져와 사용하기

 

 

Debug와 Release.xcconfig 파일에 작성한 BASE_URL을 프로젝트 내에서 사용하기 위해 info.plist에 환경변수를 $() 만들어준다.

 

scheme를 Debug와 Release 중 어떤 걸 사용하느냐에 따라$(BASE_URL)은 Debug와 Release.xcconfig 파일에 작성한 BASE_URL 값을 사용한다.

 

 

아래와 같이 enum 타입으로 쉽게 BASE_URL을 사용하도록 설정하였다.

info 파일의 BaseURL key를 찾아서 그 값을 가져와 baseURL에 저장한다는 코드이다. 

 

enum API {
    static let BASE_URL: String = {
        guard let baseURL = Bundle.main.object(forInfoDictionaryKey: "BaseURL") as? String else {
            fatalError("BaseURL not found in Info.plist")
        }
        return baseURL
    }()
}

 

 

📍 문제점!!!!!

 

 

위에까지 작업해서 빌드했는데 자꾸 오류가 나오던 것!!!

 

아래와 같이 API.BASE_URL에 요청을 보내기 위해 URL으로 감쌌는데 nil값으로 나오는 문제가 있었다,,, 

URL(string: API.BASE_URL)

 

API.BASE_URL를 출력해 보니 값은 제대로 들어가고 있어서 URL 생성 과정에서 실패한 것으로 판단해 문제를 해결하기 위한 시도를 했다.

 

🛠️ 문제 해결을 위한 시도

1. API.BASE_URL이 String 값이 아닌가? => type(API.BASE_URL)으로 확인해 보니 String 값이다.
2. API.BASE_URL에 공백이 포함되는가? => 출력 결과 앞쪽에 공백이 들어가 있는 걸 확인했다. (공백 제거 필요)
3. API.BASE_URL에 문자열이 포함되는가? => 출력 결과 큰 따옴표(")가 들어가는 걸 확인했다. (큰 따옴표 제거 필요)
4. .xcconfig 파일에서 문제가 되는 문자가 있을까? => xcconfig 파일에서는 //를 주석처리를 한다. (환경변수 사용 필요)

 

  • 공백 문제 해결

 

2번을 해결하기 위해 공백을 삭제하는 로직을 넣어주었다.

 

enum API {
    static let BASE_URL: String = {
        guard let baseURL = Bundle.main.object(forInfoDictionaryKey: "BaseURL") as? String else {
            fatalError("BaseURL not found in Info.plist")
        }
        return baseURL.replacingOccurrences(of: " ", with: "")
    }()
}

 

  • 큰 따옴표 문제 해결

 

3번을 해결하기 위해 BASE_URL에 큰 따옴표를 제외한 url을 작성하였다.

 

BASE_URL = "http..." // ❌
BASE_URL = http... // 🟢

 

  • 주석처리 문제 해결

 

4번을 해결하기 위해 // 사이에 비어있는 환경변수를 넣어 주석 처리되지 않고 //를 인식하도록 했다.

 

BASE_URL = http:/%()/...

 

 

이렇게 하니 오류가 나지 않고 원하는 url으로 요청이 잘 가는 것을 확인했다!!


참고

 

https://gyuios.tistory.com/240

https://ios-development.tistory.com/278

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함