본문 바로가기

iOS 앱 개발자 프로젝트/iOS 심화

[iOS] bookStore app project (3)

지난 글에 이어 오늘은

필요한 데이터를 모델링하고 이를 토대로 API를 연결해봅니다.

 

7r보ㅈr Z...  •̤᷆ ₃ •̤᷇ ฅ 


 

| Rest API Key 

 

우선, Kakao developers에서 개발자로 가입하고(개인 정보 입력 필수)

나에게 필요한 Rest API 키를 발급받았다. (보안 관계 상 key는 모자이크 처리했다)

my ID is heavenward.. zzz

 

 

 

| Modeling Data

 

작업중인 Xcode에서 New Group으로 Model 폴더를 만들고, 그 안에 BookModel.swift 파일을 생성!

 

그리고 아래 kakao rest api docs를  열어서 kakao의 책 검색하기의 Rest API 코드 형식을 확인했다.

예제를 통해 확인하니 좀더 정확하게 이들의 정책을 따를 수 있었다. 

 

Kakao Developers

카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.

developers.kakao.com

 

 

아래의 요청 예제를 보면 GET 방식의 기본 틀에 대한 감을 잡을 수 있다. 

하는 김에, GET 요청에 대한 복습도 해본다.

GET 요청은 서버로부터 데이터를 요청하는 HTTP 메서드로, URL에 파라미터를 포함해서 데이터를 요청한다.  이때 URLSession을 사용하여 비동기적으로 Get 요청을 보낼 수 있고, URLRequest를 사용(POST)해서 HTTP 메서드를 직접 설정할 수 있다.

kakao가 제공한 GET 요청 예시

 

 

header ->> 인증에 대한 내용 (auth)
query ->> 입력하는 값 (요구 값에 대한 처리. 예: 서치바 검색어 searchbar.text)

 

 

이제 아래의 응답 예제와 링크에 정의된 항목들을 보며 나에게 필요한(화면에 구현할) 데이터(값)을 

필터링해서(발라내서..) 방금 전에 생성한 Model > BookModel.swift 파일에서 struct로 모델링 해준다.

kakao가 제공한 응답 예시

 

나에게 필요없는 date나 ISBN 등은 필터링해서 가져왔다.

 

 

(QuickType을 사용하면 효율적이고 오류를 줄일 수 있다. )

 

Instantly parse JSON in any language | quicktype

 

app.quicktype.io

 

 

 

| Network Manager

 

가져올 데이터에 대한 모델링을 마치면, 이제 API setup을 한다. (드디어 준비 끝? 준비 시작?)

Network Manager라는 이름으로 swift 파일을 생성하고, 이 녀석은 Service 그룹으로 넣어줬다.

 

여기서 fetchRequest 메서드는 completion handler를 파라미터로 받으며, Result 열거형(enum)을 사용해서 BookModel 객체나 Error 객체 중 하나를 포함하는 값을 반환해 줄 것이다.

 

쉽게 말해, 네트워크 요청을 수행하고, success 또는 failure에 따라 적절한 값을 completion handler에 전달하는 역할이다. decoding이 끝난 뒤에 비로소 작업이 이루어지기 때문에 escaping closure를 써준다.

 

책 검색 api setup

 

 

위 코드는 아래의 두 섹션으로 이해할 수 있다.  

 

|| #1. URL 구성 

  • urlString에 Kakao API의 도서 검색 엔드포인트 URL 저장
  • header에는 Kakao API 인증을 위한 API 키 포함
  • URL(string: urlString)을 통해 URL 객체(파라미터) 생성  → 모자이크 처리한 부분
  • URLComponents를 사용하여 쿼리 파라미터 추가. ("미움받을 용기"라는 검색어)
  • URLRequest를 생성하여 HTTP 헤더와 메서드를 설정

 

|| #2. 네트워크 요청 및 응답 처리 

  • URLSession을 사용하여 네트워크 요청 수행
  • dataTask(with:) 메서드를 호출하여 비동기(async) 네트워크 요청 수행
  • 요청이 완료되면 클로저가 실행(escaping closure)되며, 응답 데이터(yeon), 응답 객체, 오류 객체(error) 전달
  • 오류가 발생하면 completion(.failure(error))를 호출하여 오류를 전달
  • 데이터가 성공적으로 수신되면 JSONDecoder().decode(BookModel.self, from: eclipse)를 통해 BookModel 객체로 디코딩
  • 디코딩에 성공하면 completion(.success(decodedData))를 호출하여 success 결과 전달

 

 

중간에 아래와 같은 error 메시지가 났었는데,

이건 실패 가능한 상황에 대해 예외처리를 하라는 걱정많은 xcode의 메시지였다. 

 

 

try try? try!

 

 

예외가 발생하면 에러를 처리할 문구(코드)가 필요하다.

 

try → 반드시 예외 처리 해야함 (catch 써서 exception에 대한 처리를 해라.. 라는 이번과 같은 에러 메시지 popup!)

try? → 예외 상황에서 nil 을 받아도 된다. 

try! → 강제 언래핑 = nil 이 아니라는 확신이 있을 때 쓰는 것 

 

 

다시말해, Swift 5.0에서 도입된 Result 타입을 통해 제네릭을 사용해서

비동기 네트워크 요청의 Success 또는 Failure 상태를 효과적으로 처리하고, 타입 안정성을 높일 수 있다.

 

즉, 요청이 성공하면 .success 케이스에 담기고, 실패하면 .failure 케이스에 error 객체가 담아 error 를 효율적으로 처리한다. 

 

 

 

 

to be continued.. 

'iOS 앱 개발자 프로젝트 > iOS 심화' 카테고리의 다른 글

[iOS] bookStore app project (5)  (6) 2024.05.12
[iOS] bookStore app project (4)  (0) 2024.05.09
[iOS] bookStore app project (2)  (2) 2024.05.07
[iOS] SnapKit (feat. SPM)  (2) 2024.05.05
[iOS] bookStore app project (1)  (2) 2024.05.04