제가 여러분이 생각하시는 것보다 상당히 많은 레이아웃 및 게시판 스킨을 다뤄봤습니다.
그런데 이러한 스킨들을 보다보면 성능이 이상하게 느린 레이아웃이 있는 반면에 성능이 괜찮은 레이아웃이 있기 마련입니다.
스킨이 HTML 으로 갖춰져 있어서 아무런 생각없이 HTML으로 돌겠지라는 가볍게 생각하시는데, 거기에서 PHP함수라던지 쿼리 하는 경우 적지않게 많이 봅니다.
그래서 성능이 안좋아 질 수 있는 요인들중 한가지를 집어서 말씀해보려고 합니다.
보면 이런 형태로 스킨을 작성하시는 분들이 있습니다. (이는 하나의 예시일뿐이며 그냥 참고용으로 봐주세요)
1번 예시
{@
$args = new stdClass;
$args->module_srl = $module_srl;
$output = executeQuery('document.getDocumentList', $args);
}
위와 같이 직접 쿼리하는 경우가 많습니다.
그런데 이렇게 만드는 경우도 있습니다.
2번예시
{@
$args = new stdClass;
$args->module_srl = $module_srl;
$args->page = 1;
$output = executeQuery('document.getDocumentList', $args);
}
앞으로는 이렇게 하지말아주세요.
우선 이 방법이 나쁜이유는 다음과 같습니다.
스킨이라는 것은 HTML문서가 아니라 작성한 HTML 과 템플릿의 문법을 PHP으로 변환하는 과정을 거칩니다.
(자세한 정보는 이전 게시글 https://xetown.com/topics/1229684 링크를 참고하세요)
처음 변환하고 난다음 스킨파일을 수정하지 않는한 기존의 파일들을 만든 PHP파일을 계속 호출하는 방식으로 사용자의 브라우저에 출력해줍니다.
그런데 그 말은 사용자가 홈페이지에 접속 -> 페이지이동할때마다 해당 PHP파일이 실행이 같이 된다는 뜻이 됩니다.
즉 하나의 PHP파일을 실행하는 것이고 그 실행하는 곳에 쿼리가 있으면 한번의 페이지 이동 혹은 페이지 접속때마다 쿼리가 하나씩 늘어난다는 겁니다.
1번 2번 예시에서 만들어둔 쿼리가 있으면 이게 지속적으로 계속 쿼리를 실행하게 된다는 뜻이 됩니다.
근데 이건 직접적으로 디비를 쿼리한 것이 되기 때문에 캐싱도 안됩니다. (캐싱된 템플릿 파일은 그저 HTML을 PHP으로 실행하기 위해서 만들어둔 파일에 불가하고 거기에서 저런 쿼리문이 존재한다면 그 쿼리를 실행하게되는거죠)
그런데 이걸 한두개정도만 쓰신다면 상관없는데 XETown의 오른쪽 목록 처럼 여러게 붙이게 되면 환장합니다.
1번 예시이면 그나마 괜찮은데, 2번 목록일경우 대환장 파티하는 것이죠. 1번과 2번의 차이는 page가 들어간 것인데 이게 들어가면 일반 쿼리보다 훨신 많이 느려집니다... (게시물이 많아지면 많아질수록 느려질 수 밖에 없는 쿼리 방식입니다..)
그럼 바람직한 방법은 뭘까요..
사실 저렇게 사용되는 항목들은 대부분 위젯으로 대처가 가능합니다. {@으로 입력하셨던 항목들은 대부분 PHP항목입니다. 그렇다는건 위젯도 제작할 수 잇는 단계가 됩니다.
위젯으로 처리해주세요.
레이아웃 스킨등에서 직접쿼리하는 것과 위젯으로 직접 쿼리하는 것의 차이는 다릅니다.
스킨에서 바로 쿼리하게되면 스킨의 PHP코드가 캐싱되는것이라 실제 PHP코드는 다시 돌아가므로 매번 페이지 이동 접속시마다 디비를 쿼리하게됩니다.
그런데 위젯을 만들게되면 위젯에서 위젯캐시를 구성할 수 있습니다. (슈퍼캐시 혹은 위젯캐시모듈 자체에서 직접 가능합니다.)
이렇게 된다면 직접 쿼리한 결과값을 가지고 위젯스킨이 만든 결과물있죠? 그걸 직접 캐시하는 겁니다.
즉, 매번 실행시마다 쿼리하는게 아니라 거기에서 정한 시간마다 쿼리할 수 있게 되는 것 입니다.
바람직하게 코딩하는 방법은 이렇게 위젯을 활용하는 것이예요.
직접 쿼리하지말고 좀 작업이 번거롭더라도 이렇게 한번 해보세요.
여러분이 흔히 알고있는 대부분의 대형사이트들에서도 이런 호환성이나 성능을 고려했더라면 환호할 것입니다.
대형사이트들이 만들줄 몰라서 기능을 빼는게 아니라.. 추가하면 할수록 성능을 갈아먹으니 추가를 안하는 겁니다.
그런 부분 배려한번 해주신다면 좀 더 좋고 퀄리티 높은 제품으로 많은 사랑 받으실 수 있을거예요!
다들 화이팅! 으샤으샤 합시다~!!
그런데 스킨에서 특정 값을 구하기 위해 쿼리하는 것을 모두 위젯과 위젯스킨을 만들어 업로드해서 위젯의 코드를 생성해서 위젯코드를 스킨에 넣어 위젯의 템플릿이 출력되도록 해야 하나 하는 것에는 약간 갸우뚱 하게 됩니다.
이론적으로야 위젯에서 캐싱을 할 수 있기에 반복적인 db 쿼리를 줄일 수 있긴 하겠지만 이런 저런 이유로 db에서 값을 확인해야 할 경우가 많다면 단순히 이 결과 확인을 위해 위젯을 만들고 업로드해서 생성된 코드를 삽입하고 하는게 관리적인 측면에서 가능한지 의문이기도 합니다.
물론 위젯으로 만들어야 할 사이즈이면서 템플릿까지 꾸며야 한다면 위젯으로 당연히 제작하는게 맞죠.
저는 말씀 하신 부분에 고민을 스킨에서도 db에 조회해서 얻은 결과를 쉽게 캐시적용해서 그 캐시 만료 시간에 따라 쿼리 하는 코드에서 반환되는 것으로 할 수 있을 것 같은 고민은 해본적이 있습니다.
그런데 실제로 그렇게 하지 않은 이유는 그냥 매번 쿼리해도 큰 문제가 일어나지 않아서 그냥 매번 쿼리하도록 두고 말았죠.