디시인사이드 갤러리

갤러리 이슈박스, 최근방문 갤러리

갤러리 본문 영역

디씨 갱신이 잘 안 되는 이유 분석과 대응 방안 제시

피로토스갤로그로 이동합니다. 2009.08.18 00:31:44
조회 123 추천 0 댓글 7


일단 캐시 문제다.

실제 서버 DB에 존재하는 데이터가 클라이언트로 순수하게 전송되지 않고 과거의 스냅샷이 보여진다.

캐시는 어디어디에 존재하는지 살펴봄으로써 해결 방법을 찾을 수 있다.

일단 웹 브라우저 캐시가 존재한다. 같은 URL에 대한 리퀘스트에 대해 클라이언트 단에서 이전에 기록된 결과를 리턴하는 방식이다.

이 캐시는 사용자가 끌 수 있다.

IE를 예로 들어보면 도구|인터넷 옵션|검색기록|설정 에서 [저장된 페이지의 새 버전 확인] 옵션을 [페이지를 열 때 마다]로 설정하면 된다.

웹 개발자들이 보통 이 설정으로 세팅해 놓고 사용하는 경우가 많다.

다음으로 추정해 볼 수 있는 캐시는 서버 캐시이다.

똑 같은 리퀘스트가 올 때 이전에 저장해 놓은 스냅샷을 전송하는 것이다.

이렇게 하면 DB서버에 대한 부담을 크게 줄일 수 있고, 스크립트에 대한 파싱을 줄일 수 있으므로 CPU에 대한 부담도 줄일 수 있다.

이 방식은 내부적으로 URL을 키로 한 해시맵으로 구현하는 것이 일반적일 것으로 추측된다.

따라서 이 방식은 해시키를 살짝 바꾸어 주면 캐시 히트를 피할 수 있다.

Ajax에서 많이 쓰는 해결방법을 응용하면 쉽게 해결된다.

예를 들어 우리가 L을 눌러서 새글을 확인한다고 할 때 URL은 [https://gall.dcinside.com/list.php?id=programming&keyword=&k_type=0100&search_pos=&page=1] 가 된다.

서버 캐시를 활성화 시켜 놓았다면 항상 같은 리퀘스트에 대해 캐시 히트가 될 것이다.

URL이라는 것은 ? 뒤에 붙는 정보들이 Form 데이터에 대한 전송이다.

Form 데이터는 HTTP 프로토콜상에서 느슨한 체크를 한다. 다르게 얘기하면 ? 뒤에 붙은 폼 데이터가 실재로 존재해도 되고 안 해도 된다는 것이다.

서버가 필요한 항목만 파싱해서 취사선택하기 때문에, 서버의 폼과 매칭되지 않는 쓰레기 변수들이 있어도 오류를 발생시키지 않는다.

따라서 저 URL뒤에 불필요한 항목을 붙여 보자.

[https://gall.dcinside.com/list.php?id=programming&keyword=&k_type=0100&search_pos=&page=1]가 딱 필요한 정보로 구성된 정상적인 URL이다.
[https://gall.dcinside.com/list.php?id=programming&keyword=&k_type=0100&search_pos=&page=1&garbage=12345] 라고 URL을 변형하면

서버는 이 URL을 정상적인 URL로서 처리해 줄 것이다. 뒤에 붙인 garbage=12345 라는 폼 데이터는 서버가 처리하지 않기 때문에 오류를 발생시키지 않는다.

하지만 캐시 히트는 피할 수 있다.

왜냐하면 URL을 검증하지 않고 전체 URL을 해시키로 쓰기 때문에 두 URL은 명확하게 다른 해시키가 되기 때문이다.

살짝 또 바꿔보자. garbage=12345 대신 garbage=12346을 붙여서 URL을 조합하면 역시 두 URL은 완전히 다른 놈이 된다.

따라서 서버의 캐시 히트를 피해갈 수 있다.

마지막으로 존재할 수 있는 캐시는 프락시 서버다.

프락시는 클라이언트와 서버 사이에 위치하면서, 클라이언트의 요청에 대해 눈치껏 파악해서 자신이 갖고 있는 캐시를 리턴시키는 방식으로 동작한다.

이 방식을 통해 프락시는 내부의 여러 유저의 캐시를 공유하는 역할을 해 준다.

자 그렇다면 프락시 서버는 어떤 키값으로 캐시를 검색할까?

웹서버와 마찬가지로 전체 URL을 해시키로 사용한다.

따라서 URL에 쓰레기를 붙이는 방식으로 프락시의 캐싱을 피해갈 수 있다.

자 이제 답은 명확하다. URL에 쓰레기 붙이기가 답이다.

답을 알았으므로 편하게 이 방식을 쓸 수 있도록 프로그램을 개발 해 보자.

URL의 변조는 철저히 클라이언트가 해야 하는 몫이다.

클라이언트에서 사용자는 URL 변조를 위해 불편함을 느껴서는 안 된다.

그리고 클라이언트 어플리케이션은 웹 브라우저다.

몇 가지 방법을 생각해 볼 수 있다.

첫 번째 안은 웹브라우저를 직접 제작하는 것이다.

URL을 네트웍에 전송할 때 https://gall.dcinside.com/ 이라고 시작한다면 문자열 비교 또는 정규식으로 간단히 비교하여 뒤에 쓰레기를 붙이면 된다.

이 방안의 단점은 웹브라우저를 직접 개발해야 한다는 부담과, 신기술을 따라가야 한다는 부담. 그리고 근본적으로 다른 유저들이 과연 이 브라우저를 사용할 것인가 하는 문제가 대두된다.

IE 컨트롤을 사용하여 한 시간 정도면 이 기능을 하는 웹 브라우저를 개발할 수 있다. 환경 설정과 플러그인도 IE와 공유하므로 훌륭한 대안이 될 수 있으므로 개발부담은 Zero로 가깝게 줄어들 수 있다.

그렇지만 다른 유저들이 사용할 것인가에 대한 고민은 해결이 되지 않는다. 웹마 같은 대중적인 브라우저로 성장한다면 다른 유저들도 사용하겠지.

하지만 웹마 수준의 브라우저는 개발 부담이 있다. 따라서 또 다시 같은 고민을 하게 되는 재귀논리모순에 빠지게 된다.

두 번째 안을 보자.

플러그인을 만드는 것이다. 불여우 플러그인 SDK를 이용하여 만들고, IE도 지원하려면 ActiveX로 구현하면 된다.

오픈 아키텍쳐(플러그인을 지원하는)구조의  웹 브라우저는 필수적으로 URL 가로채기를 지원한다.

왜냐하면 그 기능이 필수적이기 때문이다.

URL을 중간에 가로채서 어떤 동작을 할 지 판단해야 하는건 기본중의 기본 기능일 수 밖에 없다.

URL이라는게 한 페이지에서 한 번만 발생한다고 생각하는가?

HTTP는 너무나도 단순한 프로토콜이기 때문에 어떤 페이지를 요청해서 받은 HTML문서에 이미지가 두 개, 플래시가 하나 포함되어 있다면, 이미지 요청을 위해 두 번의 URL리퀘스트와 플래시를 다운받기 위한 한 번의 리퀘스트를 날리게 되어 있다.

플래시 플러그인을 활성화 시키려면 마지막의 플래시 파일 요청 URL을 가로채야만 한다.

그게 아니면 뭔 수로 쉽게 플래시와 플러그인을 연결시키겠는가?

URL을 가로챌 수 있으면 URL을 변조하여 전송하는 것도 가능하다.

그게 아키텍쳐에서 제공하는 기능이던 약간의 해킹을 해야 하는 것이던간에 분명히 변조하여 전송할 수 있다.

내가 아는 바로는 IE는 분명히 그 기능을 제공한다. 불여우나 기타 브라우저의 제공 여부는 확실치 않지만, 상식적으로 판단할 때 그 기능을 제공하지 않는 경우는 별로 없을 거 같다.

이 방식의 장단점도 짚어보자.

장점은 첫 번째 안의 단점이 사라진다는 것이다. 브라우저 개발의 부담은 없다. 그리고 많은 사용자들이 즐겁게 사용해 줄 것이다.

단점은 뭘까? 여러 브라우저를 지원해야 한다. 그런데 브라우저마다 플러그인 인터페이스가 다 다르다. 따라서 코드 재활용이 제한적일 수 밖에 없다. 많은 버전을 만들어야 한다는 부담이 있다.

하지만 여러 안 중에 가장 적절한 안이라고 본다.

마지막 안은 로우레벨의 구현이 필요한 안이다. 로우레벨인 만큼 응용레벨의 구현이 어찌 되었던간에 동일한 기능을 구현 할 수 있는 장점이 있는 안이다.

바로 URL이 날라가는 도중에 네트웍을 타기 전에 바꿔치기를 하는 것이다.

TCP/IP 드라이버를 변조하여 구현할 수 있다. 드라이버를 건드리지 않고도 구현이 가능하다. 윈도 OS인 경우 알다시피 후킹을 사용할 수 있을 것이다.

내가 아는 범위에서 네트웍 리퀘스트에 대해서도 후킹이 가능한지는 확실치 않다. 하지만 TCP/IP 패킷을 보여주는 스파이 프로그램들이 존재하는 걸로 봐서, 그리고 그 스파이들이 드라이버를 건드리지 않는 거 같기 때문에 무언가 방법은 분명히 존재한다.

존재 하지 않는다면 드라이버를 건드리면 되고, 아니면 로컬 프락시를 만들어도 된다.

장점은 앞서 말한 대로다. 모든 브라우저를 동시에 지원하게 된다.

가장 큰 단점은 플러그인이 아니라는 점이다.

드라이버를 건드리는 프로그램은 로우레벨의 문제를 발생시킬 소지가 있다.

특히 네트웍이 먹통이 되었을 때, 그 문제를 복구하기가 참 어렵다. 인터넷 검색이라도 되어야 복구할 방법을 찾을 것이고, 원본 드라이버를 새로 다운로드를 받을 수 있을게 아닌가?

이런 이유로 사용자들은 로우레벨까지 건드리는 소프트웨어를 설치하기 꺼려한다.

그래서 내 결론은 두 번째 안이 가장 좋다는 것이다.

추천 비추천

0

고정닉 0

0

원본 첨부파일 1

댓글 영역

전체 댓글 0
등록순정렬 기준선택
본문 보기

하단 갤러리 리스트 영역

왼쪽 컨텐츠 영역

갤러리 리스트 영역

갤러리 리스트
번호 제목 글쓴이 작성일 조회 추천
설문 힘들게 성공한 만큼 절대 논란 안 만들 것 같은 스타는? 운영자 24/06/10 - -
156111 ip 주소로 신상터는 프로그램 [3] 칭송받는자(59.19) 09.11.07 272 0
156110 이거 어떻게 할수 없냐??? [5] 삽입의추억갤로그로 이동합니다. 09.11.07 108 0
156105 윈도우7 좃니? [7] 오사카(119.194) 09.11.07 211 0
156104 어? [1] ㅎ3(112.222) 09.11.07 48 0
156103 이런 개자지들아 고작 프로그램 하나 주는걸 돈줘야되? [12] 에시갤로그로 이동합니다. 09.11.07 246 0
156102 ip 주소로 신상터는 프로그램좀 올려주세요 ㅎㅎ [14] 에시갤로그로 이동합니다. 09.11.07 224 0
156101 님들 신입뽑으면 [5] 예수씨발새퀴갤로그로 이동합니다. 09.11.07 191 0
156100 능력자 프갤횽들 '웹메일 점유율' 볼 수 있는 곳 없을까? [3] Oper(121.169) 09.11.07 85 0
156099 세브가 하피한이유 [2] 세브(121.131) 09.11.07 104 0
156098 이게 현 소니의 위치 [2] ㅎ3(112.222) 09.11.07 132 0
156097 잉여 혼아 = new 잉여(); [3] 혼아갤로그로 이동합니다. 09.11.07 77 0
156096 pthread_mutex_lock은 thread에서만 block동작하나 [5] w(222.238) 09.11.07 80 0
156095 프갤횽들 유명한 잘 못 설계된 소프트웨어의 사례로 뭐가 있을까? [10] Oper(121.169) 09.11.07 163 0
156093 [중소기업 웹에이전시] 입사때 질문 & 실제 [1] 파리목숨(211.211) 09.11.07 118 0
156092 질문있습니다! structure array의 크기에대해서 [4] 초보자!(121.170) 09.11.07 54 0
156091 스트럿츠2는 뭐고 MVC는 또 뭐하는거야? [1] 신발라마갤로그로 이동합니다. 09.11.07 57 0
156090 C++이랑 JAVA를 처음 시작하는데 가장 좋은 책좀 추천해주세여 [3] 대요정갤로그로 이동합니다. 09.11.07 148 0
156089 횽들 C++로 먹고살려면 어느정도까지 수련해야 하나여 [2] 대요정갤로그로 이동합니다. 09.11.07 122 0
156088 MEX 관련 매트랩 작업중 자폭임여.. [1] JabberWock갤로그로 이동합니다. 09.11.07 46 0
156087 PHP 어렵슴? [1] 맥콜(124.61) 09.11.07 133 0
156086 usb미니 키보드를 샀는데 [5] Vita500갤로그로 이동합니다. 09.11.07 144 0
156085 Visual Studio 2008 설치중 데이터파일 문제 질문이요ㅠㅠ [6] 티아시아갤로그로 이동합니다. 09.11.07 101 0
156084 Scala는 나쁜 언어임 [1] 어디에도(58.184) 09.11.07 151 0
156083 한국좋음? [9] aster(125.186) 09.11.07 204 0
156082 Creative t40으로 타루의 L.O.V.E를 들으니 [2] dosuser갤로그로 이동합니다. 09.11.07 63 0
156081 유머있는 남자가 되는법 [2] Vita500갤로그로 이동합니다. 09.11.07 134 0
156080 다음주 수요일 유리한갤로그로 이동합니다. 09.11.07 69 0
156079 타루만세 유리한갤로그로 이동합니다. 09.11.07 62 0
156078 스케치북에 타루 나온다. dosuser갤로그로 이동합니다. 09.11.07 41 0
156076 SQL 문 select,from,where 순서 상관없나요? [9] 성대아싸(121.137) 09.11.07 147 0
156075 이거 DDOS인가 걸린건가? [2] 해커(112.146) 09.11.07 91 0
156074 유희열의 스케치북 시작합니다. [2] 유리한갤로그로 이동합니다. 09.11.07 92 0
156073 The state of the art dosuser갤로그로 이동합니다. 09.11.07 57 0
156072 어쩌라고.swf [2] .(121.124) 09.11.07 109 0
156070 총리가 너무 똑똑해총리가 너무 똑똑해총리가 너무 똑똑해총리가 너무 똑똑해 [3] 이모군(58.235) 09.11.07 97 0
156069 16중 for문. [1] 씬입사원갤로그로 이동합니다. 09.11.07 109 0
156067 니들 그거 알아요?? [5] 써타니갤로그로 이동합니다. 09.11.07 73 0
156066 저는 꿈이있습니다 [6] .(121.124) 09.11.07 85 0
156065 우리과는 교수님이 직접쓰신 교재를 보는데 [9] 써타니갤로그로 이동합니다. 09.11.07 164 0
156064 베이직C++어디서 받죠? [5] .(121.124) 09.11.07 57 0
156063 이중포문으로해서 뽑았는데요..이거 메모장으로 출력하는거..어캐해요?? [6] 그림자무지개갤로그로 이동합니다. 09.11.06 73 0
156062 완전 초짜인데요 C언어 책좀 추천해주세요 [20] .(121.124) 09.11.06 134 0
156060 아... repaint()는 정녕 for문이 안돌아가는것인가 [3] 캐빈민(123.109) 09.11.06 45 0
156059 제 파티션 좀 살려주셔열 [13] 이상수(211.207) 09.11.06 107 0
156058 뉴비에게...도움을...주세요....횽들...제발! [6] 그림자무지개갤로그로 이동합니다. 09.11.06 74 0
156057 내가 예언 하나 하지. [1] 숙신갤로그로 이동합니다. 09.11.06 89 0
156056 고미뉴 하잉^^ [3] 숙신갤로그로 이동합니다. 09.11.06 92 0
156055 읭읭.. 다 날려버렸구낭. [4] 혼아갤로그로 이동합니다. 09.11.06 62 0
156054 슴막히는_구글.jpg [1] 숙신갤로그로 이동합니다. 09.11.06 133 0
156053 킹게이 vs 게이킹 [3] 어디에도(58.184) 09.11.06 77 0
갤러리 내부 검색
제목+내용게시물 정렬 옵션

오른쪽 컨텐츠 영역

실시간 베스트

1/8

뉴스

디시미디어

디시이슈

1/2