---
# System prepended metadata

title: 프로젝트 BuildScheme 분리
tags: [BuysellStandards]

---

# 프로젝트 BuildScheme 분리

> `BuildScheme` 이란, 프로젝트 코드 작성 후 Cmd + R 명령으로 빌드작업을 하는데, 이때 어떤 환경에서 빌드를 할 것인지 나타내주는 역할을 합니다. 현재 PIECE 프로젝트에서는 빌드스킴이 `AppStore` 와 `piece-ios` 가 존재합니다. (하지만 piece-ios 는 사용하지 않고 있습니다.) 

<사진 1>
![스크린샷 2023-11-20 오전 10.28.23](https://hackmd.io/_uploads/BJLrIEuE6.png)

>`BuildScheme` 에서는 Build Configuration을 정의해줄 수 있습니다. 

>현재 `AppStore` 빌드스킴설정 화면입니다. 상황에 따라 Build, Run, Test, Profile, Analyze, Archive 가 있는데, 저희가 주로 사용하는 것은 Run(Cmd+R) 과 Archive(테스트플라이트 업로드) 입니다.
> 각 상황마다 `Build Configuration` 을 선택해줄 수 있습니다. 

<사진 2>
![스크린샷 2023-11-20 오전 10.35.11](https://hackmd.io/_uploads/Sk5NvDuVa.png)

> 현재 프로젝트에 존재하는 Configuration 은 `Debug` 와 `Release` 가 있습니다. 

<사진 3>
![스크린샷 2023-11-20 오후 2.03.09](https://hackmd.io/_uploads/rkEaOvdEp.png)

## AS-IS

저희 피스앱의 서버는 `dev`, `stage`, `live` 세가지로 구분됩니다. 현재는 각 경우를 테스트 하기 위해 코드단(사진<1> 코드 15번 줄)에서 case 를 바꿔주고 있는 형태로 구성되어 있습니다.

```swift

//  Api.swift
import Foundation

enum ApiServer {
    case dev, stage, live
}

class Api {
    static var server: ApiServer = .live // 여기서 코드를 바꿔주는 형태 .live, .dev, .stage
    static var apiVersion: String = "v0.0.2"
    
    // Api server
    static var baseUrl: String {
        switch self.server {
            case .dev:
                return "https://fdev-gateway.piece.la/v3"
            case .stage:
                return "https://fstage-gateway.piece.la/v3"
            case .live:
                return "https://gateway.piece.run/v3"
        }
    }
    
    // Web Socket server
    static var baseWebSocketUrl: String {
        switch self.server {
            case .dev:
                return "wss://dev-websocket.piece.la"
            case .stage:
                return "wss://stage-websocket.piece.la"
            case .live:
                return "wss://websocket.piece.run"
        }
    }
    
    // Web View URL
    static var webViewUrl: String {
        switch self.server {
            case .dev:
                return "http://dev.piece.run:0000"
            case .stage:
                return "http://stage.piece.la:0000"
            case .live:
                return "http://prod.piece.run:0000"
        }
    }
    
    static let timeout: Double = 60
}

```

### 문제점 

#### 시나리오

- 개발 결과물 확인을 위해 "개발서버" 또는 "스테이지서버" 또는 "운영서버" 로 말아서 보여달라는 요청 
- 서버를 번갈아 가며 확인해야 할 때, "개발서버" 빌드 후 결과물 확인 -> "운영서버" 빌드 후 결과물 확인 
- 위 과정 n번 반복 시, 결과물 확인에 걸리는 총 시간 = 빌드시간(약 5분 ~10분) x n


## TO-BE

### 해결방법 

- 빌드스킴을 필요에 따라 여러개를 만들 수 있다는 점을 활용하여 필요한 경우를 헤아립니다. 
- 현재는 Dev, Stage, Live 세가지로 나눌 수 있습니다. (필요에 따라 QA 버전도 추가가능)
- Dev, Stage, Live 세 개의 빌드스킴에 적용시킬 세 개의 Build Configuration을 정의해줍니다. 
- 각 스킴의 차이점은 baseUrl, baseWebSocketUrl, webViewUrl 입니다. 

![스크린샷 2023-11-27 오전 9.38.49](https://hackmd.io/_uploads/SJNXrvZSp.png)

- 위처럼 각 Scheme에 적용시킬 Configurations 파일을 만들어 그 안에 환경변수 리스트를 정의합니다. 

```swift
// Dev.xcconfig 파일 

BASE_URL = https:/$()/Develop/Server
DISPLAY_NAME = PIEZE(Dev)
APP_IDENTIFIER = com.PIEZE.Dev
APP_FLAG = Dev

-------------------------------------

// Stage.xcconfig 파일 

BASE_URL = https:/$()/Stage/Server
DISPLAY_NAME = PIEZE(Stage)
APP_IDENTIFIER = com.PIEZE.Stage
APP_FLAG = Stage

-------------------------------------

// Live.xcconfig 파일 

BASE_URL = https:/$()/Live/Server
DISPLAY_NAME = PIEZE

APP_IDENTIFIER = com.PIEZE.Live
APP_FLAG = Live

-------------------------------------
```

![스크린샷 2023-11-27 오전 9.45.59](https://hackmd.io/_uploads/SySAUPWr6.png)

```
Build Settings - Packaging 내부
"Product Bundle Identifier" 에 $(APP_IDENTIFIER) 를 적용 - 각각의 번들ID가 달라야 다른 앱으로 build 됨
"Product Name" 에 $(DISPLAY_NAME) 를 적용 - 각각의 앱의 이름
```

### 해결


#### 시나리오
- 개발 결과물 확인을 위해 "개발서버" 또는 "스테이지서버" 또는 "운영서버" 로 말아서 보여달라는 요청 
- 서버를 번갈아 가며 확인해야 할 때, 개발서버앱, 스테이지서버앱, 운영서버앱 3개를 한번에 빌드후 앱간 이동을 하며 비교 가능

![스크린샷 2023-11-27 오전 9.51.51](https://hackmd.io/_uploads/BJWtdDZHp.png)

#### 개발 중 Preview 이용 시 주의할 점

- 앱이 3개로 생성되어, 개발 중 Scheme을 변경하면서 Preview를 확인하려면, Scheme을 변경할 때마다 commandline build Configuration도 함께 Switch 해주어야 합니다. 

![스크린샷 2023-11-24 오후 5.03.38](https://hackmd.io/_uploads/HJU1-h8B6.png)





릴리즈 시, 개발자 실수로 인해 아카이빙을 잘못하는 실수발생 방지목적

## References

[참조 블로그](https://ios-development.tistory.com/660)