웹 소켓은 단일 소켓을 통해서 풀듀플렉스(full-duplex) 통신을 제공하는 프로토콜이다. 웹 브라우저오 서버간의 비동기 메시징을 활성화한다. 풀 듀플렉스는 서버가 브라우저에 메시지를 전송할 수 있고, 브라우저도 서버에 메시지를 전송할 수 있음을 의미한다. 스프링4.0은 웹 소켓 통신을 지원하며, 다음을 포함한다. 메시지 전송과 수신을 위한 하위 레벨 API 스프링 MVC 컨트롤러에서의 메시지 처리를 이한 상위 레벨 API 메시지 전송을 위한 메시징 템플릿 브라우저, 서버, 프록시에서 웹 소켓 지원 부족을 지원하기 위한 SockJS 1. 스프링의 하위 레벨 웹 소켓 API사용하기 간단한 형태로 웹 소켓은 두 애플리케이션 사이의 통신 채널이다. 풀 듀플렉스이므로 양쪽 종단은 메시지를 전송할 수 있고, 다른 쪽은 그 메시지를 받아서 처리한다. 웹 소켓 통신은 여러 종류의 애플리케이션 사이에서 사용될 수 있다. 그러나 웹 소켓의 대부분은 서버와 브라우저 기반 애플리케이션 사이의 통신을 용이하게 하기 위해서 사용된다. 브라우저에서의 자바스크립트 클라이언트는 서버에 대한 연결을 오픈하고, 서버는 그 연결을 통해 브라우저에 업데이트하라고 보낸다. 이러한 방법은 업데이트를 위해 서버를 폴링(Polling)하는 일반적인 방식보다 더 효율적이며, 좀 더 자연스럽다. 하위 레벨 웹 소켓을 지원하기 위해서 스프링에서 메시지를 처리하고, WebSocketHandler를 구현한 클래스를 작성한다. public interface WebSocketHandler{ void afterConnectionEstablished(WebSocketSession session)throws Exception; void handleMessage(WebSocketSession session, WebSocketMessage<?> message) throws Exception; void ...
*리얼타임 웹을 위한 기법으오 일정한 주기를 가지고 서버와 응답을 주고받는 방식이 폴링방식이다. 이는 Ajax Polling이라고도 불리는데 주로 Ajax호출을 사용하기 때문이다. 하지만 이 폴링기법은 두 가지 문제가 있는데, 폴링 주기에 관한 문제로 주기가 짧으면 서버의 성능에 부담이 가고, 주기가 길면 실시간 성능이 약간 떨어지는 문제가 있다. 그래서 이 폴링의 지연을 최대한 줄이기 위해 comet을 구현하는 방법이 있고 이 방법 중에 하나가 롱폴링기법이있다. 이 롱폴링 방식은 서버 측에서 접속을 열어두는 시간을 길게 하는 방식이다. 롱폴링 에서는 이벤트가 발생하면 바로 응답이 이루어지기 때문에 실시간성이 아주 높으며,스트리밍 방식과 달리 웹브라웆 환경에 관계없이 사용할 수 있기 떄문에 흔히 사용하는 방식이다. 롱폴링 방식외에 스트리밍 방식이 있는데 이 스트리밍 방식은 하나의 웹 요청에 대해 웹 접속을 계속 열어두고, 새로 이벤트가 발생하면 발생할 때마다 부분적인 응답으로 브라우저로 보내는 방식이다. -간단한 구현 - 쓸모없는 요청-응답 때문에 많은 트래픽이 낭비됨 - 반복하는 주기가 짧지 않은 경우 , 폴링기법 추천 (예: 페이스북 웹채팅에서 사용자 리스트 갱신주기 1분-폴링기법 사용) -서버에서 커넥션을 물고 기다리고 있으며, 이벤트의 업데이트가 있을 경우 클라이언트로 응답을 준다. - 구현기술 - iframe : 구현이 쉬우나 로딩이 표시되고 크로스 도메인을 지원하지 않음 - htmlFile : IE 에서만 동작함 - JSONP : 대중적인 사용방식, 크로스도메인 문제 해결 - XmlHttpRequest : 크로스 도메인을 지원하지 않음 <폴링방식과 롱폴링 방식 선택하기> Long-Polling 방식을 선택해야 하는 경우 약 3초간의 오차로 실시간 응답이 필...
프로그래밍을 하다보면 클래스 내에서 동적 할당이 필요한 경우가 생긴다. 문자열의 경우가 대표적인 예인데, 이땐 필요한 만큼 char 배열을 할당해서 사용해야 한다. 문제는 객체가 복사될 때 객체가 가져야 할 모든 정보가 복사되지 않고 동적 할당한 메모리를 가리키는 포인터 변수(char* 등)만 복사된다는 것이다. 그래서 복사된 하나의 객체 내용을 변경하면 나머지 다른 객체의 내용도 변하게 되고 뜻하지 않은 자료의 변형을 초래할 수 있다. 더군다가 이런 버그는 찾기도 힘드니 애초부터 습관을 잘 들여놔야한다. 잠깐 여기서 질문! "그럼 const로 받으면 변형 못시키니 문제없지 않나요?" 물론 직접 접근을 사용한 변경은 할 수 없다. 하지만 멤버 함수에서 행하는 변경까지 막을 수는 없다 -_-; 그 예를 아래에서 살펴보자. 고객 관리 소프트웨어를 만드는 ABC사는 고객 정보를 저장하기 위해 Person 클래스를 만들었다. class Person { char *name; // 이름 char *phone; // 전화번호 int age; // 나이 public: void ShowData(); // 정보 출력 : 내용은 생략! }; 그리고 값을 입력하기 위해 생성자를 다음과 같이 선언하였다. 단, 이름과 전화번호의 길이가 일정하지 않기 때문에 동적 배열로 할당해서 저장하도록 하였다. Person::Person(char* _name, char* _phone, int _age) { name = new char[strlen(_name)+1]; // 길이만큼 배열 선언. +1은 널문자 공간 strcpy(name, _name); // 입력받은 값을 복사해서 저장 phone = new char[strlen(_phone)+1]; strcpy(phone, _phone); age=_age; } 동적 할당된 메모리는 사용 후 반드시 해제해줘야 한다. (그렇지 않으면 프로세스가 종료될 때 까지 메모리 공간을 차지하게 된다) 클래스 내에서 사용된 메모리는 클...
댓글
댓글 쓰기