Extra Form
PHP PHP 7.0
CMS XpressEngine

저는 아무리 소스를 봐도 어디부분에서 더 추가적인 작업이 요청되는지 알 수가 없어 궁금해서 질문을 다시 올립니다.

 

혹시 개발자분들 중에서  두 목록 스킨에서 코드를 보시고 일반목록이 오히려 응답이 오래걸리는 이유를 알려주실 수 있는지요.

 

제가 본 차이점이라곤...

공지목록이 일반목록에서는 공지가 아닌글과 함께 처리가 되는데 웹진과 갤러리 형태는 공지를 출력하는 파일을 별도로 불러오입니다.

 

 

소스를 보니 형태가 조금 많이 다르긴합니다. 웹진이나 갤러리 형태는 li 로 반복해서 출력만 하면 될 것 같고.

일반목록형은 table 형식이라 테이블 헤더 부분과 바디부분도 따로 있고.....

 

 

https://github.com/sketchbook/xe/blob/master/modules/board/skins/sketchbook5/_list_normal.html

 

 

https://github.com/sketchbook/xe/blob/master/modules/board/skins/sketchbook5/_list_webzine.html

  • profile

    일반목록은 루프를 두번돌립니다.

    <tr class="notice" loop="$notice_list=>$no,$document">
        <block loop="$list_config=>$key,$val">
        <td cond="$val->type=='no' && $val->idx==-1"..............

     

    미리 데이터를 뿌릴 자리가 정해져 있지 않아서 설정에 따라서 자리가 바뀌기 때문입니다.

    즉 자리가  $list_config 의 순서에 따라서 달라집니다.

    테이터 타잎을  "$list_config 의 순서에 맞추기 위해서  루프가 한번 더 돕니다.

     

    반면

    웹진타잎은  "$list_config 순서에 상관없으니 루프를 한번만 돌려도 됩니다.

    <li loop="$document_list=>$no,$document" class="<!--@if($document_srl==$document->document_srl)-->select <!--@end-->clear">

  • profile profile
    그럼 소스에서 분명히 성능차이가 날 수밖에 없는 것이 존재하는 것 이군요. 무척 궁금했던 내용인데 살짝 이해가 갈것 같습니다. 답변 감사합니다. 이래서 배워야 하나 봅니다 ㅋ
  • profile profile
    일반목록은 데이터 목록 순서를 마음대로 바꿀 수 있는 장점이 있습니다.
    웹지이나 갤러리는 속도가 빨라지지만 자리를 바꾸는 것은 소스를 수정하지 않는한 안되겠지요.
  • profile profile

    네. 기능을 위해 속도를 희생할 수 밖에 없는 것이네요. 하드웨어가 고사양이 될 수록 이런 희생은 극복될 수 있는 것이구요. 그냥 단순히 미미한 속도차이가 왜 나는지 궁금해서 미칠 것 같아서 저번에 한번 그리고 오늘 한번 다시 질문하게 되었네요 ㅋ

     

    모바일에서 모바일전용 목록(테이블형? 이었던가..) 그걸 쓰면 마찬가지로 속도가 향상되겠네요....

    https://github.com/sketchbook/xe/blob/master/modules/board/skins/sketchbook5/_list_m.html

     

    그리고 저희의 경우 모바일에는 전혀 다른 스킨을 써서 순서와 상관없는 스킨구조를 가지고 있어 PC보다 조금 더 빠른 반응을 보였던 것도 이제 이해가 되었네요.

  • profile

    그런데 이 방식이 참 비효율적이라는 생각도 드네요.
    게시판의 목록 설정은 1년에 한번 혹은 영원히 바뀌지도 않을 수 있는데 매번 게시판을 접속할때마다 매번 이렇게 작업을 한다는게 목록 대상의 배치 등을 편리하게 하기 위함이라고는 하지만...

    슈퍼캐시와 같은 모듈에서 해당 config 값을 캐시해서 6개월이던 1년이던 loop를 돌리지 않고도 목록의 대상을 배치를 곧바로 해줄 수 있다면 좋겠다는 생각이 들었습니다. 

     

    그런데 이건 db에서 가져오는게 아닌거 같고 loop 자체를 하지 않아야 하니 캐시하고는 관련성이 없을 것 같기는 하네요.

  • profile profile
    캐시가 출력물을 만들어서 저장했다가 뿌려주기만 하면 걱정이 없지만 그러기에는 저장용량문제도 있고 해서 대개는 데이터를 캐시했다가 프로세싱은 그때그때 하는 것같습니다.
    오늘 검색해보니까 squid가 아직도 프로젝트를 유지하고 있군요. http://www.squid-cache.org/
    초창기에 인터넷캐시에 사용되었는데 캐시폴더에 보면 완성된 HTML들이 쌓여있더군요.
    한번 캐시되면 서버는 가만이 있고 스퀴드가 응답을 하니 속도는 엄청 빨라지는 것은 사실이지만 동적인 변화에 대처하기 쉽지 않고 쌓이는 데이터 양이 워낙 어마어마해서 요즘에는 이런 방법 쓰는 캐시는 없을겁니다.

    대형사이트라면 어차피 목록배치는 바뀌지 않을테니 아예 고정된 목록으로 소스를 수정하는 것도 좋은 방법일 것같군요. 순서는 정해두고 list_config 에 들어있으면 출력하고 없으면 출력을 안하고...
  • profile profile

    네. 저도 시간이 나면 한번 고쳐볼 생각입니다. 한번 정해지면 오랜기간 고정해서 쓰는 것을 매번 반복해서 확인하는 것은 굉장히 비효율적으로 보이네요. 갤러리,웹진이 무거울 것이라는 생각을 실제 응답속도에서 반대의 결과를 확인하고 의문을 갖기 시작해서 여기까지 왔네요.

    사실 비회원에게 제공하는 슈퍼캐시의 전체화면캐시는 캐시된 것을 바로 보여주기 때문에 광속으로 서버에 부하도 줄여줍니다.

    그런데 로그인 대상까지는 제공하기 힘들어 게시판캐시 등의 옵션으로 대형사이트들은 게시판조회시 부하를 크게 줄여줄 수있습니다.

    그런데 오늘 답변을 통해 알게된 목록대상을 확인하고 출력하는 이부분은 정말 고쳐서 fix 된 것을 출력하게 만들고 싶은 정도의 비효율이네요.

     

    *아까 테스트로 조금 수정을 해보다가 저희 사이트에 사용자정의로 다르게 목록을 사용하는 곳이 몇군데 있어서 조금 여유있을때 고쳐보기로 했습니다.

  • profile profile

    수정하기 그리 어렵지는 않습니다.

    <block loop="$list_config=>$key,$val">
    			<th scope="col" cond="$val->type=='no' && $val->idx==-1" class="no"><span><a href="{getUrl('order_type',$order_type)}" title="<!--@if($order_type=="desc")-->{$lang->order_desc}<!--@else-->{$lang->order_asc}<!--@end-->">{$lang->no}</a></span></th>
    			<block cond="$val->type=='title' && $val->idx==-1">
    			<th scope="col" cond="!$mi->show_cate && $mi->use_category=='Y'" class="m_no"><span>{$lang->category}</span></th>
    			<th scope="col" class="title"><span><a href="{getUrl('sort_index','title','order_type',$order_type)}"><!--@if(!$mi->link_board)-->{$lang->title}<!--@else-->{$lang->link_site}<!--@end--><i cond="$sort_index=='title'" class="arrow {$order_icon}"></i></a></span></th>
    			</block>

    $list_config와 $val->type와 관련된 구문만 삭제하고 출력순서만 조정하시면 됩니다.

     

  • profile profile
    네.. 그부분은 쉬운데 사용자정의 부분을 어떻게 할지 고민을 좀더 해봐야 할 것 같아서요.
  • profile profile

    웹진 소스부분 참조 하시면 될 것같습니다.
    웹진에서도 확장변수 부분을 어쩔 수 없이 루프로 돌려서 하고 있습니다.

    <block cond="$mi->zine_extra || $mi->link_board">
    <block loop="$list_config=>$key,$val" cond="$val->idx!=-1">
    <span cond="$val->eid!='rating' && $document->getExtraValueHTML($val->idx)" class="itm br<!--@if($val->eid=='link_url')--> link_url<!--@end-->">{$val->name}<b>{$document->getExtraValueHTML($val->idx)}</b></span>
    <span cond="$val->eid=='rating'"><strong class="starRating"><span style="width:{$document->getExtraValueHTML($val->idx)*10}%">{$document->getExtraValueHTML($val->idx)}</span></strong></span>
    </block>
    </block>

    확장변수들들 여기저기에 분포시키는 것을 별로 효율적이지 않겠지요?
    한곳에 몽땅 모아서 출력했네요. 스킨에서 출력이 설정된 경우이거나 링크보드인 경우에만...
    list_config를 루프돌려서 확장변수만...

    K-20190108-565770.png

     

  • profile profile
    감사합니다. 이부분 참조해서 고민좀 해보고 적용해보겠습니다.
  • profile profile

    알려주신 덕분에 사용자정의 부분만 loop 돌려 확인하고 나머지는 fix 해서 처리해서 많이 빨라졌습니다. 감사합니다.

    - 웹진의 사용자정의 출력 옵션을 그대로 이용해서 일반목록에서 대부분 게시판에서는 사용자정의부분도 건너띄게 했구요,

  • profile
    차라리 목록 순서등을 위해서라면... 스킨에서 순서를 조정할 수 있는 옵션을 주고 순서를 조정하게 하는게 어떨지... 매번 확인하는건 좀 너무하다는 생각이 드네요. 제가 놓치는 다른 부분이 없다면 말이죠..

    일단 저희는 수정해서 굉장히 많은 시간을 줄였습니다. 물론 저희 서버가 좀 구리다는 반증이입니다.