간단메모!!
**** 빈번하게 쓰이는 간단하지만 자주 까먹는 것들 간략 메모해 놓는 게시물 입니다. 이 포스트는 지속적으로 업데이트 예정 입니다.
-- 목차
** RequestConfig
** PoolingHttpClientConnectionManager
** IE 에서 input 에 .val() 로 데이터 변경 시 onchange 먹지 않음
** MIME Type
** TCP 3-way Handshake & 4-way Handshake
** TCP 3-way Handshake & 4-way Handshake
* 3-way handshake
TCP/IP 프로토콜을 이용해서 통신을 할 시 양방의 데이터 전송을 보장하기 위해 세션을 수립하는 과정
A -> B : SYN
B -> A : SYN ACK
A -> B : ACK
SYN : Syncronize sequence numbers
ACK : Acknowledgment
1. A 는 B 에 접속 요청 패킷인 SYN 을 보낸다. SYN 을 보내고 기다리는 이 상태를 SYN_SENT 라 한다.
2. B 는 A 의 SYN 요청을 받고 수락한다는 ACK 와 SYN Flag 가 설정된 패킷을 발송하고 요청을 기다리는데 이 상태는 SYN_RECEIVED 라 한다.
3. A 는 B 에서 ACK 를 보내고 이후로 연결이 이루어지며 데이터 교환이 이루어 지는데 이때의 B 서버 상태를 ESTABLISHED 라 한다.
* 4-way handshake
세션을 종료하기 위해 수행하는 절차.
A -> B : FIN
B -> A : ACK
B -> A : FIN
A -> B : ACK
1. A 는 B 에 연결을 종료하겠다는 FIN 플래그 전송
2. B 는 A 에 확인 메시지를 먼저 보내놓고 자신의 통신이 끝날 때 까지 대기. 이 상태가 TIME_WAIT
3. B 는 통신이 끝났으면 종료되었다고 A 에 FIN 플래그 전송
4. A 는 확인했다고 ACK 전달
이 때 B 에서 FIN 패킷을 전송하기 이전에 지연이나 패킷 유실로 인해 데이터들이 FIN 패킷 보다 늦게 도착하는 상황이 발생한다면 해당 패킷은 DROP 되고 데이터는 유실되는데 이러한 현상을 대비하여 A 는 B 로 부터 FIN 을 수신하더라도 일정시간 (default 240초) 동안 세션을 남겨놓고 패킷을 기다리는 과정이 있는데 이 과정을 TIME_WAIT 라고 한다.
** RequestConfig
RequestConfig config = RequestConfig.custom().setSocketTimeout( 10 * 1000 ).setConnectTimeout( 10 * 1000 ).build();
setSocketTimeout : connection 을 맺은 후 응답 대기시간. millisecond. 커넥션 맺은 후 10 초 동안 response 가 없으면 해제
read timeout 이 socketTimeout 과 유사하다. 구현체에 따라 socketTimeout, readTimeout 을 알맞게 사용.
(유사하다는 근거는 HttpClient 에 주석으로 read 의 경우 java.net.ScoketTimeoutException 을 throw 한다고 되어있다)
setConnectTimeout : connection 을 맺는 시간. millisecond. 10 초 동안 커넥션이 이루어지지 않으면 해제 (3-ways handshake)
** PoolingHttpClientConnectionManager
PoolingHttpClientConnectionManager connManager = new PoolingHttpClientConnectionManager();
connManager.setDefaultMaxPerRoute(50); // 각 HOST (IP + PORT) 당 Connection Pool 에 생성가능한 Connection 의 수
connManager.setMaxTotal( 100 ); // Connection Pool 의 수용 가능한 최대 사이즈
** IE 에서 input 에 .val() 로 데이터 변경 시 onchange 먹지 않음
function keypress(obj) {
$(obj).val('값바꿔요');
}
일 경우 chrome 은 input 에 있는 onchange 이벤트가 실행되나 ie 는 실행되지 않으므로 $(obj).val('값바꿔요').trigger('change'); 로 사용.
** MIME Type
MIME Type
Multipurpose Internet Mail Extension Type
Accept-Type : Client 가 서버에 자신이 선호하는 타입을 전달이므로 request 에만 있다. 원하는 형식으로 달라 요청하면 서버에서는 producer 에 매칭되는 값(application/xml or json ..) 이며 이 accept-type 헤더 값을 분석해서 알맞은 값으로 내려줄 수 있는 것.
Content-Type : Server 가 body 에 리턴되는 데이터 타입이 뭔지 알려주는 것. 그것을 알아야 브라우저가 파싱 가능. 예를 들어 리턴 타입이HTML 이면 브라우저가 알아서 파싱하지만 excel, pdf, ms-word 등 문서 파일이라면 다른 플러그인 등을 통해서 처리가 되어야함.
Client 에서도 Content-Type 을 명시해서 보내는 경우가 있는데 그 경우는 post, put 방식을 사용 시 body 영역에 form data 가 전달되기 때문에 서버에서도 해당 Content-Type 을 알아야 파싱이 가능하기 때문. get 방식은 url 뒤에 데이터가 전달 되기에 굳이 필요없다.