본문 바로가기
경력

[jstl]최악의 코드에서 그나마 나은 코드로...

by devebucks 2020. 4. 23.
728x90

 회사 업무 중에서  다음과 같이 DB에 저장이 되어있는 전화번호들이 있습니다. (같은 프로젝트 대리님이) 전화<tel:>가 되도록 해달라고 해서 JSP로 받아온 데이터${phoneNum} JSTL문법을 사용해서 문자열을 손을 보았습니다. 그런데 전화번호들이 뜻대로 되지 않았습니다..

 

여기서 문제가 무엇이었냐면요...

일단, 제가 작성한 알고리즘에서는 전화번호 문자열에 '~'가 한개만 있을 경우에는 그림처럼 잘 처리가 되었습니다.

 

 

그런데,

011-222-2222(3333) 처럼 괄호가 들어간다거나;;;

011-xxx-3xx0, 0xx-xx1-xxx4~5 이런 식으로 데이터가 들어오면,, 제가 작성한 알고리즘이 처리를 못하는 상화이 발생하게 되었습니다.

 

 

jstl로 문자열을 변경하는 방법으로 알고리즘을 작성하였고, 처음 코드를 짤 때는 뭐 이렇게 하면되지 했었습니다.....

 

.

.

하지만

.

.

 

다음 코드를 보면 알겠지만, 코드를 엉망으로 짜는 데에는 소질이 있어보이는 것을 알 수 있습니다. ㅠㅠ

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<c:choose>
    <c:when test="${phoneInfoDetail.phoneNumber !='' && phoneInfoDetail.phoneNumber != null}">
        <c:choose>
           <c:when test="${fn:contains(phoneInfoDetail.phoneNumber,'~') || fn:contains(phoneInfoDetail.phoneNumber,',')|| fn:contains(phoneInfoDetail.phoneNumber,'(')}">
                <c:if test="${fn:contains(phoneInfoDetail.phoneNumber,'~')}">
                    <a href="tel:${fn:split(phoneInfoDetail.phoneNumber,'~')[0]}">
                        ${phoneInfoDetail.phoneNumber}</a>
                 </c:if>
                 <c:if test="${fn:contains(phoneInfoDetail.phoneNumber,',')}">
                    <a href="tel:${fn:split(phoneInfoDetail.phoneNumber,',')[0]}">
                        ${phoneInfoDetail.phoneNumber}</a>
                 </c:if>
                 <c:if test="${fn:contains(phoneInfoDetail.phoneNumber,'(')}">
                    <a href="tel:${fn:split(phoneInfoDetail.phoneNumber,'(')[0]}">
                        ${phoneInfoDetail.phoneNumber}</a>
                 </c:if>                            
            </c:when>
            <c:otherwise>
                 <a href="tel:${phoneInfoDetail.phoneNumber}">
                    ${phoneInfoDetail.phoneNumber}</a>
             </c:otherwise>
         </c:choose>
     </c:when>
     <c:otherwise>
        -
     </c:otherwise>                                                                                        
 </c:choose>

 

보셨나요? 저의 코드를? ...

 

 

어쩔 수 없었습니다. ㅋㅋ 누가 알려주거나 지적해주는 사람이 없기 때문에 저런 날코딩에 의한 사고가 발생하고 있어습니다. 초 야매로 코드를 짜고 있습니다. 자괴감이 많이 드는 코드가 아닐 수 없습니다.

 

저 코드는 조건문에 잘 걸리기는 하는데, split으로 만 나누고 있는게 문제였고, 조건문이 저렇게 많은 것도 위험하다고 생각했습니다.

 

잘못 되고 있는 예를 들어서 보면, 데이터를 받아온 전화번호가 "0xx-xx1-xxx0, 0xx-xx1-xxx4~5" 들어왔을 때에는

결과 값이 "x3x-xx1-1110, xxx-xx1-xxx4" 이렇게 '~'만 빠지게 되는 식이었습니다. 

 

계속 <tel:>에 맞지 않은 전화번호가 나오길래 정말 이를 어떻게 고쳐야 할지 고민했었습니다.

그러서 결국....

 

복잡하긴 하지만, 조건문을 쓰지 않고, fn:substring()fn:indexOf()를 사용해서 전화번호 문자열을 처리해 주는 방식으로 다시 코드를 작성하기로 했습니다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<c:choose>
    <c:when test="${phoneInfoDetail.phoneNumber !='' && phoneInfoDetail.phoneNumber != null}">
        <a href="tel: ${fn:substring(
                            fn:substring(
                                fn:substring(phoneInfoDetail.phoneNumber,0,fn:indexOf(phoneInfoDetail.phoneNumber,'~')),
                                0,
                                fn:indexOf(phoneInfoDetail.phoneNumber,',')
                            ),
                           0,
                            fn:indexOf(phoneInfoDetail.phoneNumber,'(')
        )}">
        ${phoneInfoDetail.phoneNumber}</a>
     </c:when>
     <c:otherwise>
        -
     </c:otherwise>
</c:choose>
 

 

 

 초기에 제가 발견해서 망정이지, 다른 사람들이 이걸 봤으면 어떻게 생각했을까..... 하... 진짜 누가 알려주는 사람도 없고, 회사에서 리팩토링이나 코드를 서로 살펴보는 문화는 '1'도 없기 때문에 내가 만든 코드는 나만 알고, 나만 수정을 하는 식이었습니다. (발전 가능성 0)

 

아직도 뭔가 더 좋을 코드가 있을 것 같지만....

아직은 생각이 나지 않습니다.

 

정 안되면, 대리님들한테 물어봐야지..

728x90

댓글