본문 바로가기
실무 (iOS)

iOS 프로그래밍실무 10주차 [ Open API 기반 앱 개발 1]

by DeathStar183 2025. 5. 10.

 

오늘 보고 넘어갈것들

 

- 박스오피스 앱만들기

- 오픈 API를 사용한 앱개발

- 코드내 관련 정보

 

(이번주는 사진이 굉장히 많습니다. 데이터 사용시 스압주의!)

 

 

 

 

사전 준비1.  오픈 API 수집하기

1주차나 , 전주차의 마지막을 참고해주세요!

 

↓ 데이터 수집을 위한 사이트 ↓

 https://www.kobis.or.kr/kobisopenapi/homepg/main/main.do

 

영화진흥위원회 오픈API

OPEN API 서비스 영화진흥위원회 영화관입장권통합전산망에서 제공하는 오픈API 서비스로 더욱 풍요롭고 편안한 영화 서비스를 즐겨보세요.

www.kobis.or.kr

 

↓  1주차의 9번을 참고하기 ! ↓

https://thisgame.tistory.com/77

 

iOS 프로그래밍 실무 [1주차]

이번주에 보고 넘어갈것들 - swift 개요- 전세계 시가총액- 시장 현황 분석- 안드로이드 , iOS 계열 버전 , 이쪽 분야로 취업하고자 할때- 문법 복습    1. IOS ? , iOS ? , ios 무슨차이일까?  2-1. 전세

thisgame.tistory.com

 

↓  또는 9주차를 참고하기 ! ↓

https://thisgame.tistory.com/84

 

iOS 프로그래밍 실무 9주차 (Restful , JSON , Open API 앱 개발)

오늘 보고 넘어갈것들 - 영화 앱만들기 기반- Restful- JSON- Open API- 함수 , 클로저 , 디폴트 매개변수 준비. 영화진흥위원회의 Open API 다운받기https://www.kobis.or.kr/kobisopenapi/homepg/main/main.do 영화진흥위

thisgame.tistory.com

 

 

 

사전 준비2 . 앱 개발을 위한 초반 준비

 

 

 

1-1. 윈도우 키 + R로 정상 실행이 되는지 확인하기

 

 

 

1-2. 화면을 표시할 테이블뷰 추가하기

 

 

 

1-3. Add New constraints

 

 

 

 

1-4. Assistant editor ( ctrl + alt + command(windows key) + enter )

 

 

 

1-5. 테이블 뷰 아울렛 설정

 

 

 

 

1-6. 테이블 뷰는 2개의 프로토콜의 도움이 필요하므로 채택(adopt)하기

 

 

 

 

1-7-1.  오류 테스트를 위해서 임의 설정후 실행

 

 

 

1-7-2. 코드 수정 

 

 

 

1-8-1. 테이블 뷰를 직접 디자인하기

 

 

 

1-8-2. 직접 만들경우엔 idenfier가 필요함

 

 

 

2. 서브 클래스 제작 ( Cocoa Touch Class )

 

 

 

2-1. 관리할 클래스를 연결하기

입력창에 커서를 갖다만 대도 자동 선택되지만, 가끔 안되는 경우가 있으니 잘 찾아보시길 바랍니다.

 

 

 

2-2. 내용을 표시할 라벨 추가하기

 

 

 

2-3. assistant editor를 열었는데 파일이 다른게 뜰 경우

 

 

 

2-4. 라벨에 아울렛 지정후 코드 수정뒤 실행

 

 

 

2-5. 부모 클래스를 자식 클래스로 변환해서 사용하기

 

 

 

2-6.  Int형 값 , 배열값을 표시하는 방법

 

 

 

2-7. ( _: cellForRowAt:)? : 스크롤해서 표시될때마다 계속 호출

 

 

이제 거의 다 왔습니다! 이제부터 조금씩 어려울수도 있지만 끝까지 도전!

 

 

 

3. 네트워킹 4단계

 

 

 

3-1. 자신의 키가 들어간 링크를 넣고 연결하기

 

실행시 옵셔널 값으로 자신의 키가 들어간 영진위 api 링크가 나옵니다. (옵셔널을 풀려면 url!로 적으면 됩니다.)

 

 

 

3-2. 강제 언래핑 , if ~ let 보다 안전한 guard ~ let

 

좌측은 if ~ let을 사용한 버전 , 우측은 guard ~ let을 사용한 버전

 

 

 

3-3. 정보를 표시할 섹션 만들기

 

 

 

3-4. 어떤 섹션을 불러올지 정해주기

 

data의 정보를 보면 3776 바이트라고 나옵니다. (영진위 api에서 따온 코드 총합의 크기)

 

부록 1. 그럼 response에는 어떤 정보가?

 

 

 

3-5. 코드를 guard ~ let을 이용해 안전하게 처리해도 정보 크기가 안뜬다?

 

 

 

3-6. 정보를 String형으로 찍어보기

 

String형으로 찍어봤을때 데이터가 잘 불러와졌다면 성공!

 

 

 

4. 파싱용 구조체 만들기

 

 

 

4-1. 파싱을 위한 API 데이터 수집

 

 

 

4-2. JSON 데이터를 이용해 데이터 모델 만들기

 

가져온 데이터를 좌측칸에 입력하면 , 원하는 데이터만 뽑아서 사용가능한 모델로 변환시켜줍니다.

 

 

 

또는, 생성용 AI를 사용하여 파싱을 쉽게 하기 위해서 MovieData형 구조체를 만들어달라고 하면 만들어줍니다.

import Foundation

// 1. 박스오피스 목록의 각 영화 정보 구조체
struct DailyBoxOffice: Codable {
    let rnum: String
    let rank: String
    let rankInten: String
    let rankOldAndNew: String
    let movieCd: String
    let movieNm: String
    let openDt: String
    let salesAmt: String
    let salesShare: String
    let salesInten: String
    let salesChange: String
    let salesAcc: String
    let audiCnt: String
    let audiInten: String
    let audiChange: String
    let audiAcc: String
    let scrnCnt: String
    let showCnt: String
}

// 2. 전체 박스오피스 결과 구조체
struct BoxOfficeResult: Codable {
    let boxofficeType: String
    let showRange: String
    let dailyBoxOfficeList: [DailyBoxOffice]
}

// 3. 최상위 movieData 구조체
struct MovieData: Codable {
    let boxOfficeResult: BoxOfficeResult
}




let decoder = JSONDecoder()
do {
    let movieData = try decoder.decode(MovieData.self, from: jsonData)
    // 이제 movieData.boxOfficeResult.dailyBoxOfficeList 등으로 접근 가능
} catch {
    print("파싱 실패: \(error)")
}

 

 

밑의 코드는 여태까지 작업한 코드를 한번에 작성되어 있는 코드입니다.

import UIKit

let name = ["1등","2등","3등","4등","5등"]

class ViewController: UIViewController,UITableViewDelegate,UITableViewDataSource {
    
    @IBOutlet weak var table: UITableView!
    
    let movieURL = "자신의 키를 넣으세요"
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        table.delegate = self
        table.dataSource = self
        getData()
    }
    
    func getData() {
        guard let url = URL(string: movieURL) else { return }
        let session = URLSession(configuration: .default)
        let task = session.dataTask(with: url) { data, response, error in
            if error != nil { print(error!)
            return
            }
            guard let JSONdata = data else { return }
            let dataString = String(data: JSONdata, encoding: .utf8)
            print(dataString!)
        }
        task.resume()
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 5
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "myCell", for:
        indexPath) as! MyTableViewCell
        cell.movieName.text = name[indexPath.row]
        //print(indexPath.description)
        return cell
    }
    
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)
    { print(indexPath.description) }
    
    func numberOfSections(in tableView: UITableView) -> Int {
    return 6
    }
}

 

 

댓글