SlideShare une entreprise Scribd logo
1  sur  8
Télécharger pour lire hors ligne
NEXTERS 6주차
OkHttp
8기 개발자 권기호.
지난 3주차에 Retrofit(or OkHttp)와 비슷한 통신모듈인 HttpRequest를 이용하여 서버와 통신
하는 방법을 알아봤습니다. 이번 세션에서는 Retrofit2을 설명하려 했지만, Retrofit2 오픈 소스를
열어보니 대부분 OkHttp3.*의 기능을 wrap해 놓은 것이기 때문에 OkHttp로 세션주제를 변경했습
니다. (좀 더 도움이 되는 방향으로 해야 하니까!)
또한 OkHttp를 공부하며 모든 부분을 알려드리고 싶었지만 주어진 시간 내에 모든 클래스를 분
해해서 함께 이야기 나누기에는 시간이 부족함을 느꼈습니다. 그래서 핵심적인 부분인 GET 방식
만 보고 갈 예정입니다. 아! 많은 분들이 OkHttp를 이야기하면 OkHttp는 클래스 이름으로 많이
인식하고 계시는 것 같습니다. 하지만 OkHttp는 패키지 이름이며, OkHttpClient가 핵심 클래스인
것을 알려드립니다~!
지금부터 공부할 OkHttp3.*의 Request Process 관련 Class
1. Request + Request.Builder(Nested)
2. OkHttpClient + OkHttpClient.Builder(Nested)
3. Response + Response.Builder(Nested)
OkHttp를 사용하여 서버와 통신을 하기 위해선 최소 이 3개의 클래스에 대해서 꼭 이해하셔
야 합니다. 이번 세션에서는 이 세 개의 클래스를 설명해드릴 예정입니다. 아! 세 클래스 모두
Builder 패턴이 적용되어 Builder라는 Nested Class를 포함하고 있습니다.
1. Request+Request.Builder(Nested)
Request 클래스는 String 타입의 method, Object 타입의 tag를 비롯하여 OkHttp3 패키지의
HttpUrl, Headers, RequestBody 세 가지 클래스를 멤버 필드로 가지고 있습니다.
여기에서 HttpUrl을 보면서 두 가지의 신기한 점이 있었습니다 기존에 우리가 알고 있는 정보
는 HTTP 프로토콜은 80번 포트를 사용하고 있다는 것을 다들 알고 있으셨을 텐데요. 그럼 HTTPS
는 몇 번 포트를 사용할까요? 바로 443번 포트를 이용합니다. 평소 브라우저에서 URL을 이용하여
HTTPS Request을 보내도 443번 포트를 작성하지 않아도 요청이 잘 날라갔는데요. HTTP over SSL
의 port로써 TCP에서만 사용 가능한 포트번호라 하네요. 또한 HttpUrl 클래스도 java.net.URL 클래
스를 wrap하여 만든 클래스입니다. 이 점은 HttpRequest와 비슷한 부분이 많죠?
더불어 Headers와 RequestBody는 이름에서 알 수 있듯이 Request의 정보를 볼 수 있도록 지
원해주는 클래스입니다.
2. OkHttpClient +OkHttpClient.Builder
저는 이 클래스가 OkHttp의 핵심 모듈이 아닐까 생각합니다. OkHttpClient는 실행 준비가 된
call들을 위한 Factory로 HTTP 요청들을 보내고 이 요청들에 대한 응답을 듣는 데 사용되기 때문
입니다.
OkHttpClient 클래스(이하 OkHttpClient)는 public null constructor와 Override된 private
constructor를 가지고 있습니다. 때문에 public null constructor를 이용하여 OkHttpClient객체를 생
성해야 하는데 이 때 Builder에 지정되어있는 default value로 객체를 생성하게 됩니다.
이렇게 생성되는 OkHttpClient는 프로그램 내 모든 HTTP call들을 위한 단일 객체로 사용하기를
OkHttp3.* 스펙에서 권장하고 있습니다. OkHttpClient의 멤버 중 Connection Pool과 Thread Pool
을 가지고 있는데 클라이언트가 각각의 요청마다 새로운 OkHttpClient를 생성하게 되면 많은 시
간과 메모리를 잡아먹기 때문이죠.
서버와 통신하기 전 설정해줘야 하는 값들이 있었던 개발자 분들은 Retorofiit2.*에서
interceptor 를 등록했었던 경험이 있으실 겁니다. OkHttpClient는 Interceptor와
NetworkInterceptor 를 등록할 수 있습니다. (OkHttp의 기능이였네요!)
OkHttpClient는 customize를 할 수 있도록 자체적으로 newBuilder() 메소드를 제공합니다. 이는
싱글톤 패턴이 적용되어 있는 OkHttpClient에 Connection pool, Thread pool, configuration을 유연
하게 공유할 수 있도록 지원해 줍니다. (default로 지정되어 있는 timeout - 1000ms를 변경할 수
도 있습니다!)
OkHttpClient는 요청을 전송하기 위해선 okhttp3패키지의 Dispatcher클래스(이하 Dispatcher)가
필요합니다. Dispatcher는 각 요청마다 비동기적으로 요청을 전송하라는 정책이 있습니다.(안드로
이드의 특화 구현되어 있기 때문이죠 출처-D2) 각각의 Dispatcher는 내부적으로
java.util.concurrent.ExecutorService 클래스를 사용합니다. Dispatcher는 조금 생소한 자료구조
Deque(덱 - Queue에서 앞/뒤로 데이터를 삽입/삭제 할 수 있는 자료구조를)을 사용하여 각각의
요청객체를 저장합니다. Dispatcher의 default Request는 64번으로 지정되어 있습니다.(2의 제곱거
듭제곱! 싱기방기?)
Dispatcher를 이용하여 최종적으로 요청을 보내기 위해선 RealCall 클래스가 필요합니다.(RealCall
클래스는 API에 존재하지 않음.) 클래스의 이름답게 실제로 요청이 이루어지는 클래스죠.
RealCall클래스에 execute메소드는 사용자의 요청을 보내기 전에 설정해 주었던 Interceptor를 설
정해 주고 Resposne객체를 Return 받는 역할을 합니다.
이 과정에서 RecalInterceptorChain클래스를 생성하고, 해당 클래스의 preceed()메소드를 호출하여
Response 객체를 리턴 받습니다.
이 부분을 클래스다이어그램으로 나타나면 다음과 같습니다. 메소드는 생략했으며 꼭 알아야 할
3개의 클래스와 더불어 실제 Request를 전송하고 Response를 받는 클래스들의 멤버필드만 표기
했습니다.
사용법
Request 클래스는 Builder 디자인패턴이 적용되어 있기 때문에 new RequestBuilder() 로 접근해야
합니다. 또한 setUrl()메소드가 존재하지 않기 때문에 url(url : String) 메소드를 호출하여 url을
setting해줍니다. (전달인자를 java.net.URL로 넣어줘도 됩니다.) 이 과정에서 CacheControl을 설정
해 주거나 Header정보를 설정해 주는 등. 간단한 세팅을 해줄 수 있습니다.
이렇게 만들어진 request객체를 OkHttpRequest의 Call객체(구현체 – RecalCall)를 만들며 Response
의 콜백을 등록합니다. 또한 enqueuer 해주는 작업에서 내부적으로 ThreadPoolExecutor의 worker
Thread에게 요청을 떠맡기게 됩니다.
Request
-url: HttpUrl
-method: String <<default : get>>
-headers: Headers
-body: RequestBody
-tag: Object Request.Builder
<<static,nested>>
OkHttpClient
~dispatcher: Dispatcher
~proxy: Proxy
~protocals: List<Protocals>
~interceptors: List<Interceptor>
~networkInterceptors: List<interceptor>
~proxySelector: ProxySelector
~cookieJar: CookieJar
~cache: Cache
~internalCache: InternalCache
~socketFactory: SocketFactory
~certificationChainCleaner: CertificateChainCleaner
~hostnameVerifier: HostnameVerifier
~certificatePinner: CertificatePinner
~proxyAuthenticator: Authenticator
~authenticator: Authenticator
~connectionPool: ConnectionPool
~dns: DNS
Response
-request: Request
-protocal: Protocol
-code: int
-message: String
-handshake: Handshake
-headers: Headers
-body: ResponseBody
-networkResponse: Response
-cacheResponse: Response
-priorResponse: Response
-sentRequestAtMillis: long
-receivedResponseAtMillis: long
-cacheControl: CacheControl
Dispatcher
-maxRequests: int <<default:64>>
-maxRequestPerHost: int <<default:5>>
-idleCallback: Runnable
-executorService: ExecutorService
-readyAsyncCalls: Deque<AsyncCall>
-runningAsyncCalls: Deque<AsyncCall>
-runningSyncCalls: Dequeue<RealCall>
OkHttpClient.Builder
<<static,nested>>
RealCall
-client: OkHttpClient
-retryAndFollowUpInterceptor: RetryAndFollowUpInterceptor
RetryAndFollowUpInterceptor
Response.Builder
okhttp3.Call
<<interface>>
RequestBody
ResponseBody
요청에 대한 응답코드가 200,300번일 경우 onResponse 메소드가 호출됩니다. onResponse메소드
의 전달인자 중 Response 객체가 있는데요. 이 객체를 이용하여 많은 행동을 할 수 있습니다. (자
세하신건 API를 읽어주시길 원합니다)
.
안드로이드에서 UI Thread가 아닌 다른 Thread에서 UI의 data를 handling할 경우 Exception이 발
생하니 runOnUiThread()를 호출해야 하는 건 상식이죠!
감사합니다.

Contenu connexe

Tendances

5-5. html5 connectivity
5-5. html5 connectivity5-5. html5 connectivity
5-5. html5 connectivityJinKyoungHeo
 
파이썬 웹프로그래밍 1탄
파이썬 웹프로그래밍 1탄 파이썬 웹프로그래밍 1탄
파이썬 웹프로그래밍 1탄 SeongHyun Ahn
 
ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!WooYoung Cho
 
Ajax 기술문서 - 김연수
Ajax 기술문서 - 김연수Ajax 기술문서 - 김연수
Ajax 기술문서 - 김연수Yeon Soo Kim
 
헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리은숙 이
 
막하는 스터디 첫 번째 만남 Node.js
막하는 스터디 첫 번째 만남 Node.js막하는 스터디 첫 번째 만남 Node.js
막하는 스터디 첫 번째 만남 Node.js연웅 조
 
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기흥배 최
 
[1B6]Realm a database for android & ios
[1B6]Realm a database for android & ios[1B6]Realm a database for android & ios
[1B6]Realm a database for android & iosNAVER D2
 
JSP 빠르게 시작하기
JSP 빠르게 시작하기JSP 빠르게 시작하기
JSP 빠르게 시작하기Park JoongSoo
 
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - java OOM, Reference API
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - java OOM, Reference API[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - java OOM, Reference API
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - java OOM, Reference APINAVER D2
 
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...탑크리에듀(구로디지털단지역3번출구 2분거리)
 
Startup JavaScript 9 - Socket.IO 실시간 통신
Startup JavaScript 9 - Socket.IO 실시간 통신Startup JavaScript 9 - Socket.IO 실시간 통신
Startup JavaScript 9 - Socket.IO 실시간 통신Circulus
 
[Windows via c/c++] 4장 프로세스
[Windows via c/c++] 4장 프로세스[Windows via c/c++] 4장 프로세스
[Windows via c/c++] 4장 프로세스종빈 오
 
IT 일반기술 강의자료_ed10
IT 일반기술 강의자료_ed10IT 일반기술 강의자료_ed10
IT 일반기술 강의자료_ed10hungrok
 
Jdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicJdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicknight1128
 
[162] jpa와 모던 자바 데이터 저장 기술
[162] jpa와 모던 자바 데이터 저장 기술[162] jpa와 모던 자바 데이터 저장 기술
[162] jpa와 모던 자바 데이터 저장 기술NAVER D2
 

Tendances (20)

Anatomy of Realm
Anatomy of RealmAnatomy of Realm
Anatomy of Realm
 
5-5. html5 connectivity
5-5. html5 connectivity5-5. html5 connectivity
5-5. html5 connectivity
 
파이썬 웹프로그래밍 1탄
파이썬 웹프로그래밍 1탄 파이썬 웹프로그래밍 1탄
파이썬 웹프로그래밍 1탄
 
ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!
 
Ajax 기술문서 - 김연수
Ajax 기술문서 - 김연수Ajax 기술문서 - 김연수
Ajax 기술문서 - 김연수
 
헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리헷갈리는 자바스크립트 정리
헷갈리는 자바스크립트 정리
 
막하는 스터디 첫 번째 만남 Node.js
막하는 스터디 첫 번째 만남 Node.js막하는 스터디 첫 번째 만남 Node.js
막하는 스터디 첫 번째 만남 Node.js
 
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
 
게이트단의 보안
게이트단의 보안게이트단의 보안
게이트단의 보안
 
[1B6]Realm a database for android & ios
[1B6]Realm a database for android & ios[1B6]Realm a database for android & ios
[1B6]Realm a database for android & ios
 
JSP 빠르게 시작하기
JSP 빠르게 시작하기JSP 빠르게 시작하기
JSP 빠르게 시작하기
 
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - java OOM, Reference API
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - java OOM, Reference API[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - java OOM, Reference API
[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - java OOM, Reference API
 
Gcd ppt
Gcd pptGcd ppt
Gcd ppt
 
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
#17.스프링프레임워크 & 마이바티스 (Spring Framework, MyBatis)_국비지원IT학원/실업자/재직자환급교육/자바/스프링/...
 
Startup JavaScript 9 - Socket.IO 실시간 통신
Startup JavaScript 9 - Socket.IO 실시간 통신Startup JavaScript 9 - Socket.IO 실시간 통신
Startup JavaScript 9 - Socket.IO 실시간 통신
 
4-1. javascript
4-1. javascript4-1. javascript
4-1. javascript
 
[Windows via c/c++] 4장 프로세스
[Windows via c/c++] 4장 프로세스[Windows via c/c++] 4장 프로세스
[Windows via c/c++] 4장 프로세스
 
IT 일반기술 강의자료_ed10
IT 일반기술 강의자료_ed10IT 일반기술 강의자료_ed10
IT 일반기술 강의자료_ed10
 
Jdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamicJdk(java) 7 - 5. invoke-dynamic
Jdk(java) 7 - 5. invoke-dynamic
 
[162] jpa와 모던 자바 데이터 저장 기술
[162] jpa와 모던 자바 데이터 저장 기술[162] jpa와 모던 자바 데이터 저장 기술
[162] jpa와 모던 자바 데이터 저장 기술
 

Similaire à [D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp

Introduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&CIntroduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&Csys4u
 
[Hello world 오픈세미나]open api client개발
[Hello world 오픈세미나]open api client개발[Hello world 오픈세미나]open api client개발
[Hello world 오픈세미나]open api client개발NAVER D2
 
Spring MVC
Spring MVCSpring MVC
Spring MVCymtech
 
파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 Yong Joon Moon
 
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기NAVER Engineering
 
[스프링 스터디 1일차] 템플릿
[스프링 스터디 1일차] 템플릿[스프링 스터디 1일차] 템플릿
[스프링 스터디 1일차] 템플릿AnselmKim
 
[스프링 스터디 3일차] @MVC
[스프링 스터디 3일차] @MVC[스프링 스터디 3일차] @MVC
[스프링 스터디 3일차] @MVCAnselmKim
 
PHP 7의 새로운 특징과 기능 요약
PHP 7의 새로운 특징과 기능 요약PHP 7의 새로운 특징과 기능 요약
PHP 7의 새로운 특징과 기능 요약정아 손
 
[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성NAVER D2
 
android_thread
android_threadandroid_thread
android_threadhandfoot
 
HTTP 완벽가이드- 19장 배포시스템
HTTP 완벽가이드- 19장 배포시스템HTTP 완벽가이드- 19장 배포시스템
HTTP 완벽가이드- 19장 배포시스템박 민규
 
Multi-thread : producer - consumer
Multi-thread : producer - consumerMulti-thread : producer - consumer
Multi-thread : producer - consumerChang Yoon Oh
 
이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)익성 조
 
Catalyst Framework 살펴보기
Catalyst Framework 살펴보기Catalyst Framework 살펴보기
Catalyst Framework 살펴보기corund
 
CRUD Pattern in Ajax
CRUD Pattern in AjaxCRUD Pattern in Ajax
CRUD Pattern in AjaxRhio Kim
 
파이썬 웹 프로그래밍 2탄
파이썬 웹 프로그래밍 2탄 파이썬 웹 프로그래밍 2탄
파이썬 웹 프로그래밍 2탄 SeongHyun Ahn
 
신입 웹 개발자 포트폴리오 / 댓글 게시판
신입 웹 개발자 포트폴리오 / 댓글 게시판신입 웹 개발자 포트폴리오 / 댓글 게시판
신입 웹 개발자 포트폴리오 / 댓글 게시판hyeonjae Cheon
 
Netty 세미나
Netty 세미나Netty 세미나
Netty 세미나Jang Hoon
 

Similaire à [D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp (20)

Introduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&CIntroduction to Fork Join Framework_SYS4U I&C
Introduction to Fork Join Framework_SYS4U I&C
 
react-ko.pdf
react-ko.pdfreact-ko.pdf
react-ko.pdf
 
[Hello world 오픈세미나]open api client개발
[Hello world 오픈세미나]open api client개발[Hello world 오픈세미나]open api client개발
[Hello world 오픈세미나]open api client개발
 
Spring MVC
Spring MVCSpring MVC
Spring MVC
 
파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 파이썬 플라스크 이해하기
파이썬 플라스크 이해하기
 
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
[TECHCON 2019: MOBILE - Android]2.예제에서는 알려주지 않는 Model 이야기
 
[스프링 스터디 1일차] 템플릿
[스프링 스터디 1일차] 템플릿[스프링 스터디 1일차] 템플릿
[스프링 스터디 1일차] 템플릿
 
HTTP web server 구현
HTTP web server 구현HTTP web server 구현
HTTP web server 구현
 
[스프링 스터디 3일차] @MVC
[스프링 스터디 3일차] @MVC[스프링 스터디 3일차] @MVC
[스프링 스터디 3일차] @MVC
 
PHP 7의 새로운 특징과 기능 요약
PHP 7의 새로운 특징과 기능 요약PHP 7의 새로운 특징과 기능 요약
PHP 7의 새로운 특징과 기능 요약
 
[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성[2D4]Python에서의 동시성_병렬성
[2D4]Python에서의 동시성_병렬성
 
android_thread
android_threadandroid_thread
android_thread
 
HTTP 완벽가이드- 19장 배포시스템
HTTP 완벽가이드- 19장 배포시스템HTTP 완벽가이드- 19장 배포시스템
HTTP 완벽가이드- 19장 배포시스템
 
Multi-thread : producer - consumer
Multi-thread : producer - consumerMulti-thread : producer - consumer
Multi-thread : producer - consumer
 
이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)
 
Catalyst Framework 살펴보기
Catalyst Framework 살펴보기Catalyst Framework 살펴보기
Catalyst Framework 살펴보기
 
CRUD Pattern in Ajax
CRUD Pattern in AjaxCRUD Pattern in Ajax
CRUD Pattern in Ajax
 
파이썬 웹 프로그래밍 2탄
파이썬 웹 프로그래밍 2탄 파이썬 웹 프로그래밍 2탄
파이썬 웹 프로그래밍 2탄
 
신입 웹 개발자 포트폴리오 / 댓글 게시판
신입 웹 개발자 포트폴리오 / 댓글 게시판신입 웹 개발자 포트폴리오 / 댓글 게시판
신입 웹 개발자 포트폴리오 / 댓글 게시판
 
Netty 세미나
Netty 세미나Netty 세미나
Netty 세미나
 

Plus de NAVER D2

[211] 인공지능이 인공지능 챗봇을 만든다
[211] 인공지능이 인공지능 챗봇을 만든다[211] 인공지능이 인공지능 챗봇을 만든다
[211] 인공지능이 인공지능 챗봇을 만든다NAVER D2
 
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...NAVER D2
 
[215] Druid로 쉽고 빠르게 데이터 분석하기
[215] Druid로 쉽고 빠르게 데이터 분석하기[215] Druid로 쉽고 빠르게 데이터 분석하기
[215] Druid로 쉽고 빠르게 데이터 분석하기NAVER D2
 
[245]Papago Internals: 모델분석과 응용기술 개발
[245]Papago Internals: 모델분석과 응용기술 개발[245]Papago Internals: 모델분석과 응용기술 개발
[245]Papago Internals: 모델분석과 응용기술 개발NAVER D2
 
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈NAVER D2
 
[235]Wikipedia-scale Q&A
[235]Wikipedia-scale Q&A[235]Wikipedia-scale Q&A
[235]Wikipedia-scale Q&ANAVER D2
 
[244]로봇이 현실 세계에 대해 학습하도록 만들기
[244]로봇이 현실 세계에 대해 학습하도록 만들기[244]로봇이 현실 세계에 대해 학습하도록 만들기
[244]로봇이 현실 세계에 대해 학습하도록 만들기NAVER D2
 
[243] Deep Learning to help student’s Deep Learning
[243] Deep Learning to help student’s Deep Learning[243] Deep Learning to help student’s Deep Learning
[243] Deep Learning to help student’s Deep LearningNAVER D2
 
[234]Fast & Accurate Data Annotation Pipeline for AI applications
[234]Fast & Accurate Data Annotation Pipeline for AI applications[234]Fast & Accurate Data Annotation Pipeline for AI applications
[234]Fast & Accurate Data Annotation Pipeline for AI applicationsNAVER D2
 
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load BalancingOld version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load BalancingNAVER D2
 
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지NAVER D2
 
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기NAVER D2
 
[224]네이버 검색과 개인화
[224]네이버 검색과 개인화[224]네이버 검색과 개인화
[224]네이버 검색과 개인화NAVER D2
 
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)NAVER D2
 
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기NAVER D2
 
[213] Fashion Visual Search
[213] Fashion Visual Search[213] Fashion Visual Search
[213] Fashion Visual SearchNAVER D2
 
[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화NAVER D2
 
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지NAVER D2
 
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터NAVER D2
 
[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?NAVER D2
 

Plus de NAVER D2 (20)

[211] 인공지능이 인공지능 챗봇을 만든다
[211] 인공지능이 인공지능 챗봇을 만든다[211] 인공지능이 인공지능 챗봇을 만든다
[211] 인공지능이 인공지능 챗봇을 만든다
 
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
[233] 대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing: Maglev Hashing Scheduler i...
 
[215] Druid로 쉽고 빠르게 데이터 분석하기
[215] Druid로 쉽고 빠르게 데이터 분석하기[215] Druid로 쉽고 빠르게 데이터 분석하기
[215] Druid로 쉽고 빠르게 데이터 분석하기
 
[245]Papago Internals: 모델분석과 응용기술 개발
[245]Papago Internals: 모델분석과 응용기술 개발[245]Papago Internals: 모델분석과 응용기술 개발
[245]Papago Internals: 모델분석과 응용기술 개발
 
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
[236] 스트림 저장소 최적화 이야기: 아파치 드루이드로부터 얻은 교훈
 
[235]Wikipedia-scale Q&A
[235]Wikipedia-scale Q&A[235]Wikipedia-scale Q&A
[235]Wikipedia-scale Q&A
 
[244]로봇이 현실 세계에 대해 학습하도록 만들기
[244]로봇이 현실 세계에 대해 학습하도록 만들기[244]로봇이 현실 세계에 대해 학습하도록 만들기
[244]로봇이 현실 세계에 대해 학습하도록 만들기
 
[243] Deep Learning to help student’s Deep Learning
[243] Deep Learning to help student’s Deep Learning[243] Deep Learning to help student’s Deep Learning
[243] Deep Learning to help student’s Deep Learning
 
[234]Fast & Accurate Data Annotation Pipeline for AI applications
[234]Fast & Accurate Data Annotation Pipeline for AI applications[234]Fast & Accurate Data Annotation Pipeline for AI applications
[234]Fast & Accurate Data Annotation Pipeline for AI applications
 
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load BalancingOld version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
Old version: [233]대형 컨테이너 클러스터에서의 고가용성 Network Load Balancing
 
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
[226]NAVER 광고 deep click prediction: 모델링부터 서빙까지
 
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
[225]NSML: 머신러닝 플랫폼 서비스하기 & 모델 튜닝 자동화하기
 
[224]네이버 검색과 개인화
[224]네이버 검색과 개인화[224]네이버 검색과 개인화
[224]네이버 검색과 개인화
 
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
[216]Search Reliability Engineering (부제: 지진에도 흔들리지 않는 네이버 검색시스템)
 
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
[214] Ai Serving Platform: 하루 수 억 건의 인퍼런스를 처리하기 위한 고군분투기
 
[213] Fashion Visual Search
[213] Fashion Visual Search[213] Fashion Visual Search
[213] Fashion Visual Search
 
[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화[232] TensorRT를 활용한 딥러닝 Inference 최적화
[232] TensorRT를 활용한 딥러닝 Inference 최적화
 
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
[242]컴퓨터 비전을 이용한 실내 지도 자동 업데이트 방법: 딥러닝을 통한 POI 변화 탐지
 
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
[212]C3, 데이터 처리에서 서빙까지 가능한 하둡 클러스터
 
[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?[223]기계독해 QA: 검색인가, NLP인가?
[223]기계독해 QA: 검색인가, NLP인가?
 

[D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - OkHttp

  • 2. 지난 3주차에 Retrofit(or OkHttp)와 비슷한 통신모듈인 HttpRequest를 이용하여 서버와 통신 하는 방법을 알아봤습니다. 이번 세션에서는 Retrofit2을 설명하려 했지만, Retrofit2 오픈 소스를 열어보니 대부분 OkHttp3.*의 기능을 wrap해 놓은 것이기 때문에 OkHttp로 세션주제를 변경했습 니다. (좀 더 도움이 되는 방향으로 해야 하니까!) 또한 OkHttp를 공부하며 모든 부분을 알려드리고 싶었지만 주어진 시간 내에 모든 클래스를 분 해해서 함께 이야기 나누기에는 시간이 부족함을 느꼈습니다. 그래서 핵심적인 부분인 GET 방식 만 보고 갈 예정입니다. 아! 많은 분들이 OkHttp를 이야기하면 OkHttp는 클래스 이름으로 많이 인식하고 계시는 것 같습니다. 하지만 OkHttp는 패키지 이름이며, OkHttpClient가 핵심 클래스인 것을 알려드립니다~!
  • 3. 지금부터 공부할 OkHttp3.*의 Request Process 관련 Class 1. Request + Request.Builder(Nested) 2. OkHttpClient + OkHttpClient.Builder(Nested) 3. Response + Response.Builder(Nested) OkHttp를 사용하여 서버와 통신을 하기 위해선 최소 이 3개의 클래스에 대해서 꼭 이해하셔 야 합니다. 이번 세션에서는 이 세 개의 클래스를 설명해드릴 예정입니다. 아! 세 클래스 모두 Builder 패턴이 적용되어 Builder라는 Nested Class를 포함하고 있습니다. 1. Request+Request.Builder(Nested) Request 클래스는 String 타입의 method, Object 타입의 tag를 비롯하여 OkHttp3 패키지의 HttpUrl, Headers, RequestBody 세 가지 클래스를 멤버 필드로 가지고 있습니다. 여기에서 HttpUrl을 보면서 두 가지의 신기한 점이 있었습니다 기존에 우리가 알고 있는 정보 는 HTTP 프로토콜은 80번 포트를 사용하고 있다는 것을 다들 알고 있으셨을 텐데요. 그럼 HTTPS 는 몇 번 포트를 사용할까요? 바로 443번 포트를 이용합니다. 평소 브라우저에서 URL을 이용하여 HTTPS Request을 보내도 443번 포트를 작성하지 않아도 요청이 잘 날라갔는데요. HTTP over SSL 의 port로써 TCP에서만 사용 가능한 포트번호라 하네요. 또한 HttpUrl 클래스도 java.net.URL 클래 스를 wrap하여 만든 클래스입니다. 이 점은 HttpRequest와 비슷한 부분이 많죠? 더불어 Headers와 RequestBody는 이름에서 알 수 있듯이 Request의 정보를 볼 수 있도록 지 원해주는 클래스입니다.
  • 4. 2. OkHttpClient +OkHttpClient.Builder 저는 이 클래스가 OkHttp의 핵심 모듈이 아닐까 생각합니다. OkHttpClient는 실행 준비가 된 call들을 위한 Factory로 HTTP 요청들을 보내고 이 요청들에 대한 응답을 듣는 데 사용되기 때문 입니다. OkHttpClient 클래스(이하 OkHttpClient)는 public null constructor와 Override된 private constructor를 가지고 있습니다. 때문에 public null constructor를 이용하여 OkHttpClient객체를 생 성해야 하는데 이 때 Builder에 지정되어있는 default value로 객체를 생성하게 됩니다. 이렇게 생성되는 OkHttpClient는 프로그램 내 모든 HTTP call들을 위한 단일 객체로 사용하기를 OkHttp3.* 스펙에서 권장하고 있습니다. OkHttpClient의 멤버 중 Connection Pool과 Thread Pool
  • 5. 을 가지고 있는데 클라이언트가 각각의 요청마다 새로운 OkHttpClient를 생성하게 되면 많은 시 간과 메모리를 잡아먹기 때문이죠. 서버와 통신하기 전 설정해줘야 하는 값들이 있었던 개발자 분들은 Retorofiit2.*에서 interceptor 를 등록했었던 경험이 있으실 겁니다. OkHttpClient는 Interceptor와 NetworkInterceptor 를 등록할 수 있습니다. (OkHttp의 기능이였네요!) OkHttpClient는 customize를 할 수 있도록 자체적으로 newBuilder() 메소드를 제공합니다. 이는 싱글톤 패턴이 적용되어 있는 OkHttpClient에 Connection pool, Thread pool, configuration을 유연 하게 공유할 수 있도록 지원해 줍니다. (default로 지정되어 있는 timeout - 1000ms를 변경할 수 도 있습니다!) OkHttpClient는 요청을 전송하기 위해선 okhttp3패키지의 Dispatcher클래스(이하 Dispatcher)가 필요합니다. Dispatcher는 각 요청마다 비동기적으로 요청을 전송하라는 정책이 있습니다.(안드로 이드의 특화 구현되어 있기 때문이죠 출처-D2) 각각의 Dispatcher는 내부적으로 java.util.concurrent.ExecutorService 클래스를 사용합니다. Dispatcher는 조금 생소한 자료구조 Deque(덱 - Queue에서 앞/뒤로 데이터를 삽입/삭제 할 수 있는 자료구조를)을 사용하여 각각의 요청객체를 저장합니다. Dispatcher의 default Request는 64번으로 지정되어 있습니다.(2의 제곱거 듭제곱! 싱기방기?) Dispatcher를 이용하여 최종적으로 요청을 보내기 위해선 RealCall 클래스가 필요합니다.(RealCall 클래스는 API에 존재하지 않음.) 클래스의 이름답게 실제로 요청이 이루어지는 클래스죠. RealCall클래스에 execute메소드는 사용자의 요청을 보내기 전에 설정해 주었던 Interceptor를 설 정해 주고 Resposne객체를 Return 받는 역할을 합니다.
  • 6. 이 과정에서 RecalInterceptorChain클래스를 생성하고, 해당 클래스의 preceed()메소드를 호출하여 Response 객체를 리턴 받습니다.
  • 7. 이 부분을 클래스다이어그램으로 나타나면 다음과 같습니다. 메소드는 생략했으며 꼭 알아야 할 3개의 클래스와 더불어 실제 Request를 전송하고 Response를 받는 클래스들의 멤버필드만 표기 했습니다. 사용법 Request 클래스는 Builder 디자인패턴이 적용되어 있기 때문에 new RequestBuilder() 로 접근해야 합니다. 또한 setUrl()메소드가 존재하지 않기 때문에 url(url : String) 메소드를 호출하여 url을 setting해줍니다. (전달인자를 java.net.URL로 넣어줘도 됩니다.) 이 과정에서 CacheControl을 설정 해 주거나 Header정보를 설정해 주는 등. 간단한 세팅을 해줄 수 있습니다. 이렇게 만들어진 request객체를 OkHttpRequest의 Call객체(구현체 – RecalCall)를 만들며 Response 의 콜백을 등록합니다. 또한 enqueuer 해주는 작업에서 내부적으로 ThreadPoolExecutor의 worker Thread에게 요청을 떠맡기게 됩니다. Request -url: HttpUrl -method: String <<default : get>> -headers: Headers -body: RequestBody -tag: Object Request.Builder <<static,nested>> OkHttpClient ~dispatcher: Dispatcher ~proxy: Proxy ~protocals: List<Protocals> ~interceptors: List<Interceptor> ~networkInterceptors: List<interceptor> ~proxySelector: ProxySelector ~cookieJar: CookieJar ~cache: Cache ~internalCache: InternalCache ~socketFactory: SocketFactory ~certificationChainCleaner: CertificateChainCleaner ~hostnameVerifier: HostnameVerifier ~certificatePinner: CertificatePinner ~proxyAuthenticator: Authenticator ~authenticator: Authenticator ~connectionPool: ConnectionPool ~dns: DNS Response -request: Request -protocal: Protocol -code: int -message: String -handshake: Handshake -headers: Headers -body: ResponseBody -networkResponse: Response -cacheResponse: Response -priorResponse: Response -sentRequestAtMillis: long -receivedResponseAtMillis: long -cacheControl: CacheControl Dispatcher -maxRequests: int <<default:64>> -maxRequestPerHost: int <<default:5>> -idleCallback: Runnable -executorService: ExecutorService -readyAsyncCalls: Deque<AsyncCall> -runningAsyncCalls: Deque<AsyncCall> -runningSyncCalls: Dequeue<RealCall> OkHttpClient.Builder <<static,nested>> RealCall -client: OkHttpClient -retryAndFollowUpInterceptor: RetryAndFollowUpInterceptor RetryAndFollowUpInterceptor Response.Builder okhttp3.Call <<interface>> RequestBody ResponseBody
  • 8. 요청에 대한 응답코드가 200,300번일 경우 onResponse 메소드가 호출됩니다. onResponse메소드 의 전달인자 중 Response 객체가 있는데요. 이 객체를 이용하여 많은 행동을 할 수 있습니다. (자 세하신건 API를 읽어주시길 원합니다) . 안드로이드에서 UI Thread가 아닌 다른 Thread에서 UI의 data를 handling할 경우 Exception이 발 생하니 runOnUiThread()를 호출해야 하는 건 상식이죠! 감사합니다.