HTTP란?
HTTP는 HTML, TEXT, 이미지, 음성, 영상, 파일, JSON, XML, 서버 간에 데이터를 주고 받을 때 등등 거의 모든 파일의 형식을 전송할 수 있다.
OSI 7계층
https://mangkyu.tistory.com/15
프로토콜?
위키백과에 따르면 ‘통신 프로토콜 또는 통신 규약은 컴퓨터나 원거리 통신 장비 사이에서 메세지를 주고 받는 양식과 규칙 체계’ 라고 말하고 있다.
프로토콜의 종류
HTTP, ARP, ICMP, SNMP, SMTP, POP, FTP, TFTP, DHCP와 같은 프로토콜이 있다
내가 주로 사용하게 될 프로토콜로는 HTTP와 FTP가 될 것이다.

TCP/UDP프로토콜을 기반으로 다양한 프로토콜이 있다.
TCP/UDP는 전송 계층으로써 데이터와 패킷을 전송하는 방식에 차이를 두고있다.
TCP(Transmission Control Protocol)
TCP(Transmission Control Protocol)
- 특징
- 연결 지향적으로 세션 연결이 완료된 후 통신을 진행한다.
- 세션 연결 시 3way_hand_shake방식을 사용한다.
- 세션 해제 시 4wah_hand_shake방식을 사용한다.
- 데이터 유실 시 재 전송을 한다.
- 장점
- 데이터의 전송 순서를 보장해준다.
- 신뢰성 있는 데이터를 전송한다.
- 단점
- 하나의 세션만 연결하여 통신할 수 있다.
- 상대적으로 UDP보다 느리다.
두 개의 호스트를 연결하고 데이터 스트림을 교환하는 네트워크 프로토콜이다.
TCP는 데이터와 패킷이 순서대로 전달되는 것을 보장한다.
두 호스트의 세션을 연결하는 과정에서 3way_hand_shake가 진행된다.
Client > Server : TCP SYN
Server > Client : TCP SYN ACK
Client > Server : TCP ACK
→ 정확한 전송을 보장하기 위해 상대방 컴퓨터와 세션을 수립하는 절차이다.

세션을 종료할 때는 4way_hand_shake가 진행된다.
UDP(User Datagram Protocol)
UDP(User Datagram Protocol)
- 특징
- 비 연결 지향적으로 연결 절차를 거치지 않고 일방적으로 데이터를 발신한다.
- 장점
- 상대적으로 TCP보다 빠르다.
- 패킷 오버헤드가 적어 네트워크 부하가 감소된다.
- 단점
- 신뢰성 없는 데이터를 전송한다.
- 정확한 데이터의 전송을 보장하지 않는다.
- 패킷 관리가 필요하다.
신뢰성이 없고 데이터 유실을 신경쓰지 않아도 UDP를 쓰는 이유는 TCP보다 빠르기 때문이다.
HTTP
HTTP
TCP를 기반으로 웹 브라우저와 웹 서버가 HTML로 작성된 웹 페이지나 동영상, 음성 파일 등등을 주고받기 위한 프로토콜(통신규약)입니다. (거의 대부분의 형식을 지원한다)
통신 과정은 client에서 요청메시지를 보내면 server에서 응답메시지를 보낸다.
- 특징
stateless(무상태)
stateless를 알아보기 위해 그와 상반되는 stateful을 알아야한다.
위 그림처럼 안마의자 정보의 요청과 응답이 이루어진 후 클라이언트는 안마의자 정보는 없이 2개 구매 요청만 보내면 서버에서는 안마의자 정보에 대한 요청을 저장하고 있으므로 안마의자 2개 구매에 대한 성공 응답을 보낸다.
하지만, 서버가 다수 있을 경우 클라이언트가 2개 구매 요청을 했을 경우 이전 상태를 확인하기 위해 해당 상태를 찾기위해 다수의 서버를 조회한다. 최악의 경우 모든 서버를 탐색 할 수 있다. 그렇기에 매우 비 효율적이다.
위 그림처럼 클라이언트가 이전에 요청하여 받은 응답을 저장하고 ‘클라이언트'에서 해당 응답을 포함해 함께 보내는 형식이다.
- 서버의 갯수에 상관없이 모두 독립적으로 처리된다. 조회에 필요한 비용이 전혀 없다.
- 각 서버의 갯수에 따라 비례하여 성능이 올라갈 수 있다.
하지만, Stateless일 경우 페이지가 변경 될 때마다 로그인을 해야한다. 서버에서 상태를 저장하지 않으니 계속해서 인증을 요구하는 것이다. 이를 해결하기 위해 고안된 것이 쿠키, 세션, OAuth, JWT등이 있다.
쿠키, 세션, OAuth, JWT Connectionless(비 연결성)
비 연결성이란 클라이언트의 요청에 의해 서버가 응답을 하면 바로 TCP/IP연결을 해제한다.
- HTTP통신은 기본적으로 비 연결성이다.
- 옵션을 통해 일정시간 유지할 수 있다.
응답 이후에도 연결을 하고 있다면 리소스를 지속적으로 사용하기 때문에 자원을 효율적으로 관리할 수 없다.
- 한계와 보완
- TCP연결과 해제를 위한 3way, 4way hand shake의 시간이 추가된다.
- HTML뿐 아니라 CSS, JS, 이미지 등 수 많은 자원을 다운 받기 위해 매번 연결-해제 수행
- 현재는 HTTP지속연결로 이전 버전의 한계를 보완하였다.
- 일정시간 연결을 유지 혹은 수 많은 자원을 모두 다운 후 해제
HTTP초기 (HTTP/1.0)
단점을 보완한 현재의 HTTP (HTTP/2.0)
HTTP Request 구조
HTTP Request 구조

start line == requset Line
HTTP Method
- requset가 의도한 action을 정의
- GET, POST, PUT, DELETE, OPTIONS 등이 있다.
- 주로 GET, POST를 사용한다.
Requset target
- 해당 request가 전송되는 목표 uri
- www.naver.com
HTTP Version
- HTTP버전이다. 1.0, 1.1, 2.0등이 있다.
- 2.0 부터는 Connectionless을 보안하여 한번의 커넥션으로 동시에 여러개의 데이터를 주고 받을 수 있다.
- requset가 의도한 action을 정의
Request header
해당 request에 대한 추가 정보(addtional information)를 담고 있는 부분
Key:Value값으로 되어있다.
- Host
- 요청이 전송되는 target의 host url ex) naver.com
- User-Agent
- 요청을 보내는 클라이언트의 대한 정보 ex) 웹브라우저에 대한 정보
- Accept
- 해당 요청이 받을 수 있는 응답(response)타입
- Connection
- 해당 요청이 끝난후에 네트워크 컨넥션을 유지 할 것인가에 대한 옵션
- Content-Type
- 해당 요청이 보내는 메세지 body의 타입. JSON을 보내면 application/json
- Content-Length
- 메세지 body의 길이
- Host
Request body
request의 실제 메세지/내용
Body가 없는 request도 많다 ex) GET request들은 대부분 body가 없다.
HTTP Response구조
HTTP Response구조

Status Line
- HTTP버전
- Status code
- 응답 상태를 나타내는 코드 ex) 200
- Status text
- 응답 상태를 간략하게 설명해주는 부분 ex)ok, Not Found
Headers
- Response의 header와 동일
- Content-Type : 바디 데이터의 타입
- Content-Length : 바디 데이터 크기
- Set-Cookie : 쿠키 설정
- ETag : 엔티티 태그
Body
- Request Body와 일반적으로 동일
- 데이터를 정송할 필요가 없을 경우 body가 비어있게 된다.
HTTP Method
HTTP Method
GET
클라이언트에서 서버로 어떠한 리소스로 부터 정보를 요청하기 위해 사용되는 메서드
쉽게 말하면 데이터를 읽거나 검색할 때 사용되는 메서드
- 요청을 전송할 때 URL 주소 끝에 쿼리 스트링을 파라미터로 포함되어 전송
- GET 요청은 데이터를 읽을 때만 사용되고 수정할 때는 사용하지 않는다.
- 데이터의 변형이 없기 때문에 안전하다.
특징
- 불필요한 요청을 제한하기 위해 요청이 캐시될 수 있다.
- 파라미터에 내용이 노출되기 때문에 보안에 취약하다
- 브라우저 기록에 남는다.
- 북마크에 추가 가능(URL뒤에 뒤에 쿼리 스트링으로 구성되기 때문이다.)
- 요청 성공시 200(Ok) HTP응답 코드를 XML, JSON뿐만 아니라 여러 데이터 여러 형식(html, txt등등)의 데이터와 함께 반환 한다.
- 멱등하다
멱등(idempotent) → 연산을 여러 번 적용하더라도 결과가 달라지지 않는 성질
POST
리소스를 생성/업데이트하기 위해 서버에 데이터를 보내는 데 사용하는 메서드
- GET과 달리 전송해야될 데이터를 HTTP메세지의 Body에 담아서 전송
- Body의 타입은 요청 헤더의 Content-Type에 요청 데이터의 타입을 표시
- HTTP메시지의 Body는 길이 제한이 없기 때문에 대용량 데이터 전송 가능
- 데이터가 Body에 있어 내용이 눈에 보이지 않아 보안적이 면에서 GET보다 상대적으로 안전
BUT!! 크롬의 개발자 도구, Fiddler와 같은 툴로 요청 내용을 확인 할 수 있다.
민감한 데이터의 경우 반드시 암호화하여 전송!!
특징
- 캐시되지 않는다.
- 브라우저 기록에 남지 않는다
- 데이터 길이의 제한이 없다.
- POST요청 중 자원 생성은 201(Created) HTTP응답 코드를 반환한다.
- 멱등하지 않는다.
요약

HttpURLConnection.
HttpURLConnection.
try {
URL url = new URL(urlStr); // url 생성
// URL을 연결한 객체 생성
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
if(conn != null) {
// HTTP에 대한 설정
conn.setConnectTimeout(10000); // 10초 동안 기다린 후 응답이 없으면 종료
conn.setRequestMethod("GET"); // 메스드는 GET
conn.setDoInput(true); // 읽기모드 지정
conn.setDoOutput(true); // 쓰기모드 지정
int resCode = conn.getResponseCode();
if(resCode == HttpURLConnection.HTTP_OK) {
InputStream is = conn.getInputStream() // inputStream개방
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line
while(true) {
line = reader.readLine();
if(line == null) break;
println(line);
}
reader.close();
}
conn.disconnect();
}
} catch (Exception e) {
e.printStackTrace();
}
}
Retrofit2
Retrofit2
OkHTTP의 HTTP통신을 간편하게 만들어주는 라이브러리!
Async Task가 없이 Background Thread를 실행하고 Call Back을 통해 Main Thread에서 UI업데이트를 해준다.
장점
장점
- 속도
- AsyncTask를 사용하지 않고 자체적으로 비동기 실행과 스레드 관리로 속도가 빠르다.
- 편의성
- 함수 호출 시 파라미터를 넘겨주면 되기에 작업량이 줄어든다.
- 가독성
- Interface내에서 어노테이션을 사용하여 호출 함수를 미리 지정 해두고, 구현 없이 해당 함수를 호출만 해주며 콜백 함수를 통한 직관적 설계가 가능하다
사용 방법
사용 방법
- 라이브러리 추가 (최신 버전이 있으면 변경)
// 레트로핏 implementation 'com.squareup.retrofit2:retrofit:2.9.0' // gson implementation 'com.squareup.retrofit2:converter-gson:2.9.0' // OkHTTP implementation 'com.squareup.okhttp3:okhttp:4.9.0'
- 인터넷 권한 추가
<uses-permission android:name="android.permission.INTERNET" />
- Retrofit Builde 생성
class RetrofitBuilder { val retrofit = Retrofit.Builder() .baseUrl("https://api.github.com/") .client(OkHttpClient()) .addConverterFactory(GsonConverterFactory.create()) .build() val githubApi = retrofit.create(GithubAPI::class.java) }
addConverterFActory에는 Gson을 추가하여 사용.
Gson이란? json 구조를 띄는 직렬화된 데이터를 JAVA의 객체로 역직렬화, 직렬화 해주는 자바 라이브러리
rxJava를 사용한다면 addCallAdapterFactory(RxJava2CallAdapterFactory.create())을 추가해준다.
- Data Class 생성
data class GithubInfo ( val avatar_url: String?, val bio: String?, val login: String?, val name: String? )
- responsData를 생성한다.
- 받아오는 데이터가 Null일 수도 있기 때문에 Nullable기호 사용.
- InterFace생성
interface GithubAPI { @GET("users/oyj76777) fun getGithubInfo(): Call<GithubInfo> }
Interfae를 생성해준 뒤에 어노테이션을 이용하여 HTTP Method를 설정 (@GET)
함수의 반환형으로는 Call<ResData>입니다.
- 통신 구현
val retrofitService = RetrofitBuilder().githubApi val call = retrofitService.getGithubInfo() call.enqueue(Object : Callback<GithubInfo> { // 통신 성공 시 override fun onResponse(call: Call<GithubInfo>, response: Response<GithubInfo>) { val userInfo = response.body() Log.d("response","통신 성공") } // 통신 실패 시 override fun onFailure(call: Call<GithubInfo>, t: Throwable) { Log.d("error", t.message.toString()) } }) }
enqueue는 비동기 통신을 실행한다. 동기처리를 하고 싶다면 execute을 사용해주면 된다.
사실 위의 구성은 가장 기본적인 예제 구성이다.
@GET("group/{id}/users") Call<List<User>> groupList(@Path("id") int groupId);
이처럼 파라미터를 받아와서 URL을 구성 할 수도 있다.
Uploaded by N2T