오늘은 환율 계산기를 만들어볼게요. 이번에 할 프로젝트는 앱 스토어 등록까지 해보겠습니다.!
저는 한국술출입은행에서 제공하는 공공데이터인
현제환율 Open API를 사용하겠습니다.
https://www.koreaexim.go.kr/ir/HPHKIR020M01?apino=2&viewtype=C&searchselect=&searchword=
API를 확인해볼게요
https://www.koreaexim.go.kr/site/program/financial/exchangeJSON?authkey=AUTHKEY1234567890&searchdate=20180102&data=AP01
위에 있는코드가 한국술출입은행에서 제공하는 샘플 API입니다.
authkey: OpenAPI 신청시 발급된인증키를 입려주시면 됩니다.
searchdate: 원하는 시간대를 입렵해주시면 됩니다(아무것도 입력안하면 현재기준)
data:검색을 요청할 데이터 타입입니다.
그럼 이 데이터를 가지고 PostMan프로그램에서 한번 실제 데이터값을 확인해 보겠습니다.

위와같이 실제 데이터가 나옵니다.
먼저 데이터파싱을 하기전에 데이터 구조체 먼저 만들어주겠습니다.
"result": 1,
"cur_unit": "USD",
"ttb": "1,322.73",
"tts": "1,349.46",
"deal_bas_r": "1,336.1",
"bkpr": "1,336",
"yy_efee_r": "0",
"ten_dd_efee_r": "0",
"kftc_bkpr": "1,336",
"kftc_deal_bas_r": "1,336.1",
"cur_nm": "미국 달러"
저는 이 데이터가 다 필요하지 않기 때문에 필요한것만 골라서 사용할게요.
필요한데이터:
코드로 구현한 구조체입니다.
import Foundation
struct ExchangeModel: Codable {
var cur_unit: String
var ttb: String
var tts: String
var deal_bas_r :String
var cur_nm: String
이제 그럼 데이터를 불러올 수 있는 함수를 만들어 봅시다.
let url = "https://www.koreaexim.go.kr/site/program/financial/exchangeJSON?authkey=APIKEY&searchdate=20240325&data=AP01"
func getCurr_Exchange(completion: @escaping([ExchangeModel]?,String?) -> ()) {
let session = URLSession.shared
let decoder = JSONDecoder()
if let url = URL(string: url) {
let task = session.dataTask(with: url) { data, response, error in
guard let data = data else {
completion(nil, error?.localizedDescription)
return
}
do {
completion(try decoder.decode([ExchangeModel].self, from: data), nil)
} catch {
print("called Error json", error)
completion(nil,error.localizedDescription)
}
}// task
task.resume()
}// url
} //method

함수를 만드는 과정중 첫번째는 구조체 에서 에러가 생겼습니다. taskdata구문에서 내가 무슨 뭘 안지켰다고해서 알고보니 Codable 기준을 준수하지 못했습니다. CodingKey를 할때는 Struct 내에 있는 모든 데이터를 case 구문안에 넣어줘야 되던구요!
두번째 API를 호출 할 데이터가 없다고 뜨는 겁니다….
이것또한 Json Array 이란 형태로 되어있더군요
처음 알았습니다 배열이라니 알지 못할때는 기존에 알고 있던 파싱 방법으로 파싱을 시도 하였으니 안되는거였습니다.
해결 방법으로는
try decoder.decode([ExchangeModel].self, from: data
이렇게 decode 안에 들어갈 구조체를 배열로 감싸주면 됩니다!!!!!!
오늘은 개인적인 포스팅을 해보았습니다.
Today I Learned Rmx!