Skip to content
isdnetworks
Go back

화면 파일에 업무 로직이 있었다

값이 잘못 나온다는 얘기를 듣고 고치러 갔는데 계산하는 곳이 Java 클래스에 없었다.

Table of contents

Open Table of contents

화면 파일에 있었다

JSP 를 열어 보니 거기 있었다. 할인율을 곱해서 합계를 내는 반복문이 <table> 을 그리는 코드 사이에 스크립틀릿으로 들어 있었다.

<%
  for (int i = 0; i < list.size(); i++) {
    Item it = (Item) list.get(i);
    if (it.getType() == 1) total += it.getPrice() * 0.9;
    else                   total += it.getPrice();
  }
%>

찾는 데 시간이 걸린 이유가 여기 있었다. Java 에 있으면 Eclipse 에서 클래스 이름으로 찾는다. JSP 에 있으면 grep 으로 .jsp 를 훑어야 한다.

같은 계산이 여러 곳에 있었다

grep 으로 훑으니 비슷한 계산이 세 .jsp 에 각각 있었다. 그리고 셋이 조금씩 달랐다.

화면 A   0.9
화면 B   0.9
화면 C   0.85

할인율이 하나만 달랐다. 어느 것이 맞는지는 내가 판단할 수 없었다. 물어보니 0.9 가 맞고 C 가 옛 값이었다. 할인율을 바꿀 때 한 곳을 놓친 것이다.

한 곳에 있으면 거기만 고치면 된다. 여러 곳에 있으면 전부 찾아야 하고 그러다 하나가 남는다.

밖으로 뺐다

계산을 Java 클래스로 옮기고 JSP 에서는 부르기만 하게 했다. 세 화면이 같은 함수를 부르니 한 곳을 고치면 셋 다 바뀐다.

부수 효과로 JSP 가 짧아졌다. Java 코드 스무 줄이 빠지고 <table> 만 남으니 화면 구조가 눈에 들어왔다.

같은 JSP 에 MySQL 조회도 있었다. DriverManager 로 직접 붙고 쿼리를 던지는데 close() 가 없었다.

오래 켜 두면 안 붙는 일이 실제로 났다. Tomcat 의 DBCP 는 maxActive 기본값이 8 이다. 여덟 개가 안 돌아오면 그다음은 maxWait 만큼 기다리다 실패한다.

SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object

조회를 밖으로 빼고 finally 에서 닫게 했다. JSP 는 받아서 보여 주기만 한다.

왜 JSP 에 있었는지는 짐작이 된다. 급할 때는 거기 바로 쓰는 것이 빠르다. 한 번 그러면 다음도 그렇게 된다.

화면의 일과 밖의 일

작업하면서 선을 하나 그었다. JSP 에는 값을 꺼내 보여 주는 것만 둔다. 계산과 조회와 판단은 밖에서 한다.

다만 JSP 에도 조건은 필요했다. 할인 표시를 보일지 말지는 화면의 일이다. 경계를 이렇게 잡았다. 보여 줄지 말지는 화면이 정한다. 값이 얼마인지는 밖에서 정한다. 값을 만드는 것과 값을 보이는 것을 나눈 것이다.

JSP 에 남은 스크립틀릿도 JSTL 과 EL 로 바꿨다. <c:forEach> 로 돌고 ${item.price} 로 꺼낸다. 짧아지고 읽기 쉬워졌는데 차이가 하나 더 있었다. 스크립틀릿은 값이 없으면 NullPointerException 이 나고 EL 은 빈 칸이 된다. 목록이 비어도 화면이 안 깨지는 것은 좋다. 대신 값이 없다는 것을 모르고 지나친다. 둘 다 장단이 있어서 안 깨지는 쪽을 골랐다.

정리


Share this post on:

Previous Post
인자 없이 실행했더니 운영에 나갔다
Next Post
안 보이는 문자 하나가 스크립트를 막았다