[UMC] 9주차 : 네트워크
📝 학습 목표
- 클라이언트와 서버가 무엇인지 이해한다.
- 클라이언트와 서버 간의 통신 방법을 이해한다.
- HTTP 프로토콜에 대해 이해한다.
- Postman을 활용하여 API 테스트를 할 수 있다.
- 공공 API를 활용할 수 있다.
- Library를 사용하여 서버와 통신할 수 있다.
✍🏻 수업 내용 정리
- 세미나를 들으며 들으며 느낀 점, 배운 점들을 정리해보세요! -
네트워크
혼잣말을 하면 어떤 말로 하든 상관 없음
하지만 다른 사람과 이야기를 하면 의사소통을 해야 하기에 그 사람과 자신이 통할 수 있는 언어를 사용해야 한다
→사람은 누군가와 대화를 할 때 (암묵적으로) 정해진 규칙을 준수해야 한다.
서버와 대화를 할 땐 이런식으로 진행
만약 채팅앱이면 이전 채팅 내역을 불러온다던지…이런 정보가 필요해서 클라이언트와 서버는 사용자에게 보여지진 않지만 서버단에선 이런 요청을 계속 주고받고 있다.
서버와 클라이언트도 사람 사이의 대화와 마찬가지로 요청과 응답이라는 정해진 양식에 따라 의사소통을 하게 된다.
HTTP 프로토콜을 지키는 데 이 8까지 옵션이 필요하다!
자기소개서를 쓴다고 했을 때 그 양식
API의 양식을 뜻함
🎯 핵심 키워드
-
클라이언트와 서버
## 클라이언트와 서버
### 서버(server) : 서비스를 제공하는 컴퓨터(service provider)
- 다수의 클라이언트에게 서비스를 제공하기 때문에 고사양의 하드웨어를 갖춘 컴퓨터이지만, 하드웨어의 사양으로 서버와 클라이언트를 구분하는 것은 절대 아니며, 사양의 관계없이 서비스를 제공하는 소프트웨어가 실행되는 컴퓨터를 서버라고 한다.
### 클라이언트(client) : 서비스를 사용하는 컴퓨터(service user)
- 서버와 이어진 모든 기기(컴퓨터의 경우 WIFI / 모바일은 모바일 네트워크)와 단말기에서 이용하는 웹에 접근하는 SW이며, 주로 서버에 요청을 보내고 응답을 받는 역할을 한다.
-
HTTP 프로토콜
1. HTTP 프로토콜이란?
HTTP(Hypertext Transfer Protocol)는 인터넷상에서 데이터를 주고 받기 위한 서버/클라이언트 모델을 따르는 프로토콜이다.
애플리케이션 레벨의 프로토콜로 TCP/IP위에서 작동한다.
HTTP는 어떤 종류의 데이터든지 전송할 수 있도록 설계돼 있다.
HTTP로 보낼 수 있는 데이터는 HTML문서, 이미지, 동영상, 오디오, 텍스트 문서 등 여러종류가 있다.
하이퍼텍스트 기반으로(Hypertext) 데이터를 전송하겠다(Transfer) = 링크기반으로 데이터에 접속하겠다는 의미이다.
-
Request와 Response
웹은 서버와 클라이언트로 구성되며 서로 간에 HTTP 프로토콜을 기반으로 동작한다.
클라이언트와 웹 서버 사이의 요청에 관련된 정보는 request객체에 저장되어 관리가 되며,
응답에 관련된 정보는 response 객체에 저장되고 관리된다.
request, response는 개발자가 객체를 별도로 생성하지 않아도 JSP에서 바로 사용 할 수 있는 객체 라는 공통점을 가지고 있다.
-
API
API(application programming interface 애플리케이션 프로그래밍 인터페이스[*], 응용 프로그램 프로그래밍 인터페이스)는 컴퓨터나 컴퓨터 프로그램 사이의 연결이다. 일종의 소프트웨어 인터페이스이며 다른 종류의 소프트웨어에 서비스를 제공한다.[1] 이러한 연결이나 인터페이스를 빌드하거나 사용하는 방법을 기술하는 문서나 표준은 API 사양으로 부른다. 이 표준을 충족하는 컴퓨터 시스템은 API가 구현(implement)되었다거나 노출(expose)되었다고 말한다. API라는 용어는 사양이나 구현체를 의미할 수 있다.
컴퓨터와 인간을 연결시키는 사용자 인터페이스와 반대로, API는 컴퓨터나 소프트웨어를 서로 연결한다. 직접 사람(최종 사용자)에 의해 사용되도록 고안된 것이 아니며, 대신 소프트웨어에 이를 통합하고자 하는 컴퓨터 프로그래머가 사용하도록 고안되었다. API는 각기 다른 부분으로 구성되기도 하며 프로그래머가 사용할 수 있는 도구나 서비스의 역할을 한다. 이러한 부분들 중 하나를 사용하는 프로그램이나 프로그래머는 API의 해당 부분을 호출(call)한다고 말한다. API를 구성하는 호출들은 서브루틴, 메소드(method), 요청, 통신 엔드포인트라고도 부른다. API 사양은 이 호출들을 정의하며, 다시 말해 이들을 어떻게 사용하거나 구현하는지를 설명한다는 것을 의미한다.
API의 한 가지 목적은 시스템이 동작하는 방식에 관한 내부의 세세한 부분을 숨기는 것으로, 내부의 세세한 부분이 나중에 변경되더라도 프로그래머가 유용하게 사용할 수 있고 일정하게 관리할 수 있는 부분들만 노출시킨다. API는 특정 시스템용으로 커스텀하게 빌드될 수도 있고, 아니면 수많은 시스템 간 상호운용성을 허용하는, 공유가 되는 표준일 수도 있다.
API라는 용어는 웹 API를 의미하기도 하며,[2] 이는 인터넷에 의해 병합된 컴퓨터들 간 통신을 허용한다. 프로그래밍 언어, 소프트웨어 라이브러리, 컴퓨터 운영 체제, 컴퓨터 하드웨어를 위한 API도 존재한다. API는 1940년대에 기원하였으나 이 용어는 1960년대, 70년대 들어서야 모습을 드러냈다.
-
Rest API
REST(Representational State Transfer)의 약자로 자원을 이름으로 구분하여 해당 자원의 상태를 주고받는 모든 것을 의미합니다.
### 즉 REST란
- HTTP URI(Uniform Resource Identifier)를 통해 자원(Resource)을 명시하고,
- HTTP Method(POST, GET, PUT, DELETE, PATCH 등)를 통해
- 해당 자원(URI)에 대한 CRUD Operation을 적용하는 것을 의미합니다.
-
JSON
JSON(제이슨[1], JavaScript Object Notation)은 속성-값 쌍(attribute–value pairs), 배열 자료형(array data types) 또는 기타 모든 시리얼화 가능한 값(serializable value) 또는 “키-값 쌍”으로 이루어진 데이터 오브젝트를 전달하기 위해 인간이 읽을 수 있는 텍스트를 사용하는 개방형 표준 포맷이다. 비동기 브라우저/서버 통신 (AJAX)을 위해, 넓게는 XML(AJAX가 사용)을 대체하는 주요 데이터 포맷이다. 특히, 인터넷에서 자료를 주고 받을 때 그 자료를 표현하는 방법으로 알려져 있다. 자료의 종류에 큰 제한은 없으며, 특히 컴퓨터 프로그램의 변수값을 표현하는 데 적합하다.
본래는 자바스크립트 언어로부터 파생되어 자바스크립트의 구문 형식을 따르지만 언어 독립형 데이터 포맷이다. 즉, 프로그래밍 언어나 플랫폼에 독립적이므로, 구문 분석 및 JSON 데이터 생성을 위한 코드는 C, C++, C#, 자바, 자바스크립트, 펄, 파이썬 등 수많은 프로그래밍 언어에서 쉽게 이용할 수 있다.
JSON 포맷은 본래 더글라스 크록포드가 규정하였다. RFC 7159와 ECMA-404 그리고 ISO/IEC 21778:2017[2] 표준에 의해 기술되고 있다. KS 부합화 표준은 아직 제정되지 않았으며, TTA 협회 표준명은 TTAE.OT-10.0394이다. ECMA 표준과 ISO/IEC 표준은 문법만 정의할 정도로 최소한으로만 정의되어 있는 반면 RFC는 시맨틱, 보안적 고려 사항을 일부 제공 한다.[3] JSON의 공식 인터넷 미디어 타입은
application/json
이며, JSON의 파일 확장자는.json
이다. -
Codable
# Codable
A type that can convert itself into and out of an external representation.
iOS 8.0+iPadOS 8.0+macOS 10.10+Mac Catalyst 13.0+tvOS 9.0+watchOS 2.0+
## Declaration
typealias Codable = [Decodable](https://developer.apple.com/documentation/swift/decodable) & [Encodable](https://developer.apple.com/documentation/swift/encodable)
## Discussion
Codable
is a type alias for theEncodable
andDecodable
protocols. When you useCodable
as a type or a generic constraint, it matches any type that conforms to both protocols.## See Also
**Custom Encoding and Decoding**
[protocol Encodable](https://developer.apple.com/documentation/swift/encodable)
A type that can encode itself to an external representation.
[protocol Decodable](https://developer.apple.com/documentation/swift/decodable)
A type that can decode itself from an external representation.
[protocol CodingKey](https://developer.apple.com/documentation/swift/codingkey)
A type that can be used as a key for encoding and decoding.
[protocol CodingKeyRepresentable](https://developer.apple.com/documentation/swift/codingkeyrepresentable)
A type that can be converted to and from a coding key.
[struct CodingUserInfoKey](https://developer.apple.com/documentation/swift/codinguserinfokey)
A user-defined key for providing context during encoding and decoding.
-
Decode
컴퓨터에서
인코딩(Encoding)
그리고
디코딩(Decoding)
이란 말은 여러 가지 의미로서 사용됩니다.
그러나 어떤 경우든, 인코딩이란 “정보를 부호화/암호화시킨다”입니다.
디코딩이란 정반대로, 그 부호화/암호화를 해제한다는 뜻을 가집니다.
-
Encode
컴퓨터에서
인코딩(Encoding)
그리고
디코딩(Decoding)
이란 말은 여러 가지 의미로서 사용됩니다.
그러나 어떤 경우든, 인코딩이란 “정보를 부호화/암호화시킨다”입니다.
디코딩이란 정반대로, 그 부호화/암호화를 해제한다는 뜻을 가집니다.
-
-
Alamofire Library
iOS HTTP통신을 할 때 필수 라이브러리인 Alamofire에 대해서 아주 간단히 정리해보겠다!
Alamofire는 iOS, macOS를 위한 스위프트 기반 HTTP 네트워킹 라이브러리로 Apple의 Foundation networking 기반으로 인터페이스를 제공하여 일반적인 네트워킹 작업을 단순화한다. Alamofire는 함께 사용가능한(chainable) request/response 매소드들, JSON 파라미터, 응답 직렬화(response serialization), 인증(authentication) 그리고 많은 다른 기능을 제공한다.
- 연결가능한(Chainable) Request/Response 메서드
- URL / JSON / plist 파라미터 인코딩
- 파일 / 데이타 / 스트림 / 멀티파트 폼 데이타 업로드
- Request 또는 Resume 데이터를 활용한 다운로드
- NSURLCredential을 통한 인증(Authentication)
- HTTP 리스폰스 검증(Validation)
- TLS 인증서와 공개 키 Pinning
- 진행 상태 클로저와 NSProgress
- cURL 디버깅 출력
- 광범위한 단위 테스트 보장
- 완벽한 문서화
즉, 정리해보자면 아래와 같다.
- Alamore란 iOS, macOS를 위한 Swift 기반의 HTTP 네트워킹 라이브러리
- Alamofire는 URLSession 기반이며 URLSession은 네트워킹 호출에서 모호한 부분이 많은데 Alamofire를 사용한다면 데이터를 접근하기 위한 노력을 줄일 수 있으며 코드를 더 깔끔하고 가독성 있게 쓰는 것이 가능해짐
-
Moya Library
대표적인 네트워킹 라이브러리로는 Alamofire, Moya가 있는데요, 오늘은 Moya에 대해서 배워보도록 하겠습니다.
Alamofire와 Moya는 둘 다 외부 네트워킹 라이브러리이지만, 둘은 목적이 다릅니다.
추상화 프레임워크인 Moya를 알아보도록 하겠습니다.
인터넷에 접근하기 위해 다음과 같은 구조를 거칠 것입니다.
[사진 1]
다음과 같은 구조는, 화살표의 시작과 끝이 자유롭다는 점에서 긍정적이라고 할 수 있으나(..)
네트워킹이 필요한 모든 액션이나 뷰에서 네트워킹을 호출한다면 이른바 콜백 헬에 이를 수 있습니다.
이를 해결하기 위해서는 조금 수고를 해서라도 일일히 비동기처리를 해준다던지,
비동기 프레임워크인 Rx를 사용한다는 방법이 있을 수 있지만
Moya에서는 다음과 같은 구조로 해결하기를 제안합니다. ( RxSwift도 지원함 RxMoya도 있음 )
[그림 2]
네트워킹 레이어가 훨신 정돈되었습니다.
위와 같이 정리된 네트워킹 흐름은 세가지 단점을 극복시켜 주었습니다.
- Makes it hard to write new apps (“where do I begin?”)
- Makes it hard to maintain existing apps (“oh my god, this mess…”)
- Makes it hard to write unit tests (“how do I do this again?”)
또한, Moya의 훌륭한 세가지 특징은
- Compile-time checking for correct API endpoint accesses.
- Lets you define a clear usage of different endpoints with associated enum values.
- Treats test stubs as first-class citizens so unit testing is super-easy.
위와 같습니다.
Moya와 Alamofire의 차이는 무엇인가 묻는다면, 가장 간단하게는
Moya는 직접적인 네트워킹을 수행하지 않음 (자체적 네트워킹을 수행하지 않는다)
Alamofire는 직접적인 네트워킹을 수행함
으로 정리할 수 있겠습니다.
그렇다면, Moya로 Alamofire의 네트워킹 기능을 사용하고, Alamofire을 추상화하기 위한 수단인 것이겠죠?
오늘의 Moya 설명에서 필요한 것은 크게 두가지입니다.
1.
열거체 정의
2.
Request는
***MoyaProvider***
가 담당하고 있습니다. 이때 사용하는 파라미터는 TargetType입니다.### 예제코드 설명(www.raywenderlich.com/5121-moya-tutorial-for-ios-getting-started)
### 1
Moya는 열거형을 사용해서 타입이 안전한 방식(Type-Safe)으로 네트워킹을 요청합니다. 열거체를 만들어 줍니다.
import Moya public enum Marvel { // 1 static private let publicKey = “YOUR PUBLIC KEY” static private let privateKey = “YOUR PRIVATE KEY” // 2 case comics } view rawmoyaEnum.swift hosted with ❤ by GitHub
열거체를 하나 만들었는데, 이름
Marvel
에 관련된 통신을 이 열거체에서 진행할 것입니다.case comics에서
comics는 어느 연관값도 가지고 있지 않은 한 API Service가 됩니다. 이를 구현하기 위해서는
comics에 필요한 Url, Path, method, header와 task 등의 기본적 규약을 구성해야 합니다.
- 1에서 필요한 공개키와 프라이빗 키는 예제코드를 따라가면 받을 수 있습니다.
1 - 1
extension으로 열거체에 속성을 부여합니다. 또한,
***TargetType***
을 채택해서 필요한 속성들을 구현해주어야 합니다.TargetType에서 제공하는 속성은 다음과 같습니다.
- baseURL: 서버의 Base URL
- path: API 주소. baseURL 뒤에 경로 형태로 붙음.
- method: HTTP method (GET, POST, …)
- sampleData: 테스트용 Mock이나 Stub
- task: 리퀘스트에 사용되는 파라미터 설정
- validationType: 허용할 response의 타입
- headers: HTTP header
📢 9주차 수업 후기
- 9주차 수업을 듣고 서로 느낀 점을 이야기해주세요!
- 핵심 키워드에 대해 완벽하게 이해했는지? 혹시 이해가 안 되는 부분은 뭐였는지? 서로 이야기해주세요!
⚠️ 스터디간 주의사항
- 과제 피드백 기반 진행입니다 - 한명씩 본인의 과제를 발표하는 시간 그리고 해온 과제에 대한 피드백을 하는 시간 (ex:전 이렇게 생각해서 이런 부분 다르게 해왔는데 저것도 괜찮은 것 같아요!)이 무조건 기반이 되어야 합니다!
- 부가적으로 워크북에서 제공되는 키워드 혹은 강의에서 들은 디테일적인 부분에서 더 토의해봐도 좋을 것 같습니다.
✅ 실습 체크리스트
-
Postman을 활용하여 API 테스트를 할 수 있나요?
- 서버로부터 받아온 데이터를 Decode 할 수 있나요?
- 공공 API를 활용하여 데이터를 받아올 수 있나요?
-
Alamofire Library를 사용하여 서버와 통신할 수 있나요?
-
미션 참고 영상
⚡ 트러블 슈팅
-
⚡이슈 No.1 (예시, 서식만 복사하시고 지워주세요.)
이슈
👉 앱 실행 중에 노래 다음 버튼을 누르니까 앱이 종료되었다.
문제
👉 노래클래스의 데이터리스트의 Size를 넘어서 NullPointException이 발생하여 앱이 종료된 것이었다.
해결
👉 노래 다음 버튼을 눌렀을 때 데이터리스트의 Size를 검사해 Size보다 넘어가려고 하면 다음으로 넘어가는 메서드를 실행시키지 않고, 첫 노래로 돌아가게끔 해결
참고 레퍼런스
- 링크
🤔 이것도 한 번 생각해봐요!
- HTTP Method 중 GET/POST/PUT/DELETE 외에 다른 옵션에 대해 공부해보세요! (Ex. PATCH, HEAD, TRACE, …)
- 데이터 포맷인 XML에 대해서 알아보고, JSON과의 공통점 및 차이점에 대해 공부해보세요!
- URL과 URI의 차이점에 대해 공부해보세요!
- Alamofire와 Moya를 제외한 다른 Library에는 어떤 것이 있는지 조사해보세요!
- API 연동시 에러코드로 자주 나오는 400~500번대 HTTP response code에 대해서 조사해 보세요. 나중에 오류에 대한 대처가 빨라집니다.
스탠다드 미션 😎
🥨 API로 코로나 확진자 수 그래프 띄우기
기능 상세
시도별 신규 확진자 수가 파이 차트로 표시되어야 합니다. 도시 항목을 선택하면 상세 현황을 볼 수 있는 화면으로 이동되어야 합니다.
활용 기술
- 굿바이 코로나 19 APIAlamofire (http 통신)Cocoapods (외부 라이브러리 사용)
Alamofire
Alamofire는 swift 기반의 http 네트워킹 라이브러리입니다. url 세션에 기반한 라이브러리로, 네트워킹 작업을 단순화하고 네트워킹을 위한 다양한 메소드와 JSON 파싱 등을 제공합니다-특징연결 가능한 request response 메소드를 제공URL JSon형태의 파라미터 encoding 지원또 파일 데이터 스트링 multipart form 데이터 등 업로드 기능을 제공하고 http response검증과 광범위한 단위 테스트 및 통합 테스트를 보장합니다. 사실 Alamofire 대신 애플에서 기본적으로 제공하는 URLSession을 사용해 http 통신이 가능합니다. 그럼에도 불구하고 많은 사람들이 Alamofire를 사용하는 이유는 Alamofire는 코드의 간소화 및 가독성 측면에서 도움을 주고 여러 기능을 직접 구현하지 않아도 쉽게 사용할 수 있기 때문입니다. urlsession은 호출할 API의 URL을 생성하고 QueryParameter가 있다면 URL에 매핑시켜주는 코드를 작성해야 하지만, Alamofire는 요청을 생성할 때, 메소드 파라미터에 URL과 파라미터를 넘겨주면 내부애서 자동으로 매핑시켜줍니다. 유효성 검사 같은 경우에도 URL세션의 response 객체를 HTTPURLResponse로 다운캐스팅하여 Status property에 접근해 200 번대인지 확인하는 코드를 직접 작성해야 하지만, Alamofire는 Validate메소드만 호출하면, 정상 status 코드 범위(200번대)만 허용하게 만들어줄 수 있습니다.
Alamofire 사용방법
먼저 requset 메소드를 이용하여 http 통신 요철을 할 수 있다.메소드 파라미터로 URL과 http 메소드 파라미터 등 요청에 필요한 정보를 쉽게 설정할 수 있다Alamofire는 http 메소드 또한 지원을 한다.대표적인 http메소드는 get, post, put, delete가 정의되어 있다요청을 만들 때, request 메소드 파라미터에 http 메소드를 전달할 수 있다.Alamofire에선 요청에 대한 응답을 response 메소드를 이용해서 핸들링한다응답이 완료되면 completion 핸들러가 호출된다AF.request(“http://httpbin.org.get”).responseJSON{ response in debugPrint(response)}reponse메소드는 다음과 같이 request 메소드와 chaining하여 사용된다.
😈 로그인 기능 구현하기
Login-Sample-App
!
- USER: Service Provider에 계정을 갖고 있는 사용자
- Consumer: Service Provider의 API를 사용하려는 서비스3.Service Provider: OAuth를 사용하여 API를 제공하려는 서비스4.Access Token: 인증 완료 후 Service Provider의 제공 기능을 이용할 수 있는 권한을 위임 받은 인증 키
위 사진에서 권한 위임 확인 요청을 이번에는 firebase가 대체하게 되는 것이다.
(왜 그 앱 들어가면 구글에서 뭐 승인할거냐고 뜨는 하얀색 화면 그거 말하는 거다)
Firebase인증 제공업체로는 google/apple/google play game/facebook/github/twitter 등이 있다
1.Firebase 프로젝트를 추가하기 위해, 맨 오른쪽 상단에 있는 [콘솔로 이동] 버튼 클릭!
xcode 프로젝트와 firebase 연결하기
2.콘솔로 이동한 후, 프로젝트 추가(십자버튼) 클릭
3.프로젝트 이름 입력->계속, 애널리시스(데이터 분석)과정은 아직 필요 없다->설정 끄고 만들기
4.새 프로젝트가 준비 되었다는 알람이 뜨면 계속->프로젝트 추가 완료
5.해당 프로젝트에서 ‘앱에 Firebase를 추가하여 시작하기’ 문구 밑에 있는 ios 원형 버튼을 클릭
그럼 이런 화면이 나오는데, ios 번들 ID는 우리의 프로젝트에서
설정으로 들어가면 identity - Bundle Identifier에 있다
복사 후 붙여넣기
기타 항목을 채우고, 앱 등록하기 버튼을 누르면
plist 다운로드 화면이 나온다.
이 plist를 다운로드 한 후에, 우리의 xcode 프로젝트에 info.plist 아래에 추가한다.
그 다음에는 Firebase sdk를 설치한다
우리의 프로젝트 폴더에서 새로운 터미널을 연다
pod init
입력
그러면 우리의 프로젝트 폴더 내에 podfile이 탄생하는데
podfile 내부의
Pods for ~App
밑에
pod ‘Firebase/Auth’
를 추가
저장한 후, 터미널로 돌아가 pod install 추가 입력
그럼 sdk에 소속된 것들이 Install된다
다시 폴더로 돌아가면 workspace 파일이 새로 생겨있는데
앞으로는 이곳에서 작업 해야한다.
AppDelegate.swift 파일로 가서
import Firebase
그리고
didFinishLaunchingWithOptions 메소드 내부에
FirebaseApp.conFigure()
를 추가해주면 초기화가 완료된다
그럼 연결 끝!!
댓글남기기