-
[iOS] 9주차 세미나 정리iOS 2022. 11. 23. 23:35
[Network]
저녁을 먹을시간이 되었다고 가정했을때, 오늘 저녁 뭐먹을지 생각할것이다!
혼자생각할땐 대화를 하지않으니, 이런 상황에서는 어떻게 생각하고 말을 하던 아무런 상관이없다.
--- 혼자서 하는말이기때문 (소통이없음)
하지만 친구랑 저녁을 먹을땐?? -소통이 필요하다! (질문과 대답이 필요)
이처럼 의사소통을 주고받는다는것을 생활하면서 자연스럽게 익혔을것이다! (서로 대화가 가능한 언어로)
누군가와 소통하기 위해서는 의사소통이 가능한 언어로 대답을 해야한다! 즉, 사람은 소통할때 정해진 규칙을 가지고 한다. (암묵적 규칙이 필요하다.)
위와 같이 채팅앱이 있다고 가정할때 (카카오톡!), 어떤 채팅방에 들어가는 상황이라면?
: 채팅방 상대가 누구인지, 이전의 나눴던 채팅 내역 불러오기 등의 정보가 필요함!
(이처럼, 클라이언트와 서버는 사용자에서는 안보이지만 소통이 이루어짐)
아래와 같이 암묵적으로 정해진 응답에 의해 서버와 클라이언트는 의사소통을 하게된다. (정해진 양식에 따라!!)
이러한 정해진 양식은 HTTP 프로토콜이라고 부르며, HTTP 프로토콜에의해 클라이언트와 서버가 의사소통을 하게된다!
- 다양한 옵션
대화가 다 이해되지만, 만약에 사투리를 추가할수도있다! (경상도, 전라도 사투리 -억양이나 사용하는 단어, 표준어와 차이는 있지만 알아들을수있게 추가!)
+ 공적인 대화와 사적인 대화도 조금 다른것처럼, 여러 옵션이 추가될수도있음!
- 클라이언트와 서버도 프로토콜 규칙을 지키지만 옵션이 추가되는 경우가 있다.
상황에 따라 옵션이 달라질수있다! 옵션이 부가되는 여러가지 경우 중 크게 8가지로 정의된다 (이러한 옵션은 외울필요없고, 프로토콜을 지키면서 의사소통을 하는데, 추가될수있는 옵션이 있다는것만 확인)
- REST API
클라이언트와 서버가 의사소통을 할때 나누는 문장을 API라고 하며, 사용하는 언어와 환경이 다를때, 다른 플랫폼의 환경끼리 정보를 주고받을때 사용한다!
사람끼리 주고받는 문장도, 사적인 문장과 공적인 문장이 다 다른것처럼 클라이언트와 서버가 문장을 주고받을땐 REST API를 이용 (자기소개서의 양식정도라고 생각하면 된다.)
하나의 API를 구성하는 아키텍쳐 개념
(백엔드와 통신시 필수로 필요하므로, REST API의 가벼운 개념정도는 알고 넘어가기!)
API와 REST API의 차이?
API : 클라이언트와 서버가 의사소통을 나눌때 사용하는 문장
REST API : 그 API를 정해진 양식에 맞춰서 하나의 아키텍쳐를 적용한것
REST API는 자원을 이름으로 구분해서 자원의 정보를 주고받는것이다!
여기서 나오는 자원이란?
: 클라이언트가 서버에 요청하는 데이터!
ex) 유저의 이름을 알고싶다면 ? 클라이언트가 서버에 요청을 할텐데, 이때 이름을 요청하고 응답을 받는 과정에서 이름이란것을 URI로 구분하는것! (이름이란 데이터를 URI형식으로 정보를 주고받는것!)
위처럼, REST API는 행위, 자원, 메세지로 구성된다.
- 행위
행위라는것은 서버에 요청할때, 목적성을 생각해보면 된다.
예) 그냥 단순한 이름을 알려달라고 요청 아니면 혹은 회원가입하는경우 (서버에서 가져오는것, 서버에 집어넣는것)
- 서버와 의사소통을 하는 목적 자체가 한가지 구성요소로 들어감
(4가지 옵션을 사용함)
- 자원
자원은 URI를 통해 오브젝트에 접근하게된다.
서버와 의사소통을 할땐, 네트워크를 구성하는데, 이 네트워크는 우리가 흔히 보는 URL이 있을텐데, REST API에서는 자원요청하는 방식의 URI 방식은 다른것이다!
- URL : 홈페이지에 접근할때 네트워크를 통해서 사이트에 접근할때 그 도메인의 주소를 의미
- URI : 데이터베이스에 있는 자원의 주소라고 생각하면됨- 메세지라는 구성요소는 서버와 의사소통을 나눌때, 서버가 클라이언트에 하는 응답이 메세지로 구성되며, 이 메세지는 JSON이라는 데이터 포멧으로 구성되서 오게된다!
JSON 포멧이란?
- 데이터를 저장하거나 전송할때 사용하는 형식 (데이터를 표현하는 방법)
서버요청을 할때도 제이슨 형식에 맞춰서 보내야하고 서버가 응답을 할때도 제이슨 형식에 맞춰주어야한다.
: 키, 벨류 형태로 표기하며 딕셔너리 형태를 가진다고 이해해주면 된다!
- 마지막 정리
사람과 사람이 대화하는거처럼 서버와 클라이언트도 양식에 따라 의사소통을 한다. 암묵적인 규칙은 HTTP 프로토콜이라고 부르며, 대화를 주고받을때는 REST API를 사용하고, 세가지 구성요소를 지킨채로 API가 구성된다. 서버와 클라이언트는 제이슨 포멧에 맞춰서 대화를 주고받는다!
서버와클라이언트는 URI를 통해 GET요청을 하면 JSON 형태로 요청을 받는다!
[Codable]
JSON 포멧으로 요청을 주고받는다고 배웠는데, 스위프트 언어를 JSON 포맷으로 변환하거나 JSON 포멧으로 받은 응답을 스위프트 언어로 변환하는 작업이 필요하다! 이러한 변환 작업에 Codable을 사용한다!
- 유저의 이름을 불러왔을때 제이슨 포멧의 형태를 어떻게 처리할까?
테이블뷰 컬렉션뷰 배울때 데이터 모델을 구성해본것처럼, 서버한테 응답을 받을때도 요소에 맞게 가공하여 데이터 모델을 구성해야한다! 구조체 형식으로!
디코드라는 작업을 통해 JSON에서 Swift로 변환을 진행하게된다.
인코드라는 작업을 통해 Swift에서 JSON으로 변환을 진행하게된다.
인코딩과 디코딩이란?
A로 구성된 요소를 B로 구성된 요소로 변환할때 인코딩이라하고 다시 되돌릴때는 디코딩이라고 한다!
이러한 과정에서 프로토콜을 채택해야하며, Decodable이라는 프로토콜을 채택하면 알아서 Decoding을 해준다! (자동변환해줌!)
+인코딩은 Encodable
[Postman]
포스트맨은 ios에 내장된게 아니라 외부 사이트!
- 개발자들이 api를 테스트할수있는 플랫폼!
Postman API Platform | Sign Up for Free
Postman is an API platform for building and using APIs. Postman simplifies each step of the API lifecycle and streamlines collaboration so you can create better APIs—faster.
www.postman.com
프로그램으로 다운로드받는것이 최적화가 잘되어있으므로! 다운로드 받기!!!
- 다운로드 링크
https://www.postman.com/downloads/
Download Postman | Get Started for Free
Try Postman for free! Join 20 million developers who rely on Postman, the collaboration platform for API development. Create better APIs—faster.
www.postman.com
- 실습
: 공공데이터 API 사용해볼것!
공공데이터 포털
국가에서 보유하고 있는 다양한 데이터를『공공데이터의 제공 및 이용 활성화에 관한 법률(제11956호)』에 따라 개방하여 국민들이 보다 쉽고 용이하게 공유•활용할 수 있도록 공공데이터(Datase
www.data.go.kr
: 국가에서 (기관에서) 일반 개발자들이 데이터들을 가져다쓸수있게 무료 API를 개방해둔것!
- 지하철 정보를 제공해주는 API 이용! (국토교통부)
+ 미션으로 공공 API 사용해서 적용해보는 작업!
- 활용신청을 해야 사용할 수 있음!
서비스키를 발급받아야해서 활용신청을 하는것이므로
위 API처럼 자동승인이되는 API가 있는 반면에 승인받을때 시간이 좀 걸리는 API도 있다,,,!
- API같은경우에는 명세서를 통해 어떻게 사용할 수 있는지를 알려준다!
+ 파일추가 (매우 상세하게 나와있음!! -사용법)
오픈API활용가이드_국토교통부(TAGO)_지하철정보v1.0.docx0.34MB너무 자세하게 나와있으므로 실습에 사용할때는 간단하게 필요한것만 뽑아써보기!!
어떤 실습?
- 예를 들면 강남이라고 검색하면 강남이라는 이름이 포함된 지하철역이 출력되도록!실제로 요청할때는 발급받은 "요청주소"를 드래그해서 사용!
: http://apis.data.go.kr/1613000/SubwayInfoService/getKwrdFndSubwaySttnList
1. 해당 URL넣어주고!
2. 요청변수에 맞춰서 관련 키 넣어주기!
서비스키와 지하철역명만 사용할것이므로 두개와 데이터 타입만 넣어주기! (이 부분은 서버한테 클라이언트가 요청하는 부분!)
send 버튼을 눌러주면 json형식의 포멧으로 응답이 온것을 확인할 수 있다! (이 부분은 서버가 클라이언트한테 응답을 해주는 부분!)
3. 제이슨 포멧으로 응답하므로 스위프트 포멧으로 변환을 해주어야한다! - 데이터 모델 파일 생성!
처음 변환을 직접하기에는 어려우므로, 자동으로 변환을 해주는 플랫폼 이용!!
Convert JSON to Swift, C#, TypeScript, Objective-C, Go, Java, C++ and more • quicktype
{ "people": [ { "name": "Atticus", "high score": 100 }, { "name": "Cleo", "high score": 900 }, { "name": "Orly" }, { "name": "Jasper" } ] } Provide sample JSON files, URLs, JSON schemas, or GraphQL queries.
quicktype.io
위 사이트를 이용하면 자동으로 데이터모델에 맞게 스위프트로 변환해준다!!
서버한테 응답받은것을 스위프트로 변환하므로 Decodable 프로토콜 채택으로 변경만 해주기!
- DataModel 파일
// This file was generated from JSON Schema using quicktype, do not modify it directly. // To parse the JSON, add this file to your project and do: // // let dataModel = try? newJSONDecoder().decode(DataModel.self, from: jsonData) import Foundation // MARK: - DataModel struct DataModel: Decodable { let response: Response } // MARK: - Response struct Response: Decodable { let header: Header let body: Body } // MARK: - Body struct Body: Decodable { let items: Items let numOfRows, pageNo, totalCount: Int } // MARK: - Items struct Items: Decodable { let item: [Item] } // MARK: - Item struct Item: Decodable { let subwayRouteName, subwayStationID, subwayStationName: String enum CodingKeys: String, CodingKey { case subwayRouteName case subwayStationID = "subwayStationId" case subwayStationName } } // MARK: - Header struct Header: Decodable { let resultCode, resultMsg: String }
- 이제 서버한테 응답받은것을 스위프트로 바꿀준비가된것이다!
4. 코드를 작성해서 서버에 요청보내기! (HTTP 요청을 보내는 방식은 프레임워크를 이용!)
- 친절하게 애플에서는 프레임워크를 제공해주므로 사용해보자!
URLSession
https://developer.apple.com/documentation/foundation/urlsession
Apple Developer Documentation
developer.apple.com
- 공식문서 확인 : 네트워크 요청을 도와주는 프레임워크다!
서버통신할때 URLSession을 통해 서버요청을 하게될것!
(이번 세미나때에는 하지않을것! - 개인적으로 공부해야할부분!)
URLSession을 사용하기 쉽게 만들어둔 외부 라이브러리가 몇개있는데, 대표적으로 Alamofire가있다!
대중적이고 유명한 라이브러리!
1) Alamofire
https://github.com/Alamofire/Alamofire
GitHub - Alamofire/Alamofire: Elegant HTTP Networking in Swift
Elegant HTTP Networking in Swift. Contribute to Alamofire/Alamofire development by creating an account on GitHub.
github.com
- 위 GitHub를 참고해, 코코아팟을 통해 설치해서 사용하면 된다!
2) Moya
GitHub - Moya/Moya: Network abstraction layer written in Swift.
Network abstraction layer written in Swift. Contribute to Moya/Moya development by creating an account on GitHub.
github.com
- Alamofire를 사용하기 편하게 한단계 더 바꿔놓은것!
- 이 세가지는 더 쓰기 쉽다라는것은 없고 각각의 장단점이있다, 잘 모르겠으면 URLSession공부하는게 추천! (가장 기본이되는것이므로!)
5. 서버 요청을 보낼때는 URLSession을 통해 서버요청!
// // ViewController.swift // week9 // // Created by 김민경 on 2022/11/23. // import UIKit class ViewController: UIViewController { let session = URLSession(configuration: .default) var urlComponents = URLComponents(string: "http://apis.data.go.kr/1613000/SubwayInfoService/getKwrdFndSubwaySttnList")! let subwayStationName = URLQueryItem(name: "subwayStationName", value: "논현") let serviceKeyString = "YzTWkyxlVuAOFiFsqXRd9w%2BmByrgrDFBVIeTzWCu92kbojMchGHMfuXb%2BQlxE1et%2BpI45vHTBBMJQ7GetYqFig%3D%3D".addingPercentEncoding(withAllowedCharacters: .urlQueryAllowed) var serviceKey: URLQueryItem{ .init(name: "serviceKey", value: serviceKeyString) } let type = URLQueryItem(name: "_type", value: "json") override func viewDidLoad() { super.viewDidLoad() startNetworking() // Do any additional setup after loading the view. } func startNetworking() { let queryItems: [URLQueryItem] = [subwayStationName, serviceKey, type] urlComponents.queryItems = queryItems let requestURL = urlComponents.url! let dataTask = session.dataTask(with: requestURL) { data, response, error in let successRange = 200..<300 guard error == nil, let statusCode = (response as? HTTPURLResponse)?.statusCode, successRange.contains(statusCode), let resultData = data else { return } guard let dataModelResponse = try? JSONDecoder().decode(DataModel.self, from: resultData) else { self.startNetworking(); return } dataModelResponse.response.body.items.item.forEach { print($0) } } dataTask.resume() } }
아래와 같은 에러가뜰때는 첨부한 티스토리를 참고해서 수정해주면된다!
- 아래 티스토리 참고 -
https://doqtqu.tistory.com/107
[iOS] App HTTP 접근 허용하기
ATS(App Transport Sercurity)는 iOS 9 버전 이후부터 적용된 보안 정책으로, 보안에 취약한 네트워크를 차단시킨다.따라서 HTTP 접근 시 Console 창에 다음과 같은 에러가 발생하며 안내사항과 같이 Info.plist
doqtqu.tistory.com
접근 허용을 해주면 서버에서 잘 응답받은것을 확인할 수 있다!!
[미션안내]
스탠다드 미션
- 공공 데이터 이용해서 오픈API 활용해서 서버통신하기! (스위프트로 가공해서 사용!), 새로운 프로젝트에 해도 상관없고, 기존 프로젝트에 해도 상관없음! (서버통신 기술 공부!!)
- 소셜 로그인 구현 (구글 로그인, 카카오 로그인 등등) : 카카오 소셜 로그인 추천!
https://developers.kakao.com/docs/latest/ko/kakaologin/rest-api
Kakao Developers
카카오 API를 활용하여 다양한 어플리케이션을 개발해보세요. 카카오 로그인, 메시지 보내기, 친구 API, 인공지능 API 등을 제공합니다.
developers.kakao.com
챌린지 미션
- 없음.
+ 공부해두면 좋을 내용
'iOS' 카테고리의 다른 글
[iOS] 10주차 세미나 정리 (2) 2022.11.28 [iOS] Alamofire를 이용한 공공데이터 API 이용 (0) 2022.11.26 [iOS] UI animate 이용해서 navigation bar 숨기기 (0) 2022.11.18 [iOS] Tap Gesture 이용해서 Keyboard 숨기기 (0) 2022.11.17 [iOS] 8주차 세미나 정리 (0) 2022.11.14