🦉 iOS 기반 주식 시세 조회 앱

Swift 예제

중급 난이도
예제 타입
10/19 등록일

iOS 기반 주식 시세 조회 앱

중급
태그
네트워크 API 에러처리 확장성 재시도 실무예제
## 프로젝트 개요
실시간 주식 시세 데이터를 조회하는 iOS 앱을 구현합니다. 네트워크 요청 실패 시 재시도 로직과 오류 처리를 통해 안정적인 사용자 경험을 제공합니다.

## 주요 기능
- 실시간 주가 정보 요청
- 네트워크 에러 자동 재시도
- 캐시 메모리로 응답 속도 개선
- 사용자 입력 검증 및 오류 안내
- 확장 가능한 API 구조 설계

## 사용 방법
1. Xcode에서 프로젝트 생성 후 Swift 파일 추가
2. `StockManager` 클래스의 `fetchStockData()` 메서드 호출
3. 터미널에서 실행 시 자동으로 'AAPL' 주식 정보 요청
4. 네트워크 실패 시 3회 재시도 로직 동작 확인

## 확장 가능성
- 다른 금융 데이터(주가 변동 추세, 거래량 등) 추가
- 멀티플랫폼 지원을 위한 SwiftUI 리팩토링
- 라우팅 기능으로 여러 주식 정보 병렬 요청
코드 예제
// StockManager.swift
import Foundation

typealias StockData = (String, Double, String)

class StockManager {
    private let apiKey = "YOUR_API_KEY"
    private var retryCount = 0

    func fetchStockData(symbol: String, completion: @escaping (Result<StockData, Error>) -> Void) {
        // 기본 URL 구성
        guard var urlComponents = URLComponents(string: "https://api.example.com/stock") else {
            completion(.failure(NetworkError.invalidURL))
            return
        }

        // 쿼리 파라미터 추가
        urlComponents.queryItems = [
            URLQueryItem(name: "symbol", value: symbol),
            URLQueryItem(name: "api_key", value: apiKey)
        ]

        guard let url = urlComponents.url else {
            completion(.failure(NetworkError.invalidURL))
            return
        }

        // 네트워크 요청 실행
        URLSession.shared.dataTask(with: url) { data, response, error in
            
            // 오류 처리
            if let error = error {
                self.retryCount += 1
                if self.retryCount < 3 {
                    print("재시도 시도 $self.retryCount회")
                    DispatchQueue.global().asyncAfter(deadline: .now() + 2) {
                        self.fetchStockData(symbol: symbol, completion: completion)
                    }
                    return
                }
                completion(.failure(error))
                return
            }

            // 응답 처리
            guard let data = data else {
                completion(.failure(NetworkError.emptyResponse))
                return
            }

            do {
                // JSON 파싱
                let json = try JSONSerialization.jsonObject(with: data, options: []) as? [String: Any]
                guard let price = json?["price"] as? Double,
                      let currency = json?["currency"] as? String else {
                    completion(.failure(NetworkError.invalidFormat))
                    return
                }

                // 성공 처리
                completion(.success((symbol, price, currency)))
            } catch {
                completion(.failure(error))
            }
        }.resume()
    }
}

// NetworkError.swift
enum NetworkError: Error {
    case invalidURL
    case emptyResponse
    case invalidFormat
}
등록일: 2025년 10월 19일 02:35
언어 정보
언어
Swift
카테고리
Mobile
인기도
#10
학습 팁
코드를 직접 실행해보세요
변수를 바꿔가며 실험해보세요
오류가 나도 포기하지 마세요
다른 예제도 찾아보세요