xe타운 1년 개근을 다짐하고 잘하고 있다고 생각했는데... 오늘 살표보니 7월 13일 하루 출석을 빼먹었네요 ㅠㅠ

하루 빼먹은것을 모르고 개근이라고 생각하고 있었네요 ㅎㅎㅎ

 

기념으로 출석부 로딩 속도를 향샹할 수 있는 방법이 있을까 소스를 조금 살펴봤습니다.

1. 출석부(7.0.3)의 기본 스킨을 살펴봤습니다.

2. 저는 xe전문가(?)가 아닙니다. 해결방법이 아니라 참고정도로만 생각하세요.-

 

사용자의 출결 상황을 로딩할때 db로 쿼리 날리는 횟수가 너무 많은것을 발견했습니다.

일별로 하나씩 쿼리를 날려서 해당일자에 사용자가 출석했는지 체크를 해서 화면에 표시합니다.

이번달(7월)은 31일까지 있으므로 로딩할때마다 총 31번의 쿼리를 날리게 됩니다. 이는 때에따라 db에 상당한 부하를 가할 수 있습니다.

이를 한번의 쿼리로 사용자의 출석 일자를 모두 불러온 후 php단에서 출결을 체크 하도록 변경 해 봤습니다.

나름 기존의 코드 변경을 최소화 하는 방법을 생각해 봤습니다.

 

1. attendance/queries폴더에  getIsCheckedM.xml을 추가 합니다. 내용은 아래와 같습니다.

<query id="getIsCheckedM" action="select">
    <tables>
        <table name="attendance" />
    </tables>
    <columns>
        <column name="regdate" />
    </columns>
    <conditions>
<condition operation="equal" column="member_srl" var="member_srl" pipe="and"/>
<condition operation="like_prefix" column="regdate" var="day" pipe="and" />
    </conditions>
</query>

 

 

2. attendance폴더 아래의 attendance.model.php파일에 아래의 펑션을 추가합니다.

function getIsCheckedM($member_srl, $today)
{
$arg = new stdClass();
$arg->day = $today;
$arg->member_srl = $member_srl;
$output = executeQueryArray('attendance.getIsCheckedM',$arg);

$q_result = array(); 
foreach ($output->data as $value)
{
$q_result[] = substr($value->regdate, 0, 8);
}
return array_count_values($q_result);
}

 

 

3. attendance/skins/default 폴더아래 list.html을 열어서 아래를 참고해서 수정합니다.

<table cellspacing="0" class="listTable" width="100%">
{@$_day=1}
{@$j=0}
{@$check_month = sprintf("%s%s",$admin_date_info->_year,$admin_date_info->_month)}
{@$checkedM = $oAttendanceModel->getIsCheckedM($logged_info->member_srl, $check_month)}
<!--@while($_day <= $admin_date_info->day_max)-->
<!--@if($j%40 == 0)--><tr><!--@end-->
<!--@while($j <= $admin_date_info->week_start)-->{@$j++}<!--@end-->
<td height="35px;" <!--@if(sprintf('%04d%02d%02d',$admin_date_info->_year,$admin_date_info->_month,$_day) > date('Ymd'))-->class="stamp1"<!--@else-->class="stamp"<!--@end--> >
{@$check_date = sprintf("%s%s%02d",$admin_date_info->_year,$admin_date_info->_month,$_day)}
{@$checked = $checkedM[$check_date]}
<!--@if($checked == 1 && $is_logged)-->

11, 12라인 추가

18번 라인 {@$checked = $oAttendanceModel->getIsCheckedA($logged_info->member_srl, $check_date)} 을 위의 코드로 변경.

 

 

  • profile
    확인하고 다음패치에 적용할게요
  • profile profile
    감사합니다 ^^
  • ?
    이런 아이디어들이 모아져서 발전하는거죠 ㅎㅎ
  • ? profile
    데이터가 많이 쌓인 xe타운같은곳에서는 어떨지 모르겠지만 제 테스트 서버에서는 확실히 속도 향상은 됩니다.
  • profile
    말씀하신 부분 한번 수정해보았습니다.
    https://github.com/bjrambo/attendance/commit/f3619a58f100feb86a5d2765af494b23e87713ab
  • profile
    이렇게 발전 되어가는 거군요!
  • profile
    이제 적용만 남은거군요
    빠른 출석부가 짜잔 하고 열리면
    더 많은분들이 출석하실것 같아요
  • profile
    감사합니다.