SlideShare uma empresa Scribd logo
1 de 15
Baixar para ler offline
1
NEXTERS 3주차
8기 개발자 권기호.
2
목차
1. 서론………………………………………………………………………………………………………………………………….3
2. HttpRequest 시작하기…………………………………………………………………………………………………….4
HttpRequest 를 이용한 코드작성……………………………………………………………………………………6
GET……………………………………………………………………………………………………………………………………6
최종코드…………………………………………………………………………………………………………………………..9
3. HttpRequest 의 UML……………………………………………………………………………………………………….10
4. 세션 유지하기………………………………………………………………………………………………………………….11
SharedPreferences…………………………………………………………………………………………………………11
SharedPreferences 사용법……………………………………………………………………………………….…...12
실전코드……………………………………………………………………………………………………………………..…13
5. 끝내며…………………………………………………………………………………………………………………………...15
3
서론
Android 환경에서 서버와 통신을 해야 하는 경우가 종종 있습니다. 넥스터즈 개발자분
들은 어떤 모듈을 사용하여 서버와 통신하시나요?
제가 처음 맞이했던 API는 Apache의 HttpClient였어요! 그래서 이번 3주차 활동에서는
Apache의 HttpClient를 이용한 서버와 통신하는 원리, 사용 방법 등을 알려드리고 싶었는
데... 오랜만에 보니…
* deprecated…. 가슴이 아프네요…
그러므로 이번 주는 HttpClient에서 HttpRequest로 주제가 변경되었습니다.
***
그래도 혹시 사용해보고 싶으신 분들이 있을 것 같아 몇몇 자료를 첨부합니다!
HttpClient를 사용하기 위해선 먼저 API를 설치해야 합니다. 아래 링크로 이동하여 소스를
다운로드 합시다. (전 4.5.2버전 사용합니다.)
아! 혼자 공부하시는 분들을 위하여 API 문서 링크를 따로 첨부했습니다.
다운로드 링크 http://hc.apache.org/downloads.cgi
API 문서 링크 https://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/
튜토리얼 링크 %다운로드경로%httpcomponents-client-4.5.2tutorialpdf
Gradle android { useLibrary ‘org.apache.http.legaccy’ } 추가
dependencies { compile group: ‘org.apache.httpcomponents’ , name:
‘httpclient-android’, version: ‘4.3.5.1’ } 추가
4
HttpRequest 시작하기
처음부터 코드를 보기보단 조금 이론적인 부분을 보고 가는 것이 좋겠죠?
Hyper-Text Transfer Protocol(HTTP)은 오늘날 인터넷에서 사용되는 가장 중요한 프로토
콜입니다. (다 아는 사실이죠) HTTP에 사용하는 여러 가지 메소드가 있습니다. HTTP/1.0 스
펙에 기재되어 있는 요청 방법에는 GET, HEAD, POST 방ㅇ식이 있으며 1.1 스펙에서 추가
된 PUT, DELETE, TRACE 방식이 있습니다. (다음 링크에 HTTP/1.1 스펙이 잘 설명되어 있네
요. – mindseye.tistory.com/145 )
우리는 서버의 자원을 어떻게 사용하는지에 따라 GET, POST 방식를 많이 사용합니다.
GET 방식은 “서버의 자원을 가져올 때 사용”합니다. 더 정확히는 한 트랜잭션이 진행되면
서 동기화 이슈를 불러 일으키지 않는 선에서만 사용됩니다. GET 방식의 사용법을 정확히
알게 되는 오늘은 서버의 자원을 가져올 때만 사용하는 것이 아니라 ‘한 트랜잭션에 대해
서 동기화 이슈에 위반되지 않을 경우’에 사용하면 됩니다. (GET 방식을 쓸 때 다양한 이
슈들이 존재합니다. 쿼리 스트링에 제한이 있기도 하죠!! 보안적인 문제도 있고~ㅋ 하지
만 웹 브라우저가 쿠키를 거부한다면…? 즉 스크릿 모드라면..? 등등? 이에 대해 고민하는
것은 여러분의 몫! )
POST는 1.1스펙에 멱등 방식이 아닌, 즉 정확한 트래잭션을 가지고 있는 방식입니다.
그래서 GET방식과 다르게 POST는 동기화 이슈에서 안전합니다(Thread safe). 그렇기 때문
에 서버에 데이터를 insert, update, delete의 요청을 할 때에 POST 방식을 이용합니다.
이와 같이 HttpRequest는 이 요청 방식들과 관련된 get, post, head, put 등 모든 메소드
들을 정적(static)으로 제공합니다! HttpRequest를 new 하지 않고도 사용할 수 있는 것이
죠~! 멋있어… 더 자세한 내용은 다음 페이지에서 설명하겠습니다.
HttpRequest는 모두들 “단 하나만의 클래스이며, 무척 가볍다”라고 이야기를 합니다. 저
는 “무척 가볍다”라는 말에는 동의하지만 단 하나의 클래스라는 말에는 동의하지 않습니
다. 외부에서 보기엔 단 하나의 클래스인건 맞지만 단 하나의 클래스 속에 여러 개의 정
적 네스티드 클래스(nested class)와 인터페이스(interface)가 정의되어 있기 때문이죠.
참고로 소스를 확인해보시면 아시겠지만, HttpRequest는 java.net 패키지의
5
HttpURLConnection을 기반으로 하여 작동합니다. 이를 개발한 팀 역시
HttpURLConnection을 사용하는 Android 개발자들을 위하여 혹은 가벼운 성능의 HTTP
요청을 전송하는 개발자들을 위해 개발했습니다.
6
HttpRequest를 이용한 코드 작성
HttpRequest는 여러 개의 네스티드 클래스와 인터페이스를 가지고 있습니다. 여러 개의
네스티드 클래스 중 제가 관심 있게 보고 있는 인터페이스가 있습니다. 바로
ConnectionFactory라는 인터페이스인데요~!! 이 인터페이스는 HttpRequest가 내부적으로
빌더(Builder) 디자인 패턴을 적용시키기 위하여 설계되어 있습니다. 또한 내부적으로 URL
클래스의 openConnection메소드를 호출하는 등 여러 모로 관심 덩어리입니다.
ConnectionFactory interface는 2개의 추상 메소드를 가지고 있고, 자기 자신을 구현한
멤버필드를 가지고 있습니다. (인터페이스에 싱글톤을 적용시켰네요!) HttpRequest 서버로
요청을 보낼 때 마다 새로운 HttpURLConnection을 생성합니다~!
이런 특별한 구조로 HttpRequest는 HTTP의 다양한 요청 방식을 구현해냅니다.
HttpRequest를 파헤쳐 보는 것은 또한 여러분의 몫입니다. 다음 링크에서 소스를 확인해
보세요!(링크)
이제 그 요청 방식들 중 HttpRequest를 이용하여 어떻게 GET 방식의 요청을 하는지 알
아봅시다.
GET
다음과 같이 URL을 설정해준 뒤, HttpRequest에 사용할 요청방식 GET을 나타내는 get
메소드를 호출합니다. HttpRequest에 포함되어 있는 HTTP 요청 방식 메소드들은 모두
static 메소드이므로, 따로 HttpRequest 인스턴스를 생성할 필요가 없습니다.
get 메소드 내부에선 HttpRequest 객체를 생성해서 리턴해줍니다.
7
HttpRequest는 메소드 전달 인자가 두 개 있습니다. 첫 번째 인자는 요청을 보낼 URL,
두 번째 인자는 요청에 사용할 메소드입니다. (여기에서 java.net 패키지의 URL클래스를
사용합니다.)
HttpRequest 객체 생성이 완료되었습니다. 이렇게 생성된 HttpRequest 객체는 서버로
요청을 보낼 모든 준비가 완료된 ‘준비된 객체’입니다.
이제 이 준비된 객체를 서버로 요청을 보내기 위해선 응답(response)을 받을 수 있는 메
소드를 호출하면 됩니다.
위 그림에선 code()메소드를 호출했습니다. code()내부에선 getConnection()메소드를 호출
합니다.
getConnection()메소드는 createConnection()메소드를 호출하네요? 이 메소드는 무엇 인
8
지 따라가보면~!
내부적으로 HttpURLConnection 객체를 생성하는 것을 볼 수 있습니다.
CONNECTION_FACTORY는 ConnectionFactory객체입니다.
이와 같이 응답의 정보에 따라 다양한 메소드를 이용할 수 있습니다. 서버가 보내주는
응답의 Header 정보를 확인하면 됩니다. Response Code를 확인해보는 code() 메소드, 응
답 메시지를 확인하는 body() 메소드, 통신이 성공했는지 확인하는 ok() 메소드가 있습니
다~!! 이렇게 서버의 응답을 확인하는 첫 메소드를 호출하는 순간 서버와 통신이 시작됩
니다. (두 번째부터 호출되는 메소드는 서버와 재 통신하지 않습니다.)
이제 위의 GET 방식과 더불어 POST 방식으로 요청을 전송하는 코드를 확인하겠습니다.
9
최종코드
주의 사항
· 해당하는 메소드들을 첫 번째로 호출할 당시 호출한 위치가 Android의 UI Thread or
runOnUiThread()일 경우 NetworkOnMainThreadException이 발생합니다.
10
· code(), ok()와 같은 메소드들은 첫 요청 이후 여러 번 재 호출해도 되지만 body() 메
소드는 한 번 호출 이후 재호출을 할 경우 IOException이 발생합니다.
· 재 호출이 아니더라도 body() 메소드를 UIThread에서 호출할 경우 IOException이 발
생합니다.
HttpRequest 객체를 이용해서 UIComponent에 직접 데이터를 갱신해 주면 좋지만 모
든 작업은 Worker Thread에서 처리 후, 최종 결과만 UIThread에 전달하시길 권고합니다.
마치며… POST 방식은 다음 장의 세션 유지하기에서 form data 전송과 함께 다시 한 번
더 보겠습니다.
HttpRequest의 UML
아! Multipart 종류들의 메소드들은 HttpRequest.part() 메소드를 사용하시면 됩니다!
Maven Central <dependency>
<groupId>com.github.kevinsawicki</groupId>
<artifactId>http-request</artifactId>
<version>6.0</version>
</dependency>
Not Maven
environment
https://raw.githubusercontent.com/kevinsawicki/http-
request/master/lib/src/main/java/com/github/kevinsawicki/http/HttpRequest.java
HttpRequest API HttpRequest API - http://kevinsawicki.github.io/http-request/apidocs/index.html
11
세션 유지하기
백날 서버랑 통신하는 방법을 배우면 뭐시 중헌디!! 로그인/로그아웃 서비스가 있어야 할
것 아닙니까~!!
그래서 준비했습니다. 안드로이드에서 세션 유지하는 방법!
제가 처음 세션 정보(user code, user name 등)를 SQLLite에 저장한 기억이 있네요.(창피..)
다른 개발자 분들은 어떻게 세션을 유지하셨나요? 다른 개발자 분들의 이야기를 들어보면
DB에 저장하기도 하고, 서버로부터 토큰 값을 받아와서 저장하기도 한답니다. 보통의 데이
터인 경우 DB에 많이들 저장합니다. 하지만 세션 정보는 Android에서 DB에 저장하기엔 너
무 적습니다. 게다가 DB를 이용하자니 코드가 길어지고, 애매한 상황이 발생합니다.
여기에서 API Level1부터 있었던 SharedPreferences를 사용하는겁니다 !!!
처음부터 못 써줘서 미안해.. 내가 못난이지..
SharedPreferences
공식 문서에서 SharedPreferences는 다음과 같이 설명됩니다.
‘SharedPreferences 클래스는 primitive 데이터 타입의 키-밸류 쌍을 저장하고 검색하게 하
는 일반적인 프레임워크를 제공합니다. SharedPreferences를 boolean, float, int, long, string와
같은 primitive 데이터를 저장하는데 이용할 수 있습니다.’
SharedPreferences를 사용하는 방법은 토큰 값을 받아오는 것과 많이 비슷합니다. 서버에
서 사용자의 로그인 인증이 완료되면 서비스 이용에 필요한 사용자의 이름과 몇몇의 정보
를 받고, SharedPreferences는 이를 Application 영역에 File 형태로 데이터를 저장합니다. (아!
안심하셔야 할 점은 어플리케이션을 삭제하면 데이터도 함께 삭제됩니다.)
12
SharedPreferences 사용법
SharedPreference에서는 외우면 되는 것이 2가지 있습니다.
1. Data를 insert(put)할 때만 Editor를 사용한다.
2. insert, update, delete한 후에는 꼭 commit을 한다.
이 두가지만 지키면 끝입니다.
자자 ~! SharedPreferences를 어떻게 생성해서 사용하나! 문법을 보고 코드로 갑시다!
SharedPreferences pref = mContext.getSharedPreferences(PREF_NAME, mContext.MODE_PRIVATE);
SharedPrefernces는 사용중인 context의 정보가 필요합니다. 또한 첫 번째 전달 인자로 넘
겨주는 PREF_NAME은 DB의 Primary key과 비슷하게 파일명과 같은 역할을 합니다.
마지막으로! SharedPreference의 getAll(), getInt() 등의 get<+>() 메소드는 key, defaultValue
의 두 개의 전달 인자가 있습니다. 저장된 데이터 중 key에 해당하는 value가 없을 경우
defaultValue를 리턴하는데요 이 defaultValue는 Boolean 값으로 설정해서 사용하곤 합니다.
또한 해당 key의 value가 리턴하고자 하는 자료형이 아니라면 ClassCastException을 throw
합니다.
13
실전 코드
UI구성
서버 통신 코드
최종코드 부분의 POST와 다른 점이 있다면 Map 자료구조를 사용한 것 입니다. Map 자
14
료구조를 사용하지 않고 send() 메소드를 이용하면 좀 더 간단하게 서버로 데이터를 전송할
수 있습니다. 또한 제가 직접 Wrap한 CustomPreference 클래스가 있습니다. 주석을 포함해
서 Git에 함께 올려놓겠습니다.
서버코드
참 쉽죠잉?
15
끝내며..
위와 같은 내용으로 정기 세션때 이야기를 나눌 예정입니다. 넥스터즈 회원님들은 발표를
먼저 들은 후, 이 발표자료를 이용하여 복습하시면 더욱 좋은 효과가 있을 것이라 생각합니
다.
목차에는 GET 방식만 기재되어 있지만, POST 방식도 기재되어 있습니다. 못 보신 분은 자세
히 읽고 오심을 추천해드립니다.
위 내용과 관련하여 궁금하신 부분이 있으면 새벽도 괜찮으니 문의카톡 남겨주세요~!
사용된 코드 & 도움된 사이트
HttpRequest - https://github.com/kevinsawicki/http-request
HttpRequest API - http://kevinsawicki.github.io/http-request/apidocs/index.html
HttpRequestProject(Android) – https://github.com/KwonGiho/HttpRequestProject
HttpRequestServer(J2EE) - https://github.com/KwonGiho/HttpRequestServer
HTTP1.1스펙 한글판 - mindseye.tistory.com/145
HTTP1.1 스펙 - https://tools.ietf.org/html/rfc2616#section-2.2

Mais conteúdo relacionado

Mais procurados

[Windows via c/c++] 4장 프로세스
[Windows via c/c++] 4장 프로세스[Windows via c/c++] 4장 프로세스
[Windows via c/c++] 4장 프로세스종빈 오
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs기동 이
 
공성대전 C# 사용기
공성대전 C# 사용기공성대전 C# 사용기
공성대전 C# 사용기Myoung-gyu Gang
 
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기흥배 최
 
Windws via c/c++ chapter 6
Windws via c/c++ chapter 6Windws via c/c++ chapter 6
Windws via c/c++ chapter 6SukYun Yoon
 
[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
 
막하는 스터디 첫 번째 만남 Node.js
막하는 스터디 첫 번째 만남 Node.js막하는 스터디 첫 번째 만남 Node.js
막하는 스터디 첫 번째 만남 Node.js연웅 조
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSCirculus
 
스프링 어플리케이션의 문제해결사례와 안티패턴
스프링 어플리케이션의 문제해결사례와 안티패턴스프링 어플리케이션의 문제해결사례와 안티패턴
스프링 어플리케이션의 문제해결사례와 안티패턴Sanghyuk Jung
 
아꿈사 발표 Node JS 프로그래밍 8장
아꿈사 발표 Node JS 프로그래밍 8장아꿈사 발표 Node JS 프로그래밍 8장
아꿈사 발표 Node JS 프로그래밍 8장Woo Yeong Choi
 
[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?NAVER D2
 
진짜기초 Node.js
진짜기초 Node.js진짜기초 Node.js
진짜기초 Node.jsWoo Jin Kim
 
ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!WooYoung Cho
 
안드로이드 DB, 서버 연동하기
안드로이드 DB, 서버 연동하기안드로이드 DB, 서버 연동하기
안드로이드 DB, 서버 연동하기은아 정
 
1.Startup JavaScript - 프로그래밍 기초
1.Startup JavaScript - 프로그래밍 기초1.Startup JavaScript - 프로그래밍 기초
1.Startup JavaScript - 프로그래밍 기초Circulus
 
(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원
(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원
(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원탑크리에듀(구로디지털단지역3번출구 2분거리)
 
[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍NAVER D2
 
[아꿈사/111105] html5 9장 클라이언트측 데이터로 작업하기
[아꿈사/111105] html5 9장 클라이언트측 데이터로 작업하기[아꿈사/111105] html5 9장 클라이언트측 데이터로 작업하기
[아꿈사/111105] html5 9장 클라이언트측 데이터로 작업하기sung ki choi
 

Mais procurados (20)

Anatomy of Realm
Anatomy of RealmAnatomy of Realm
Anatomy of Realm
 
[Windows via c/c++] 4장 프로세스
[Windows via c/c++] 4장 프로세스[Windows via c/c++] 4장 프로세스
[Windows via c/c++] 4장 프로세스
 
Nodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjsNodejs, PhantomJS, casperJs, YSlow, expressjs
Nodejs, PhantomJS, casperJs, YSlow, expressjs
 
공성대전 C# 사용기
공성대전 C# 사용기공성대전 C# 사용기
공성대전 C# 사용기
 
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
KGC 2016 오픈소스 네트워크 엔진 Super socket 사용하기
 
Windws via c/c++ chapter 6
Windws via c/c++ chapter 6Windws via c/c++ chapter 6
Windws via c/c++ chapter 6
 
[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 빠르게 시작하기
 
막하는 스터디 첫 번째 만남 Node.js
막하는 스터디 첫 번째 만남 Node.js막하는 스터디 첫 번째 만남 Node.js
막하는 스터디 첫 번째 만남 Node.js
 
Startup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JSStartup JavaScript 8 - NPM, Express.JS
Startup JavaScript 8 - NPM, Express.JS
 
스프링 어플리케이션의 문제해결사례와 안티패턴
스프링 어플리케이션의 문제해결사례와 안티패턴스프링 어플리케이션의 문제해결사례와 안티패턴
스프링 어플리케이션의 문제해결사례와 안티패턴
 
아꿈사 발표 Node JS 프로그래밍 8장
아꿈사 발표 Node JS 프로그래밍 8장아꿈사 발표 Node JS 프로그래밍 8장
아꿈사 발표 Node JS 프로그래밍 8장
 
[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?[143] Modern C++ 무조건 써야 해?
[143] Modern C++ 무조건 써야 해?
 
진짜기초 Node.js
진짜기초 Node.js진짜기초 Node.js
진짜기초 Node.js
 
ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!ECMAScript 6의 새로운 것들!
ECMAScript 6의 새로운 것들!
 
안드로이드 DB, 서버 연동하기
안드로이드 DB, 서버 연동하기안드로이드 DB, 서버 연동하기
안드로이드 DB, 서버 연동하기
 
1.Startup JavaScript - 프로그래밍 기초
1.Startup JavaScript - 프로그래밍 기초1.Startup JavaScript - 프로그래밍 기초
1.Startup JavaScript - 프로그래밍 기초
 
(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원
(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원
(C#,네트워크강좌)간단한 TCP 클라이언트/서버 구현, 멀티쓰레드 기반 에코우 클라이언트/서버_C추천#/WPF/자마린실무교육학원
 
[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍[1B4]안드로이드 동시성_프로그래밍
[1B4]안드로이드 동시성_프로그래밍
 
[아꿈사/111105] html5 9장 클라이언트측 데이터로 작업하기
[아꿈사/111105] html5 9장 클라이언트측 데이터로 작업하기[아꿈사/111105] html5 9장 클라이언트측 데이터로 작업하기
[아꿈사/111105] html5 9장 클라이언트측 데이터로 작업하기
 

Semelhante a [D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - Http Request

[NEXT] Android 개발 경험 프로젝트 4일차 (Networking)
[NEXT] Android 개발 경험 프로젝트 4일차 (Networking)[NEXT] Android 개발 경험 프로젝트 4일차 (Networking)
[NEXT] Android 개발 경험 프로젝트 4일차 (Networking)YoungSu Son
 
파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 Yong Joon Moon
 
Http2(http2.0,g rpc,cookie,session,idempotent, x forwarded-for)
Http2(http2.0,g rpc,cookie,session,idempotent, x forwarded-for)Http2(http2.0,g rpc,cookie,session,idempotent, x forwarded-for)
Http2(http2.0,g rpc,cookie,session,idempotent, x forwarded-for)진태 이
 
DGMIT 제3회 R&D 컨퍼런스 r&d1 team : HTTP 프로토콜 개요
DGMIT 제3회 R&D 컨퍼런스 r&d1 team : HTTP 프로토콜 개요DGMIT 제3회 R&D 컨퍼런스 r&d1 team : HTTP 프로토콜 개요
DGMIT 제3회 R&D 컨퍼런스 r&d1 team : HTTP 프로토콜 개요dgmit2009
 
Java rmi 개발 가이드
Java rmi 개발 가이드Java rmi 개발 가이드
Java rmi 개발 가이드중선 곽
 
Spring integration을 통해_살펴본_메시징_세계
Spring integration을 통해_살펴본_메시징_세계Spring integration을 통해_살펴본_메시징_세계
Spring integration을 통해_살펴본_메시징_세계Wangeun Lee
 
Internship backend
Internship backendInternship backend
Internship backendYein Sim
 
리스펙토링 세미나 - 웹 브라우저 동작 개념, Node.js를 통한 서버 이해, REST API
리스펙토링 세미나 - 웹 브라우저 동작 개념, Node.js를 통한 서버 이해, REST API리스펙토링 세미나 - 웹 브라우저 동작 개념, Node.js를 통한 서버 이해, REST API
리스펙토링 세미나 - 웹 브라우저 동작 개념, Node.js를 통한 서버 이해, REST APIWooyoung Ko
 
Parse.com 맛보기
Parse.com 맛보기Parse.com 맛보기
Parse.com 맛보기flashscope
 
Node js[stg]onimusha 20140822
Node js[stg]onimusha 20140822Node js[stg]onimusha 20140822
Node js[stg]onimusha 20140822병헌 정
 
JSP 프로그래밍 2014-2018년 기말시험 기출문제
JSP 프로그래밍 2014-2018년 기말시험 기출문제JSP 프로그래밍 2014-2018년 기말시험 기출문제
JSP 프로그래밍 2014-2018년 기말시험 기출문제Lee Sang-Ho
 
CoreDot TechSeminar 2018 - Session2 Ji Donghyun
CoreDot TechSeminar 2018 - Session2 Ji DonghyunCoreDot TechSeminar 2018 - Session2 Ji Donghyun
CoreDot TechSeminar 2018 - Session2 Ji DonghyunCore.Today
 
서버성능개선 류우림
서버성능개선 류우림서버성능개선 류우림
서버성능개선 류우림우림 류
 
막하는스터디 두번째만남 Express(20151025)
막하는스터디 두번째만남 Express(20151025)막하는스터디 두번째만남 Express(20151025)
막하는스터디 두번째만남 Express(20151025)연웅 조
 
JQuery를 이용하여 웹 위젯 작성하기_(주)시스포유아이앤씨
JQuery를 이용하여 웹 위젯 작성하기_(주)시스포유아이앤씨JQuery를 이용하여 웹 위젯 작성하기_(주)시스포유아이앤씨
JQuery를 이용하여 웹 위젯 작성하기_(주)시스포유아이앤씨sys4u
 

Semelhante a [D2 CAMPUS] 안드로이드 오픈소스 스터디자료 - Http Request (20)

[NEXT] Android 개발 경험 프로젝트 4일차 (Networking)
[NEXT] Android 개발 경험 프로젝트 4일차 (Networking)[NEXT] Android 개발 경험 프로젝트 4일차 (Networking)
[NEXT] Android 개발 경험 프로젝트 4일차 (Networking)
 
파이썬 플라스크 이해하기
파이썬 플라스크 이해하기 파이썬 플라스크 이해하기
파이썬 플라스크 이해하기
 
Http2(http2.0,g rpc,cookie,session,idempotent, x forwarded-for)
Http2(http2.0,g rpc,cookie,session,idempotent, x forwarded-for)Http2(http2.0,g rpc,cookie,session,idempotent, x forwarded-for)
Http2(http2.0,g rpc,cookie,session,idempotent, x forwarded-for)
 
DGMIT 제3회 R&D 컨퍼런스 r&d1 team : HTTP 프로토콜 개요
DGMIT 제3회 R&D 컨퍼런스 r&d1 team : HTTP 프로토콜 개요DGMIT 제3회 R&D 컨퍼런스 r&d1 team : HTTP 프로토콜 개요
DGMIT 제3회 R&D 컨퍼런스 r&d1 team : HTTP 프로토콜 개요
 
Java rmi 개발 가이드
Java rmi 개발 가이드Java rmi 개발 가이드
Java rmi 개발 가이드
 
Spring integration을 통해_살펴본_메시징_세계
Spring integration을 통해_살펴본_메시징_세계Spring integration을 통해_살펴본_메시징_세계
Spring integration을 통해_살펴본_메시징_세계
 
Internship backend
Internship backendInternship backend
Internship backend
 
7. html5 api
7. html5 api7. html5 api
7. html5 api
 
리스펙토링 세미나 - 웹 브라우저 동작 개념, Node.js를 통한 서버 이해, REST API
리스펙토링 세미나 - 웹 브라우저 동작 개념, Node.js를 통한 서버 이해, REST API리스펙토링 세미나 - 웹 브라우저 동작 개념, Node.js를 통한 서버 이해, REST API
리스펙토링 세미나 - 웹 브라우저 동작 개념, Node.js를 통한 서버 이해, REST API
 
Parse.com 맛보기
Parse.com 맛보기Parse.com 맛보기
Parse.com 맛보기
 
Node js[stg]onimusha 20140822
Node js[stg]onimusha 20140822Node js[stg]onimusha 20140822
Node js[stg]onimusha 20140822
 
HTTP web server 구현
HTTP web server 구현HTTP web server 구현
HTTP web server 구현
 
Spring portfolio2
Spring portfolio2Spring portfolio2
Spring portfolio2
 
JSP 프로그래밍 2014-2018년 기말시험 기출문제
JSP 프로그래밍 2014-2018년 기말시험 기출문제JSP 프로그래밍 2014-2018년 기말시험 기출문제
JSP 프로그래밍 2014-2018년 기말시험 기출문제
 
CoreDot TechSeminar 2018 - Session2 Ji Donghyun
CoreDot TechSeminar 2018 - Session2 Ji DonghyunCoreDot TechSeminar 2018 - Session2 Ji Donghyun
CoreDot TechSeminar 2018 - Session2 Ji Donghyun
 
4-2. ajax
4-2. ajax4-2. ajax
4-2. ajax
 
서버성능개선 류우림
서버성능개선 류우림서버성능개선 류우림
서버성능개선 류우림
 
Html5
Html5 Html5
Html5
 
막하는스터디 두번째만남 Express(20151025)
막하는스터디 두번째만남 Express(20151025)막하는스터디 두번째만남 Express(20151025)
막하는스터디 두번째만남 Express(20151025)
 
JQuery를 이용하여 웹 위젯 작성하기_(주)시스포유아이앤씨
JQuery를 이용하여 웹 위젯 작성하기_(주)시스포유아이앤씨JQuery를 이용하여 웹 위젯 작성하기_(주)시스포유아이앤씨
JQuery를 이용하여 웹 위젯 작성하기_(주)시스포유아이앤씨
 

Mais 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
 

Mais 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] 안드로이드 오픈소스 스터디자료 - Http Request

  • 2. 2 목차 1. 서론………………………………………………………………………………………………………………………………….3 2. HttpRequest 시작하기…………………………………………………………………………………………………….4 HttpRequest 를 이용한 코드작성……………………………………………………………………………………6 GET……………………………………………………………………………………………………………………………………6 최종코드…………………………………………………………………………………………………………………………..9 3. HttpRequest 의 UML……………………………………………………………………………………………………….10 4. 세션 유지하기………………………………………………………………………………………………………………….11 SharedPreferences…………………………………………………………………………………………………………11 SharedPreferences 사용법……………………………………………………………………………………….…...12 실전코드……………………………………………………………………………………………………………………..…13 5. 끝내며…………………………………………………………………………………………………………………………...15
  • 3. 3 서론 Android 환경에서 서버와 통신을 해야 하는 경우가 종종 있습니다. 넥스터즈 개발자분 들은 어떤 모듈을 사용하여 서버와 통신하시나요? 제가 처음 맞이했던 API는 Apache의 HttpClient였어요! 그래서 이번 3주차 활동에서는 Apache의 HttpClient를 이용한 서버와 통신하는 원리, 사용 방법 등을 알려드리고 싶었는 데... 오랜만에 보니… * deprecated…. 가슴이 아프네요… 그러므로 이번 주는 HttpClient에서 HttpRequest로 주제가 변경되었습니다. *** 그래도 혹시 사용해보고 싶으신 분들이 있을 것 같아 몇몇 자료를 첨부합니다! HttpClient를 사용하기 위해선 먼저 API를 설치해야 합니다. 아래 링크로 이동하여 소스를 다운로드 합시다. (전 4.5.2버전 사용합니다.) 아! 혼자 공부하시는 분들을 위하여 API 문서 링크를 따로 첨부했습니다. 다운로드 링크 http://hc.apache.org/downloads.cgi API 문서 링크 https://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/ 튜토리얼 링크 %다운로드경로%httpcomponents-client-4.5.2tutorialpdf Gradle android { useLibrary ‘org.apache.http.legaccy’ } 추가 dependencies { compile group: ‘org.apache.httpcomponents’ , name: ‘httpclient-android’, version: ‘4.3.5.1’ } 추가
  • 4. 4 HttpRequest 시작하기 처음부터 코드를 보기보단 조금 이론적인 부분을 보고 가는 것이 좋겠죠? Hyper-Text Transfer Protocol(HTTP)은 오늘날 인터넷에서 사용되는 가장 중요한 프로토 콜입니다. (다 아는 사실이죠) HTTP에 사용하는 여러 가지 메소드가 있습니다. HTTP/1.0 스 펙에 기재되어 있는 요청 방법에는 GET, HEAD, POST 방ㅇ식이 있으며 1.1 스펙에서 추가 된 PUT, DELETE, TRACE 방식이 있습니다. (다음 링크에 HTTP/1.1 스펙이 잘 설명되어 있네 요. – mindseye.tistory.com/145 ) 우리는 서버의 자원을 어떻게 사용하는지에 따라 GET, POST 방식를 많이 사용합니다. GET 방식은 “서버의 자원을 가져올 때 사용”합니다. 더 정확히는 한 트랜잭션이 진행되면 서 동기화 이슈를 불러 일으키지 않는 선에서만 사용됩니다. GET 방식의 사용법을 정확히 알게 되는 오늘은 서버의 자원을 가져올 때만 사용하는 것이 아니라 ‘한 트랜잭션에 대해 서 동기화 이슈에 위반되지 않을 경우’에 사용하면 됩니다. (GET 방식을 쓸 때 다양한 이 슈들이 존재합니다. 쿼리 스트링에 제한이 있기도 하죠!! 보안적인 문제도 있고~ㅋ 하지 만 웹 브라우저가 쿠키를 거부한다면…? 즉 스크릿 모드라면..? 등등? 이에 대해 고민하는 것은 여러분의 몫! ) POST는 1.1스펙에 멱등 방식이 아닌, 즉 정확한 트래잭션을 가지고 있는 방식입니다. 그래서 GET방식과 다르게 POST는 동기화 이슈에서 안전합니다(Thread safe). 그렇기 때문 에 서버에 데이터를 insert, update, delete의 요청을 할 때에 POST 방식을 이용합니다. 이와 같이 HttpRequest는 이 요청 방식들과 관련된 get, post, head, put 등 모든 메소드 들을 정적(static)으로 제공합니다! HttpRequest를 new 하지 않고도 사용할 수 있는 것이 죠~! 멋있어… 더 자세한 내용은 다음 페이지에서 설명하겠습니다. HttpRequest는 모두들 “단 하나만의 클래스이며, 무척 가볍다”라고 이야기를 합니다. 저 는 “무척 가볍다”라는 말에는 동의하지만 단 하나의 클래스라는 말에는 동의하지 않습니 다. 외부에서 보기엔 단 하나의 클래스인건 맞지만 단 하나의 클래스 속에 여러 개의 정 적 네스티드 클래스(nested class)와 인터페이스(interface)가 정의되어 있기 때문이죠. 참고로 소스를 확인해보시면 아시겠지만, HttpRequest는 java.net 패키지의
  • 5. 5 HttpURLConnection을 기반으로 하여 작동합니다. 이를 개발한 팀 역시 HttpURLConnection을 사용하는 Android 개발자들을 위하여 혹은 가벼운 성능의 HTTP 요청을 전송하는 개발자들을 위해 개발했습니다.
  • 6. 6 HttpRequest를 이용한 코드 작성 HttpRequest는 여러 개의 네스티드 클래스와 인터페이스를 가지고 있습니다. 여러 개의 네스티드 클래스 중 제가 관심 있게 보고 있는 인터페이스가 있습니다. 바로 ConnectionFactory라는 인터페이스인데요~!! 이 인터페이스는 HttpRequest가 내부적으로 빌더(Builder) 디자인 패턴을 적용시키기 위하여 설계되어 있습니다. 또한 내부적으로 URL 클래스의 openConnection메소드를 호출하는 등 여러 모로 관심 덩어리입니다. ConnectionFactory interface는 2개의 추상 메소드를 가지고 있고, 자기 자신을 구현한 멤버필드를 가지고 있습니다. (인터페이스에 싱글톤을 적용시켰네요!) HttpRequest 서버로 요청을 보낼 때 마다 새로운 HttpURLConnection을 생성합니다~! 이런 특별한 구조로 HttpRequest는 HTTP의 다양한 요청 방식을 구현해냅니다. HttpRequest를 파헤쳐 보는 것은 또한 여러분의 몫입니다. 다음 링크에서 소스를 확인해 보세요!(링크) 이제 그 요청 방식들 중 HttpRequest를 이용하여 어떻게 GET 방식의 요청을 하는지 알 아봅시다. GET 다음과 같이 URL을 설정해준 뒤, HttpRequest에 사용할 요청방식 GET을 나타내는 get 메소드를 호출합니다. HttpRequest에 포함되어 있는 HTTP 요청 방식 메소드들은 모두 static 메소드이므로, 따로 HttpRequest 인스턴스를 생성할 필요가 없습니다. get 메소드 내부에선 HttpRequest 객체를 생성해서 리턴해줍니다.
  • 7. 7 HttpRequest는 메소드 전달 인자가 두 개 있습니다. 첫 번째 인자는 요청을 보낼 URL, 두 번째 인자는 요청에 사용할 메소드입니다. (여기에서 java.net 패키지의 URL클래스를 사용합니다.) HttpRequest 객체 생성이 완료되었습니다. 이렇게 생성된 HttpRequest 객체는 서버로 요청을 보낼 모든 준비가 완료된 ‘준비된 객체’입니다. 이제 이 준비된 객체를 서버로 요청을 보내기 위해선 응답(response)을 받을 수 있는 메 소드를 호출하면 됩니다. 위 그림에선 code()메소드를 호출했습니다. code()내부에선 getConnection()메소드를 호출 합니다. getConnection()메소드는 createConnection()메소드를 호출하네요? 이 메소드는 무엇 인
  • 8. 8 지 따라가보면~! 내부적으로 HttpURLConnection 객체를 생성하는 것을 볼 수 있습니다. CONNECTION_FACTORY는 ConnectionFactory객체입니다. 이와 같이 응답의 정보에 따라 다양한 메소드를 이용할 수 있습니다. 서버가 보내주는 응답의 Header 정보를 확인하면 됩니다. Response Code를 확인해보는 code() 메소드, 응 답 메시지를 확인하는 body() 메소드, 통신이 성공했는지 확인하는 ok() 메소드가 있습니 다~!! 이렇게 서버의 응답을 확인하는 첫 메소드를 호출하는 순간 서버와 통신이 시작됩 니다. (두 번째부터 호출되는 메소드는 서버와 재 통신하지 않습니다.) 이제 위의 GET 방식과 더불어 POST 방식으로 요청을 전송하는 코드를 확인하겠습니다.
  • 9. 9 최종코드 주의 사항 · 해당하는 메소드들을 첫 번째로 호출할 당시 호출한 위치가 Android의 UI Thread or runOnUiThread()일 경우 NetworkOnMainThreadException이 발생합니다.
  • 10. 10 · code(), ok()와 같은 메소드들은 첫 요청 이후 여러 번 재 호출해도 되지만 body() 메 소드는 한 번 호출 이후 재호출을 할 경우 IOException이 발생합니다. · 재 호출이 아니더라도 body() 메소드를 UIThread에서 호출할 경우 IOException이 발 생합니다. HttpRequest 객체를 이용해서 UIComponent에 직접 데이터를 갱신해 주면 좋지만 모 든 작업은 Worker Thread에서 처리 후, 최종 결과만 UIThread에 전달하시길 권고합니다. 마치며… POST 방식은 다음 장의 세션 유지하기에서 form data 전송과 함께 다시 한 번 더 보겠습니다. HttpRequest의 UML 아! Multipart 종류들의 메소드들은 HttpRequest.part() 메소드를 사용하시면 됩니다! Maven Central <dependency> <groupId>com.github.kevinsawicki</groupId> <artifactId>http-request</artifactId> <version>6.0</version> </dependency> Not Maven environment https://raw.githubusercontent.com/kevinsawicki/http- request/master/lib/src/main/java/com/github/kevinsawicki/http/HttpRequest.java HttpRequest API HttpRequest API - http://kevinsawicki.github.io/http-request/apidocs/index.html
  • 11. 11 세션 유지하기 백날 서버랑 통신하는 방법을 배우면 뭐시 중헌디!! 로그인/로그아웃 서비스가 있어야 할 것 아닙니까~!! 그래서 준비했습니다. 안드로이드에서 세션 유지하는 방법! 제가 처음 세션 정보(user code, user name 등)를 SQLLite에 저장한 기억이 있네요.(창피..) 다른 개발자 분들은 어떻게 세션을 유지하셨나요? 다른 개발자 분들의 이야기를 들어보면 DB에 저장하기도 하고, 서버로부터 토큰 값을 받아와서 저장하기도 한답니다. 보통의 데이 터인 경우 DB에 많이들 저장합니다. 하지만 세션 정보는 Android에서 DB에 저장하기엔 너 무 적습니다. 게다가 DB를 이용하자니 코드가 길어지고, 애매한 상황이 발생합니다. 여기에서 API Level1부터 있었던 SharedPreferences를 사용하는겁니다 !!! 처음부터 못 써줘서 미안해.. 내가 못난이지.. SharedPreferences 공식 문서에서 SharedPreferences는 다음과 같이 설명됩니다. ‘SharedPreferences 클래스는 primitive 데이터 타입의 키-밸류 쌍을 저장하고 검색하게 하 는 일반적인 프레임워크를 제공합니다. SharedPreferences를 boolean, float, int, long, string와 같은 primitive 데이터를 저장하는데 이용할 수 있습니다.’ SharedPreferences를 사용하는 방법은 토큰 값을 받아오는 것과 많이 비슷합니다. 서버에 서 사용자의 로그인 인증이 완료되면 서비스 이용에 필요한 사용자의 이름과 몇몇의 정보 를 받고, SharedPreferences는 이를 Application 영역에 File 형태로 데이터를 저장합니다. (아! 안심하셔야 할 점은 어플리케이션을 삭제하면 데이터도 함께 삭제됩니다.)
  • 12. 12 SharedPreferences 사용법 SharedPreference에서는 외우면 되는 것이 2가지 있습니다. 1. Data를 insert(put)할 때만 Editor를 사용한다. 2. insert, update, delete한 후에는 꼭 commit을 한다. 이 두가지만 지키면 끝입니다. 자자 ~! SharedPreferences를 어떻게 생성해서 사용하나! 문법을 보고 코드로 갑시다! SharedPreferences pref = mContext.getSharedPreferences(PREF_NAME, mContext.MODE_PRIVATE); SharedPrefernces는 사용중인 context의 정보가 필요합니다. 또한 첫 번째 전달 인자로 넘 겨주는 PREF_NAME은 DB의 Primary key과 비슷하게 파일명과 같은 역할을 합니다. 마지막으로! SharedPreference의 getAll(), getInt() 등의 get<+>() 메소드는 key, defaultValue 의 두 개의 전달 인자가 있습니다. 저장된 데이터 중 key에 해당하는 value가 없을 경우 defaultValue를 리턴하는데요 이 defaultValue는 Boolean 값으로 설정해서 사용하곤 합니다. 또한 해당 key의 value가 리턴하고자 하는 자료형이 아니라면 ClassCastException을 throw 합니다.
  • 13. 13 실전 코드 UI구성 서버 통신 코드 최종코드 부분의 POST와 다른 점이 있다면 Map 자료구조를 사용한 것 입니다. Map 자
  • 14. 14 료구조를 사용하지 않고 send() 메소드를 이용하면 좀 더 간단하게 서버로 데이터를 전송할 수 있습니다. 또한 제가 직접 Wrap한 CustomPreference 클래스가 있습니다. 주석을 포함해 서 Git에 함께 올려놓겠습니다. 서버코드 참 쉽죠잉?
  • 15. 15 끝내며.. 위와 같은 내용으로 정기 세션때 이야기를 나눌 예정입니다. 넥스터즈 회원님들은 발표를 먼저 들은 후, 이 발표자료를 이용하여 복습하시면 더욱 좋은 효과가 있을 것이라 생각합니 다. 목차에는 GET 방식만 기재되어 있지만, POST 방식도 기재되어 있습니다. 못 보신 분은 자세 히 읽고 오심을 추천해드립니다. 위 내용과 관련하여 궁금하신 부분이 있으면 새벽도 괜찮으니 문의카톡 남겨주세요~! 사용된 코드 & 도움된 사이트 HttpRequest - https://github.com/kevinsawicki/http-request HttpRequest API - http://kevinsawicki.github.io/http-request/apidocs/index.html HttpRequestProject(Android) – https://github.com/KwonGiho/HttpRequestProject HttpRequestServer(J2EE) - https://github.com/KwonGiho/HttpRequestServer HTTP1.1스펙 한글판 - mindseye.tistory.com/145 HTTP1.1 스펙 - https://tools.ietf.org/html/rfc2616#section-2.2