시리즈 소개
이 시리즈는 전임자의 코드(와 직업윤리)를 ㅈ내 까면서 레거시 PHP 소스를 유지보수/리팩토링한 이력을 기술하는 시리즈입니다.
나쁘게 보면 제 우물에 침 뱉기이긴 하지만 좋게 보면 우리네 개발자들의 웃음과 애환이 서린 구비문학일 수 있겠지요.
혈압 상승 및 짠내 주의.
언제라도 퇴사할 수 있도록 지금 관리 중인 사내전산 어드민 소스를 다시 쭉 훑어보고 있는데 마침 메신저로 문의가 들어온다.
현재 정산관리 > 월별 정산서 확인 시 올해 2021년 정산서는 확인되지 않습니다.
이게 무슨 소리야? 하고 뷰를 열어보니, 년-월을 선택해서 월별 정산서를 조회하는 폼이 있는데, 년도 선택을 하는 select
태그 생긴 꼴이 가관이다.
$sel_year_list = array('2017'=>'2017','2018'=>'2018','2019'=>'2019');
<select name= "sel_year">
@foreach($sel_year_list as $key => $target)
<option value="{{$key}}" {{$sel_year == $key."" ? 'selected' : ''}}>{{$target}}</option>
@endforeach
</select>
와... 이 소스를 거쳐간 수많은 전임개발자 이 개XX들... 문자 그대로 오늘만 살다 갔구나!!!
단지 2017
부터 올해 년도까지의 정수를 쭉 나열한 배열이 필요하다면, 다음 한 줄이면 된다.
$years = range(2017, date('Y'));
아무리 생각해도 키와 값이 똑같은 연관배열을 하드코딩 박아서 처리하는 것과 range()
내장함수 실행 사이의 퍼포먼스/UX 등의 차이를 알 수가 없었다.
이걸 적용하기로 했다.
하다 보니 1~12월 선택 옵션을 주는 태그도 그런 식으로 해놨길래 같이 손봤다.
$sel_month_list = array('01'=>'01','02'=>'02','03'=>'03','04'=>'04','05'=>'05','06'=>'06','07'=>'07','08'=>'08','09'=>'09','10'=>'10','11'=>'11','12'=>'12');
<select name= "sel_month">
@foreach($sel_month_list as $key => $target)
<option value="{{$key}}" {{$sel_month== $key."" ? 'selected' : ''}}>{{$target}}</option>
@endforeach
</select>
↑ 이렇게 돼 있었고... 굳이 특이사항이라고 한다면 여기서는 1월 값이 "01"
로 찍혀야 하는 모양이다. ZERO LEFT PADDING이 적용돼야 한다는 것.
↓ 그래서 이렇게 고침.
<select name="sel_month">
@foreach (range(1, 12) as $month)
<option value="{{ sprintf('%02d', $month) }}" {{ $sel_month == sprintf('%02d', $month) ? 'selected' : '' }}>
{{ $month }}월
</option>
@endforeach
</select>
str_pad()
내장함수 사용해서 value를 얻었음.selected
부분이 작동을 안하겠더라. 그래서 어떻게 고칠까 하다가... range()
를 str_pad()
로 변환하는 array_map()
에 대해서 foreach
도는 작업은 너무 과한 연산일 거 같아서 과감하게 sprintf()
사용함. 1과 12 사이의 정수라면 width를 2로 잡아 찍고 비교하는 작업은 충분히 합리적이라 할 것이다.뭐 일단 이 소스는 앞으로 서기 9999년 12월말까지는 정상 작동할 것이다. 이런 소스가 심지어 여기저기 복붙돼 있어서 찾아서 고치느라 족히 30분은 버린 작업이 됐다.
굳이 교훈을 적자면:
ㅋㅋ 시리즈 재밋네요