static으로 api를 분리해봤다

sonny·2025년 1월 9일
0

TIL

목록 보기
97/133
post-thumbnail

static 키워드의 기본 개념

  • 타입 속성(Type Property)

    • static 키워드를 사용하면 구조체나 클래스 자체에 속하는 속성을 정의할 수 있다.
    • 그리고 인스턴스와 무관하게 해당 타입 자체에서 공유되는 속성을 의미한다.
  • 인스턴스 속성 vs 타입 속성

    • 인스턴스 속성

      • 특정 인스턴스에 속한다.
      • 각 인스턴스마다 독립적인 값을 가진다.
      • 인스턴스를 생성해야 접근할 수 있다.
    • 타입 속성 (static)

      • 타입 자체에 속한다.
      • 모든 인스턴스가 동일한 값을 공유한다.
      • 인스턴스화 없이 직접 접근할 수 있다.

static을 사용한 이유

중앙 집중화된 상수 관리

  • 공통 상수
    • API 키와 같은 값은 애플리케이션 전반에서 공통적으로 사용될 수 있고,
    • static으로 선언하면 모든 곳에서 동일한 값을 공유할 수 있다.
  • 중앙 관리
    • 상수를 한 곳에서 관리함으로써 유지보수가 용이하다.
    • API 키가 변경될 경우, 한 번만 수정하면 전체 애플리케이션에 적용된다.

인스턴스 생성 불필요

  • 편리한 접근
    • APIKey 구조체의 인스턴스를 생성하지 않고도 APIKey.openWeatherMap으로 직접 접근할 수 있다.
    • 이렇게 하면 코드의 간결성을 높이고, 불필요한 인스턴스 생성을 방지한다.

사용 예시)

let apiKey = APIKey.openWeatherMap
print(apiKey) // "8ef68fb1d27fb92f55802750b90d54f0"

위와 같이 간단하게 접근할 수 있다.

메모리 효율성

  • 단일 복사본
    • static 프로퍼티는 타입 자체에 하나의 복사본만 존재하기에 메모리 사용을 최적화할 수 있다.
  • 중복 방지
    • 여러 인스턴스가 생성되더라도 static 프로퍼티는 공유되기 때문에 중복되지 않는다.

코드 조직화 및 네임스페이스 역할

  • 네임스페이스 역할

    • APIKey 구조체는 상수 값을 그룹화하는 네임스페이스 역할을 한다.
    • 그래서 코드의 가독성을 높이고, 관련된 상수들을 논리적으로 분류할 수 있게 도울수 있게 된다.
  • 확장성

    • 추가적인 API 키가 필요할 경우, 구조체 내에 새로운 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 키를 관리하기 위한 중앙 저장소 역할을 한다.
    • openWeatherMapstatic으로 선언되어 있어서 구조체의 인스턴스를 생성하지 않고도 직접 접근할 수 있는 장점이 있다.

내가 적용한 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 키워드 사용 이유

    • 공통 상수 관리: API 키와 같은 값을 중앙에서 관리하고, 모든 곳에서 동일하게 사용할 수 있다.
    • 인스턴스 생성 불필요: APIKey 구조체의 인스턴스를 생성하지 않고 직접 접근할 수 있어 코드의 간결성을 높여준다.
    • 메모리 효율성: 단일 복사본을 통해 메모리 사용을 최적화하고, 중복을 방지한다.
    • 코드 조직화: 관련된 상수들을 논리적으로 그룹화하여 가독성과 유지보수성을 향상시켜준다.
  • 보안 주의사항

    • API 키는 민감한 정보이므로, 소스 코드에 직접 하드코딩하지 않는 것이 좋습니다.
    • 대신, 환경 변수설정 파일을 사용하여 보안적으로 안전하게 관리하는 방법을 고려

    환경 변수 사용

    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 키를 추가하고, 값을 설정한다.

추가 참고 사항

  • 유지보수성 향상
    • 모든 API 키를 APIKey 구조체에서 관리함으로써, 코드 변경 시 일관성을 유지할 수 잇다.
  • 확장성
    • 새로운 API 서비스가 추가될 경우, 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 구조체에서 openWeatherMapstatic으로 선언한 것은 공통 상수를 효율적으로 관리하고, 코드의 간결성과 유지보수성을 높이기 위한 표준적인 접근 방식이라고 한다.

덕분에 어디서든 쉽게 API 키에 접근할 수 있으며, 중앙 집중화된 관리로 인해 보안과 유지보수가 용이해질 수 있게 된다.

출처: 지선생님

profile
iOS 좋아. swift 좋아.

0개의 댓글

관련 채용 정보