static
키워드의 기본 개념타입 속성(Type Property)
static
키워드를 사용하면 구조체나 클래스 자체에 속하는 속성을 정의할 수 있다.인스턴스 속성 vs 타입 속성
인스턴스 속성
타입 속성 (static
)
static
을 사용한 이유static
으로 선언하면 모든 곳에서 동일한 값을 공유할 수 있다.APIKey
구조체의 인스턴스를 생성하지 않고도 APIKey.openWeatherMap
으로 직접 접근할 수 있다.사용 예시)
let apiKey = APIKey.openWeatherMap
print(apiKey) // "8ef68fb1d27fb92f55802750b90d54f0"
위와 같이 간단하게 접근할 수 있다.
static
프로퍼티는 타입 자체에 하나의 복사본만 존재하기에 메모리 사용을 최적화할 수 있다.static
프로퍼티는 공유되기 때문에 중복되지 않는다.네임스페이스 역할
APIKey
구조체는 상수 값을 그룹화하는 네임스페이스 역할을 한다.확장성
static
프로퍼티를 추가하기 쉽다.struct APIKey {
static let openWeatherMap = "YOUR_OPENWEATHERMAP_API_KEY"
static let anotherService = "YOUR_ANOTHER_SERVICE_API_KEY"
}
APIKey.swift
import Foundation
struct APIKey {
static let openWeatherMap = "8ef68fb1d27fb92f55802750b90d54f7"
}
APIKey
구조체는 API 키를 관리하기 위한 중앙 저장소 역할을 한다.openWeatherMap
은 static
으로 선언되어 있어서 구조체의 인스턴스를 생성하지 않고도 직접 접근할 수 있는 장점이 있다.WeatherAPI.swift
import Foundation
import Moya
enum WeatherAPI {
case oneCall(lat: Double, lon: Double, exclude: String, units: String)
}
extension WeatherAPI: TargetType {
var baseURL: URL {
return URL(string: "https://api.openweathermap.org/data/3.0")!
}
var path: String {
switch self {
case .oneCall:
return "/onecall"
}
}
var method: Moya.Method {
return .get
}
var task: Moya.Task {
switch self {
case let .oneCall(lat, lon, exclude, units):
let parameters: [String: Any] = [
"lat": lat,
"lon": lon,
"exclude": exclude,
"units": units,
"appid": APIKey.openWeatherMap // static 프로퍼티 사용
]
return .requestParameters(parameters: parameters, encoding: URLEncoding.default)
}
}
var headers: [String : String]? {
return ["Content-Type": "application/json"]
}
}
WeatherAPI
열거형은 Moya의 TargetType
프로토콜을 채택하여 API 요청을 정의한다.task
프로퍼티에서 APIKey.openWeatherMap
을 사용하여 API 키를 주입한다.static
키워드 사용 이유
APIKey
구조체의 인스턴스를 생성하지 않고 직접 접근할 수 있어 코드의 간결성을 높여준다.보안 주의사항
환경 변수 사용
struct APIKey {
static let openWeatherMap: String = {
guard let key = Bundle.main.infoDictionary?["OpenWeatherMapAPIKey"] as? String else {
fatalError("OpenWeatherMapAPIKey not found in Info.plist")
}
return key
}()
}
Info.plist
파일에 OpenWeatherMapAPIKey
키를 추가하고, 값을 설정한다.APIKey
구조체에서 관리함으로써, 코드 변경 시 일관성을 유지할 수 잇다.APIKey
구조체에 새로운 static
프로퍼티를 추가하기만 하면 된다.struct APIKey {
static let openWeatherMap = "YOUR_OPENWEATHERMAP_API_KEY"
static let anotherService = "YOUR_ANOTHER_SERVICE_API_KEY"
}
APIKey
구조체의 접근 제어자(private
, public
등)를 설정하면 무단 접근을 방지할 수 있다.struct APIKey {
private init() {} // 인스턴스 생성 방지
static let openWeatherMap = "YOUR_API_KEY"
}
APIKey
구조체에서 openWeatherMap
을 static
으로 선언한 것은 공통 상수를 효율적으로 관리하고, 코드의 간결성과 유지보수성을 높이기 위한 표준적인 접근 방식이라고 한다.
덕분에 어디서든 쉽게 API 키에 접근할 수 있으며, 중앙 집중화된 관리로 인해 보안과 유지보수가 용이해질 수 있게 된다.
출처: 지선생님