주제: 네이버 메인, 도와주세요. ㅡㅡ;

안녕하세요? NHN 웹표준화팀에서 공통업무(이것저것)를 담당하고 있는 정찬명 입니다.

오늘 여러가지 소식통을 이용하여 네이버의 초기화면이 HTML Validator 를 통과했다는 소식을 접하셨을 줄로 믿습니다.
HTML Validation 인증은 HTML/CSS/Javascript 등 클라이언트단으로부터 초기화면의 성능을 최적화 하기 위한 조치의 일환이었는데요.

그럼에도 불구하고 체감적으로 아직 멀었다고 느껴지시는 분들도 있는것 같습니다.
저희는 아직 더 많은 개선의 여지가 있을지도 모른다고 생각합니다.

그중 한 가지가 바로 CSS와 Javascript 코드의 삽입방식 입니다.

최근 한번이라도 각종 포털 초기화면의 HTML 코드를 열어보신 분들은 Naver가 Daum이나 Yahoo와 어떻게 다른지 눈치채셨을 줄로 압니다.
Naver는 HTML을 제외한 대부분의 CSS/JS 코드를 외부에서 불러들이는 External 방식을 사용하고 있고,
Yahoo는 대부분의 CSS/JS 파일을 HTML 안에 포함시키는 Internal 방식을 사용하고 있는데,
개인적으로 조사해본 비공식 데이터의 의하면 Yahoo는 Naver와 Daum 보다 초기화면에서 출력하는 파일(HTML+CSS+JS)의 용량은 훨씬(약2배 가까이) 더 많지만
External 방식으로 불러들이는 파일의 수가 1/3 수준으로 적다는 것을 알았습니다.

HTTP 요청수를 줄이는 것이 파일의 용량을 줄이는 것보다 더 더 중요하다는 것을 입증할 수 있는 '객관적인 !important' 데이터나 자료, 또는 또다른 가설을 찾습니다.
도와주세요.

최종 편집 : dece24 (2008-03-10 09:50 PM)

답변: 네이버 메인, 도와주세요. ㅡㅡ;

사실 요청 수를 줄이는 것과 파일 크기를 줄이는 것은 큰 차이가 없는 작업이라고 봅니다.
요청 수를 줄이게 되면 결과적으로 주고 받는 패킷의 양이 줄어들고, 결국 파일 크기를 줄이는 것과 같은 효과가 되겠죠.
만약 3개의 개별 스타일시트를 포함한 HTML 문서를 가져온다면, (HTTP 헤더) * 4 + (HTML 용량) + (스타일시트 용량)일텐데 이걸 전부 HTML에 합쳐버리면 (HTTP 헤더) * 3만큼 줄어들게 되는 것이죠.

그 외의 규칙에 대해서는 다음 페이지에 잘 나와있어요.
http://developer.yahoo.com/performance/rules.html

최종 편집 : ditto (2008-03-10 10:59 PM)

답변: 네이버 메인, 도와주세요. ㅡㅡ;

http://developer.yahoo.com/performance/rules.html

HTTP 리퀘스트 수는 사용자 환경에 영향을 많이 받기 때문에 객관적으로 뭐가 맞다고 말하긴 힘들 것 같고요. HTTP 요청수를 줄이는 것이 파일의 용량을 줄이는 것 보다 항상 더 중요하다고 말할 수는 없을 것 같습니다. 제 짧은 식견에 제일 좋은 것은 외부 CSS 한개, 외부 JS 한개로 하는 것이 아닐까 싶네요.

written by hyeonseok.com

답변: 네이버 메인, 도와주세요. ㅡㅡ;

의견 감사드립니다.
죄송하지만 제가 많이 부족해서 보다 정확하게 이해하기 위해서 추가질문을 드려야 할 것 같습니다.

ditto님의 의견중
'만약 3개의 개별 스타일 ... ' 이후 문장을 정확하게 이해하지 못했는데요. 조금 더 쉽게 풀어주실 수 있을까요?

현석님의 의견중
'http 리퀘스트 수가 사용자 환경에 영향을 많이 받기 때문에...' 라는 문장에 대한 보다 상세한 설명을 부탁드려도 될까요?

두 분의 견해가 '널리 인간을 이롭게 한다' 고 생각해 주시고 염치없게도 추가질문 올립니다.
거듭 감사드립니다.

답변: 네이버 메인, 도와주세요. ㅡㅡ;

짧은 식견으로나마...

보통 브라우저 동시 커넥션 수가 2정도라서 한 페이지 내의 컴포넌트가 많은 경우 완성 시간이 느려질 것입니다. 리퀘스트 횟수를 줄이는 것은 First-time visitor를 고려하는 것인데 사실 Naver 첫페이지는 매일 방문되는 경향이 강하므로 오히려 브라우저 캐시를 적극적으로 활용하여 JS와 CSS는 따로 분리하는 것이 오히려 맞을 것입니다.

expire 없는 이미지나, 시도때도 없이 바뀌는 이미지가 문제겠지 한국 네트웍 상황에서 JS, CSS 불러오는 것은 일도 아니고, 브라우저 캐시타면 뭐. FPS때문에 가정들이 ping 하나는 끝내줍니다.


포털 첫페이지 특성상 엄청난 이미지를 불러오고 이것이 여러서버에 나누어져 있어서 좀 문제인 것 같습니다.

다른 문제로는.. AD쪽이나 wwwlogin등의 JS들이 라인바이라인 document.write를 하고 있다거나(이름하여 브라우저 학대)... 음.. 계속 읽어보니 광고만 빼도 10만배쯤 빨라질거 같네요 --;

일단 저같으면 광고 JS들부터 다 뒤집어 엎고 봐야 겠습니다. 프로파일링이 너무 힘들어요 -ㅅ-
벨리데이터 통과해봐야 JS들이 다 망쳐놓고 있고.(JS에서 나오는 HTML들이 꽤 되죠?) FireBug 사용중인 FF는 맨날 네이버만 만나면 죽어버리고 (사망 확률 40% 정도?)

답변: 네이버 메인, 도와주세요. ㅡㅡ;

의견 감사드립니다.
추가적으로 image 의 갯수만 따로 헤아려본 결과 daum=25, yahoo=89, naver=109 라는 재미있는 데이터도 나왔습니다.(물론, 대략적이며 가변적임)
즉, http request 횟수만 따지면 naver가 다른 포털들에 비하여 개선의 여지가 더 있다고 생각됩니다.

말씀주신대로 js 쪽의 문제에 대하여도 현재보다 더 성능개선의 여지가 있는지 한번 확인해 봐야 할 것 같습니다.
감사합니다.

답변: 네이버 메인, 도와주세요. ㅡㅡ;

파이어버그로 이미지 리퀘스트를 보니 Daum >Y!K > Naver 순인것 같은...

미네르바의 부엉이는 황혼과 함께 나래를 편다.
http://uidev.pe.kr

답변: 네이버 메인, 도와주세요. ㅡㅡ;

image/* 수를 세어보니 약간 유동적이긴 하지만 대략 daum(130) > naver(115) > kr.yahoo(100) 순이네요.

nate도 한번 봤더니 약 200여개네요. 후덜덜;;

dece24 wrote:

ditto님의 의견중
'만약 3개의 개별 스타일 ... ' 이후 문장을 정확하게 이해하지 못했는데요. 조금 더 쉽게 풀어주실 수 있을까요?

HTTP 리퀘스트 수(또는 헤더의 크기)가 css파일 3개(3개의 개별 스타일)만큼 줄어든다는 의미입니다.
하지만 개인적으로는 네이버 메인페이지의 인당 PV를 생각했을때 external로 빼서 캐쉬되도록 하는 것이 더 유리할거라 생각합니다.

external로 되어 있을 경우 사용자 한명이 n번 접속을 한다면 "(HTTP request) * 4 + (HTML 용량) + (css 용량) + ((HTTP request) * 1 + (HTML 용량)) * n"이 되지만, internal로 되어 있을 경우 "((HTTP request) * 1 + (HTML 용량) + (css 용량)) * n"이 됩니다.
대부분의 경우 HTTP request 3번보다 css 용량이 가지는 부담이 더 클거라 생각됩니다.
(특히 네이버의 경우 우리나라 특성상.. smile )

물론 이건 통계자료가 있어야 정확한 판단을 내릴 수 있겠지만 느낌상 안봐도 결과는 뻔할거란 생각이 드네요.;;

제 결론은 gendoh님 의견에 한표;;

최종 편집 : Peris (2008-03-11 09:52 AM)

답변: 네이버 메인, 도와주세요. ㅡㅡ;

서버에 걸리는 부하와 최종 사용자까지의 대역폭에 따라 달라질 문제라고 생각합니다.

아직 사용해보지 않으셨다면 간단히 HTTP 요청과 파일 전송 시간 등을 알아볼 수 있는 Load Time Analyzer(https://addons.mozilla.org/ko/firefox/addon/3371) 플러그인으로 테스트해보세요. 각각의 파일 전송 순서와 속도 등을 그래프로 보여줍니다.

네이버 메인의 경우에는 상대적으로 많은 이미지 파일이 전체 전송 시간을 늦추는 원인이라고 생각됩니다. 일단 HTML과 CSS는 타 포탈 사이트에 비해서 상당히 빨리 처리되는 것 같네요.

저도 gendoh님 말씀처럼 js와 이미지 파일을 최적화하는 것이 퍼포먼스 향상에 도움이 될 것이라 생각합니다.

답변: 네이버 메인, 도와주세요. ㅡㅡ;

dece24 wrote:

현석님의 의견중
'http 리퀘스트 수가 사용자 환경에 영향을 많이 받기 때문에...' 라는 문장에 대한 보다 상세한 설명을 부탁드려도 될까요?

문장이 이상한데 "http 리퀘스트 수에 의한 영향"이라고 하는게 더 정확하겠네요. 운이 나쁘면 더 오래 걸리고 운이 좋으면 좀 덜걸리고 하는게 리퀘스트 수에 의한 영향입니다. 운이 나빠서 유휴시간이 긴 요청이 앞부분에 몰리거나 먼저 요청 들어간 애들이 버벅대게 되면 그놈들 기다리느라 손해보는 부분이 생기게되죠. 운이 정말 나빠서 앞에서 버벅대고 스크립트 파일이 순서가 뒤로 밀리거나 하면 정말 느려질 수도 있겠죠. 저도 가끔 네이버 로그인 페이지에서 이런 상황을 겪습니다. 배너 용량이 너무 커서... 리퀘스트 수를 줄이면 일단 이렇게 문제가 발생될 상황이 줄어들고, 패킷도 꽉꽉 채워서 전송을 받기 때문에 훨씬 유리해 지게 됩니다. 운이 좋으면 전송이 잘 될테고요. 변수가 좀 많다는게 요지입니다.

written by hyeonseok.com

답변: 네이버 메인, 도와주세요. ㅡㅡ;

예전 포털에서 알바를 할시에 개발팀에서 유난히도 Internal방식을 고집하였었는데 그 이유는 각각의 파일서버가 다운시를 대비하고
http리퀘스트수를 최소하한다는 목적이였습니다. 그렇다하니 따르긴했지만 제 생각은 조금 다릅니다.

http리퀘스트를 줄여 체감속도를 높이기 위해서는 js파일과 css파일들을 각각 최소하하여 1~2개 내지로 줄이는것과 쓸대없는 image 수를 줄여서
합칠 수 있는 이미지는 합치는게 좋다고 생각합니다. 오히려 Internal방식의 경우 cash가 안됨으로 매번 full로 데이타를 읽어야 하지만
외부파일의 경우 cash효과로 인한 트래픽 감소도 절대 무시못할 수준입니다. (특히 대형사이트의 경우)

체감속도를 최적화 하기위해선 html부분의 역활도 크지만 디자인과의 타협(이미지 최소화)도 중요하다고 생각합니다~

뭔가 질문의 대답은 없고 제 생각만 끄적이니 민망하군요 흐흐...

답변: 네이버 메인, 도와주세요. ㅡㅡ;

웹페이지의의 퍼포먼스를 측정할 때 사람에 따라서 조금씩 다른 데이터가 나오는것 같아서 그래도 객관성을 확보할 수 있는 온라인 툴들을 몇개 찾아보았습니다. 이바닥에서 조금 오래 계셨던 분들이라면 한번쯤 본적이 있을법한 페이지들 이군요 ^^;

Octa Gate Site Timer
http://www.octagate.com/service/SiteTimer/?Target=AJAX
야후 개발자 네트웍에서 보여주었던 형식의 웹페이지 퍼포먼스 그래프는 이곳에서도 측정이 가능합니다.
하나의 웹페이지에서 로드하는 모든 요청들에 대하여 몇초가 걸리는지 그래프로 출력해줍니다.

Web Page Speed Report
http://www.websiteoptimization.com/services/analyze/
http request 부터 시작해서 html 페이지에 포함된 요소들의 용량과 속도 데이터들 비교적 세세하게 얻을 수 있습니다.

i Web Tool
http://www.iwebtool.com/speed_test/
여러개의 비교대상 웹사이트 URL 을 한번에 10개까지 지정해서 속도를 측정하고 비교할 수 있습니다.
이 툴은 용량과 속도만 측정하는데 다른 사이트와 쉽게 비교/평가할 수 있다는것이 장점 입니다.

wystan님께서 소개해주신 Load Time Analyzer 도 한번 사용해 봐야 겠습니다.

주신 의견들 많이 도움이 되었습니다.
감사합니다.

답변: 네이버 메인, 도와주세요. ㅡㅡ;

음 야후의 인라인 스타일은 야후 특성을 고려한 채택입니다.  야후 첫페이지를 찾는 방문자들의 많은 경우가 첫페이지만을 둘러보는 경우이기 때문에 request를 줄여 방문자들에게 페이지 응답시간이 최대한 빠르도록 최적화 시킨 부분입니다.  방문자에대한 바른 이해와 여러 리서치를 통한 결과로 판단을 내린 것인만큼, 네이버 또한 방문자의 특성을 보고 고민하실만한 부분이라고 생각됩니다.  야후의 55k 스타일시트와 많은 js 를 과감히 인라인으로 넣은것은 http request 를 내리는것이 데이터사이즈가 조금 커지는 것 보다 더 값비싼 결과물 이라는 것과 cache 되지 않으므로 인한 bandwidth 가 올라가는 것 보다 최대한의 속도 증가의 결과물을 내는것이 다시말해 방문자들의 만족도가 높아지는것이 결과적으로 이득이라는 결론을 내린것으로 봅니다.  만약 상당수의 네이버 첫 홈페이지 방문자들이 여러 페이지를 방문하는 성격을 지녔다면 external의 사용과 함께 cache 로 인한 이득을 볼수 있겠죠.  plog 님께서 말씀하신 체감속도를 높이는 방법들과 이미지 최소화는 절대필수인듯 하구요.  겐도님의 js 지적또한 중요하다고 생각됩니다.

꼭 이미지 숫자를 줄여야 한다면 네이버의 여러 작은 '방향' 버튼들이 같은 모양과 그림자가 적용된 동일한 이미지(몇몇은 몇px 차이의 버튼인듯) 임에도 불구하고 각각 다른 img 로 불려서 쓰이던데 개선될수 있는 부분이라고 생각됩니다.

저도 쓰고보니 영.. ㅠㅠ

<!--[if IE]>
<p>잘못 실행하신 브라우저 이거나 국번없는 브라우저 이오니, 다시한번 확인하시고 사용하시기 바랍니다.
유해브 컬드 롱 브라우저 오어 노 넘버.  플리즈 뜨라이 어게인.</p>
<! [endif] -->

답변: 네이버 메인, 도와주세요. ㅡㅡ;

파일을 불러올때 파일을 나눠 동시에 여러 파일을 불러올 수 있게 하는 방법이 좋은 방법 이긴 하겠으나
너무 잘게 짜르면 http call 을 통안 정보를 담는것이 더 부하를 가져오게 됩니다.
이것은 사이트마다 상황마다 다르니 그냥 테스트를통해 적절한 합의점을 찾으시는것이 좋다고 봅니다.

위엣분들도 많이들 말씀하셨지만 internal 방식과 external 방식은 부하 문제만 있는것이 아니라 파일 캐싱을 원하지 않는쪽도 있을테니까요.
네이버 같이 같은사용자의 pv 가 높은 경우 external 방식으로 js css 들을 분리하되 자주 변할 수 있는 부분들은 선별해서 page 에 삽입해야겠지요.

js를 나중에 핸들링하게 해서(가능한한 이미지 로딩 이후) 초기화면을 빠르게 보이게 하는 트릭 같은것도 한방법이라고 볼수 있을것도 같아요

얼굴때문에 심각한 얘기를 못하겠음

답변: 네이버 메인, 도와주세요. ㅡㅡ;

이 부분은 서버 관리자나 네트웤에 대한 이해도고 있으신분에게 질문하시는게 좋을것 같네요
일반적으로 http 서버와 사용자단에 요청은 제가 아는 바로는 이런 형식입니다

1. 사용자 컴퓨터에서 요청을 한다
2. 서버에서 요청에 대한 확인(?)을 보내주고
3. 다시 그 파일에 대한 요청을 하게 되며
4. 서버에서 그 파일의 내용을 보내준다
이런 형식입니다

단 한개의 파일을 받기 위해서는 왕복 두번이상의 응답이 이뤄지게 됩니다

이 사이에는 문제점일수도 있는 부분이 있는대

해외거나 등등 네트웍 상황이 좋지 않아 네트웍의 지연율이 높은 환경에서는 아무래도 응답이 빠를수가 없습니다
그러하여 상대적으로 다운속도 등과는 별게로 느린 사용감을 느끼게 됩니다.

그리고

야후 등 전 세계적으로 서비스를 하는 포털 등은 위의 문제와 더불어 등등의 이유로 internal방식을 따르고 있는 것으로 알고있습니다

그리고

서버에서 다량의 접속자가 동시적으로 발생할 경우 요청과 응답의 처리 횟수가 높아지기 때문에 요청 횟수를 줄이는 방식을 택하기도 합니다

단 무조건 요청 횟수를 줄이는것 만이 능사가 아닌  이유는

관리적인 측면 위에 말씀을 많이 하신 캐싱 문제 그리고 용량의 문제 등등으로 인해 꼭 줄이는 것만이 능사는 아닙니다.

이상입니다 : )

http://www.luka7.kr
천마디 말 보다 한번의 실천이 좋다.

답변: 네이버 메인, 도와주세요. ㅡㅡ;

안녕하세요.
최근에 본 책이 혹시 도움이 되지 않을까 해서 글을 적어봅니다.
다들 읽어보셨을지도..
High Performance Web Sites라는 책에서 발췌한 내용을 첨부합니다.

요약하자면,
같은 내용의 one HTML document that is 87K 와,
an HTML document (7K), one stylesheet (59K), and three scripts (1K, 11K, and 9K) for a total of 87K의
response times 을 비교해 봤더니...전자가 30%에서 50% 정도 더 빠르다는 것입니다.
이유는 overhead of multiple HTTP requests 때문이라고 합니다.
그럼에도 불구하고 이 책에서는 프론트엔드 성능향상을 위해서 "Make JavaScript and CSS External"라고 합니다.
이유는 캐쉬사용을 할 수 있어서라고 하구요.

이 책에서 "HTTP 요청수를 줄이는 것이 파일의 용량을 줄이는 것보다 더 더 중요하다" 라는 말은 찾을 수가 없습니다.
이 책에서 제안하는 것은.."HTTP 요청수를 줄여라" 그리고 "파일의 용량을 줄여라" 입니다.
이미지 리퀘스트가 이미 수십에서 수백에 이른데 css나 js파일 request를 줄이는데 너무 크게 개의치 않아도 되지 않을까 하는게 저의 생각입니다.
물론 css와 js는 하나만 만들어서 최소화 시키는 것이 좋을 것 같구요 smile
request 2번 더 날리는 것쯤은 괜찮지 않을까요?

다른 포탈들이 css나 js를 인라인으로 삽입한데는 단순히 request를 줄이는 것 외에, 다른 이유(위에서 다른 분들이 언급해주신)도 분명히 존재할 것이라고 생각합니다.
참고로, HTTP 리퀘스트가 많아진다는 것은 단순히 헤더의 용량이 늘어나는 것만은 아닙니다.
(아래에 관련 된 내용을 첨부했는데...음 그림도 없구... )

------------------------------------------------------------------------------------------
HTTP Overview 2
------------------------------------------------------------------------------------------
Before diving into the specific rules for making web pages faster, it’s important to
understand the parts of the HyperText Transfer Protocol (HTTP) that affect performance.
HTTP is how browsers and servers communicate with each other over the
Internet.The HTTP specification was coordinated by the World Wide Web Consortium
(W3C) and Internet Engineering Task Force (IETF), resulting in RFC 2616.
HTTP/1.1 is the most common version today, but some browsers and servers still
use HTTP/1.0.
HTTP is a client/server protocol made up of requests and responses.A browser
sends an HTTP request for a specific URL, and a server hosting that URL sends back
an HTTP response.Like many Internet services, the protocol uses a simple, plaintext
format.The types of requests are GET, POST, HEAD, PUT, DELETE,
OPTIONS, and TRACE.I’m going to focus on the GET request, which is the most
common.
A GET request includes a URL followed by headers.The HTTP response contains a
status code, headers, and a body.The following example shows the possible HTTP
headers when requesting the script yahoo_2.0.0-b2.js.
GET /us.js.yimg.com/lib/common/utils/2/yahoo_2.0.0-b2.js

Compression
The size of the response is reduced using compression if both the browser and server
support it.Browsers announce their support of compression using the Accept-
Encoding header.Servers identify compressed responses using the Content-Encoding
header.
Notice how the body of the response is compressed.Chapter 4 explains how to turn
on compression, and warns about edge cases that can arise due to proxy caching.
The Vary and Cache-Control headers are also discussed

Conditional GET Requests
If the browser has a copy of the component in its cache, but isn’t sure whether it’s
still valid, a conditional GET request is made.If the cached copy is still valid, the
browser uses the copy from its cache, resulting in a smaller response and a faster user
experience.
Typically, the validity of the cached copy is derived from the date it was last modified.
The browser knows when the component was last modified based on the Last-
Modified header in the response (refer to the previous sample responses).It uses the
If-Modified-Since header to send the last modified date back to the server.The
browser is essentially saying, “I have a version of this resource with the following last
modified date. May I just use it?”

If the component has not been modified since the specified date, the server returns a
“304 Not Modified” status code and skips sending the body of the response, resulting
in a smaller and faster response.In HTTP/1.1 the ETag and If-None-Match headers
are another way to make conditional GET requests.Both approaches are
discussed in Chapter 13.
Expires
Conditional GET requests and 304 responses help pages load faster, but they still
require making a roundtrip between the client and server to perform the validity
check.The Expires header eliminates the need to check with the server by making it
clear whether the browser can use its cached copy of a component.
When the browser sees an Expires header in the response, it saves the expiration
date with the component in its cache.As long as the component hasn’t expired, the
browser uses the cached version and avoids making any HTTP requests.Chapter 3
talks about the Expires and Cache-Control headers in more detail.
Keep-Alive
HTTP is built on top of Transmission Control Protocol (TCP).In early implementations
of HTTP, each HTTP request required opening a new socket connection.This
is inefficient because many HTTP requests in a web page go to the same server.For
example, most requests for images in a web page all go to a common image server.
Persistent Connections (also known as Keep-Alive in HTTP/1.0) was introduced to
solve the inefficiency of opening and closing multiple socket connections to the same
server.It lets browsers make multiple requests over a single connection.Browsers
and servers use the Connection header to indicate Keep-Alive support.The
Connection header looks the same in the server’s response.
The browser or server can close the connection by sending a Connection: close
header.Technically, the Connection: keep-alive header is not required in HTTP/1.1,
but most browsers and servers still include it.
Pipelining, defined in HTTP/1.1, allows for sending multiple requests over a single
socket without waiting for a response.Pipelining has better performance than persistent
connections.Unfortunately, pipelining is not supported in Internet Explorer (up
to and including version 7), and it’s turned off by default in Firefox through version
2.Until pipelining is more widely adopted, Keep-Alive is the way browsers and servers
can more efficiently use socket connections for HTTP.This is even more important
for HTTPS because establishing new secure socket connections is more time
consuming.
There’s More
This chapter contains just an overview of HTTP and focuses only on the aspects that
affect performance.To learn more, read the HTTP specification (http://www.w3.org/
Protocols/rfc2616/rfc2616.html) and HTTP: The Definitive Guide by David Gourley
and Brian Totty (O’Reilly; http://www.oreilly.com/catalog/httptdg).The parts highlighted
here are sufficient for understanding the best practices described in the
following chapters.



---------------------------------------------------------------------------------
In Raw Terms, Inline Is Faster
---------------------------------------------------------------------------------
I have generated two examples that demonstrate how inlining JavaScript and CSS
results in faster response times than making them external files.
Inlined JS and CSS
http://stevesouders.com/hpws/inlined.php
External JS and CSS
http://stevesouders.com/hpws/external.php
The inline example involves one HTML document that is 87K, with all of the Java-
Script and CSS in the page itself.The external example contains an HTML document
(7K), one stylesheet (59K), and three scripts (1K, 11K, and 9K) for a total of
87K.Although the total amount of data downloaded is the same, the inline example
is 30–50% faster than the external example.This is primarily because the external
example suffers from the overhead of multiple HTTP requests (see Chapter 1 about
the importance of minimizing HTTP requests).The external example even benefits
from the stylesheet and scripts being downloaded in parallel, but the difference of
one HTTP request compared to five is what makes the inline example faster.
Despite these results, using external files in the real world generally produces faster
pages.This is due to a benefit of external files that is not captured by these examples:
the opportunity for the JavaScript and CSS files to be cached by the browser.
HTML documents, at least those that contain dynamic content, are typically not
configured to be cached.When this is the case (when the HTML documents are not
cached), the inline JavaScript and CSS is downloaded every time the HTML document
is requested.On the other hand, if the JavaScript and CSS are in external files
cached by the browser, the size of the HTML document is reduced without increasing
the number of HTTP requests.
The key factor, then, is the frequency with which external JavaScript and CSS components
are cached relative to the number of HTML documents requested.This
factor, although difficult to quantify, can be gauged using the following metrics.

답변: 네이버 메인, 도와주세요. ㅡㅡ;

luka7 wrote:

이 부분은 서버 관리자나 네트웤에 대한 이해도고 있으신분에게 질문하시는게 좋을것 같네요
일반적으로 http 서버와 사용자단에 요청은 제가 아는 바로는 이런 형식입니다

1. 사용자 컴퓨터에서 요청을 한다
2. 서버에서 요청에 대한 확인(?)을 보내주고
3. 다시 그 파일에 대한 요청을 하게 되며
4. 서버에서 그 파일의 내용을 보내준다
이런 형식입니다

단 한개의 파일을 받기 위해서는 왕복 두번이상의 응답이 이뤄지게 됩니다

이 사이에는 문제점일수도 있는 부분이 있는대

해외거나 등등 네트웍 상황이 좋지 않아 네트웍의 지연율이 높은 환경에서는 아무래도 응답이 빠를수가 없습니다
그러하여 상대적으로 다운속도 등과는 별게로 느린 사용감을 느끼게 됩니다.

딴 건 모르겠고, 위의 내용에 대해 부연하자면...

client 에서 server 에 HEADER 정보를 요청합니다. 그 리퀘스트를 아주 간단히 하면 다음과 같습니다.

HEAD /index.php HTTP/1.1
Host: forum.standardmag.org

최소화 하면 위와 같지만 실제로는 Gzip 을 지원하는지, 어떤 언어를 선호하는지, Connection 을 이 요청만 처리하고 닫아버릴지 아님 다른 요청을 기다릴지 등등이 함께 넘어가기 때문에 1~2K 정도는 될거에요. 이건 echo 서버를 열어놓고 브라우져로 그 페이지를 들어가보면 바로 보이는데... 제가 졸작으로 웹서버를 만들 때 실험했던 자료나 데이타를 다 날려먹어서 -_-;; 보여드릴 수가 없네요.

하여튼 실제로 telnet 커맨드를 사용해서 실제 어떤 식으로 정보가 오가는지를 보여드리면 다음과 같습니다.

# telnet standardmag.org 80
Trying 61.109.245.78...
Connected to standardmag.org.
Escape character is '^]'.
HEAD / HTTP/1.1
Host: standardmag.org

HTTP/1.1 301 Moved Permanently
Date: Thu, 13 Mar 2008 17:52:11 GMT
Server: Apache
Location: http://forum.standardmag.org/
Content-Type: text/html; charset=iso-8859-1

HEAD / HTTP/1.1
Host: forum.standardmag.org

HTTP/1.1 200 OK
Date: Thu, 13 Mar 2008 17:52:19 GMT
Server: Apache
X-Powered-By: PHP/5.2.5-p20080206-pl3-gentoo
Expires: Thu, 21 Jul 1977 07:30:00 GMT
Last-Modified: Thu, 13 Mar 2008 17:52:20 GMT
Cache-Control: post-check=0, pre-check=0
Pragma: no-cache
Content-Type: text/html

Connection closed by foreign host.

보시면 볼드로 표시한게 제가 타이핑 한 것이구요. 저런 식으로 헤더 정보를 확인한 뒤 Last-Modified 에 나와있는 시간을 이용해서 캐쉬가 유효한지를 확인하고 실제 GET 커맨드를 이용해서 데이타를 받아오게 되죠.

캐쉬가 있더라도 아예 요청을 안하는건 아니에요. smile



그리고 유심히 보신 분은 이미 알아채셨겠지만, telnet standardmag.org 80 명령은 한 번만 입력했음에도 불구하고 여러 리퀘스트를 날릴 수가 있습니다. HTTP 1.1 에 추가된 keep-alive 가 바로 이거구요. 이걸 이용하면 tcp connection overhead 를 줄일 수가 있습니다.


만약 채널 상태가 그리 양호하지 못해서 데이타가 전송되는 속도가 걱정된다면 데이타를 Gzip 으로 압축해서 보내는 것을 고려해보세요. 요새 쓰이는 대부분의 브라우져에서 이 기능을 제공하고 있고, 이 기능을 제공하지 않는다면 client 에서 보내준 헤더 정보를 참고해서 이 기능을 사용하지 않게 됩니다.

http://httpd.apache.org/docs/2.0/ko/mod … flate.html


html 이나 css 나 js 나 전부 텍스트다보니 gzip 등으로 압축하면 압축효율이 굉장할 거 같은데요 -_-!

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

답변: 네이버 메인, 도와주세요. ㅡㅡ;

심심해서 (12시간 후에 졸업시험봐야하는데 --;; ) 예전에 만들어뒀던 웹서버를 가지고 헤더를 캡춰해봤습니다.

firefox 에선 헤더를 다음과 같이 보내줍니다. (캐쉬에 없으면 HEAD 정보를 안이용하고 바로 GET 입니다.)

GET / HTTP/1.1
Host: unfix.net
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; ko; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12
Accept: application/x-shockwave-flash,text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: ko-kr,ko;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: EUC-KR,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive

인터넷 익스플로러에선 다음과 같구요.

GET / HTTP/1.1
Host: unfix.net
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; ko; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12
Accept: application/x-shockwave-flash,text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=
read data 0.8,image/png,*/*;q=0.5
Accept-Language: ko-kr,ko;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: EUC-KR,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive

흠 대강 보니 유져에이젼트 스트링을 제외하곤 거기서 거기군요.

저기서 Accept-Encoding 을 보면 gzip 이나 압축해서 데이타를 보내도 된다고 얘기하고 있네요. Keep-Alive 란 헤더를 이용해서 300초 동안 다음 요청을 기다리겠다고 하고 있구요.

오랫동안 꿈을 그리는 사람은 그 꿈을 닮아간다...

http://mytears.org ~(~_~)~
나 한줄기 바람처럼..

답변: 네이버 메인, 도와주세요. ㅡㅡ;

정태영 wrote:

심심해서 (12시간 후에 졸업시험봐야하는데 --;; ) 예전에 만들어뒀던 웹서버를 가지고 헤더를 캡춰해봤습니다.

firefox 에선 헤더를 다음과 같이 보내줍니다. (캐쉬에 없으면 HEAD 정보를 안이용하고 바로 GET 입니다.)

GET / HTTP/1.1
Host: unfix.net
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; ko; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12
Accept: application/x-shockwave-flash,text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5
Accept-Language: ko-kr,ko;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: EUC-KR,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive

인터넷 익스플로러에선 다음과 같구요.

GET / HTTP/1.1
Host: unfix.net
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; ko; rv:1.8.1.12) Gecko/20080201 Firefox/2.0.0.12
Accept: application/x-shockwave-flash,text/xml,application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=
read data 0.8,image/png,*/*;q=0.5
Accept-Language: ko-kr,ko;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encoding: gzip,deflate
Accept-Charset: EUC-KR,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive

흠 대강 보니 유져에이젼트 스트링을 제외하곤 거기서 거기군요.

저기서 Accept-Encoding 을 보면 gzip 이나 압축해서 데이타를 보내도 된다고 얘기하고 있네요. Keep-Alive 란 헤더를 이용해서 300초 동안 다음 요청을 기다리겠다고 하고 있구요.

gzip을 사용한다고 해도 요청과 응답은 필수니까요~

기존적인 캐쉬도 마찬가지구요.

요청 횟수와... 관리자의 편의성 등등 적당한 타협점을 찾아야 겠지요 이런 부분은 역시 어느것이 답이다 라고 할 수 없지만

위에분 말씀처럼. 리퀘스트의 횟수를 줄여라~ 그리고 용량도 줄여라 -_-라고 밖에 할말이 없네요.

아무튼.. 일반적인 웹서피을 하다보면 다운속도가 가장 중요할 것 같지만 실질적으로는 지연율이 큰 영향력을 끼친 다는건 몸소 느끼고 있구요.

서비스 되는 지역 환경에 따라. 용량을 우선시 할지. 요청을 우선시 할지 알맞게 사용하는것이 좋을 것 같습니다 smile

우리나라에서 서비스 할것이라면 아무래도 상관없을지 모르겠지만요~ 서버 부담을 줄이기 위해 요청을 줄이는게 나을려나 = _=ㅎ

좋은 하루되세요 : )

http://www.luka7.kr
천마디 말 보다 한번의 실천이 좋다.

답변: 네이버 메인, 도와주세요. ㅡㅡ;

많은 답변들 다시한번 감사드립니다.
제가 소화하지 못한 답변들도 간혹 있었지만 어렴풋이라도 결론을 유추하는데 많은 도움이 되었습니다.

결국, 여러분들이 주신 답변을 근거로 현재의 네이버 메인에 필요한 처방을 우선순위 대로 정리해보면
1. CSS/JS 는 현안대로 External 방식으로 분리하는 것이 캐쉬를 활용할 수 있으므로 좋다.
2. 대신 CSS/JS/image/iframe 파일들은 최대한 Merge 시켜서 http 요청횟수를 줄일 필요가 있다.
3. 파일의 용량을 줄여라.

정도로 요약할 수 있을것 같습니다.
비교적 명쾌하군요 ^^;

좋은 하루 되세요.(__)