년도 선택 select의 option이 2019년까지 하드코딩돼 있다?!

eojin·2021년 3월 24일
1

시리즈 소개

이 시리즈는 전임자의 코드(와 직업윤리)를 ㅈ내 까면서 레거시 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분은 버린 작업이 됐다.

굳이 교훈을 적자면:

  1. PHP는 '에이 설마 이게 내장함수가 있겠어?' 싶은 것조차 내장함수가 있기로 유명하다. 하물며 문자열의 left padding, 특정 범위의 정수 목록 배열 뽑기 등이야 말할 게 있겠는가. 그런 것을 찾아는 봐야 할 것이다.
  2. 그런 노력조차 하지 않고 그냥 "난 2019년 이후에 이 회사에 없을 예정이니까 2019까지만 적어둬야징~~~" 하고 작업하고 나간 전임자 놈들을 절대로 가만둬서는 안될 것이다.
profile
3년차 PHP 개발자입니다.

4개의 댓글

comment-user-thumbnail
2021년 3월 25일

ㅋㅋ 시리즈 재밋네요

1개의 답글
comment-user-thumbnail
2021년 3월 29일

흠 그러면 넘어온 value값과 비교값이 다를 것 같은데요?

1개의 답글