Whiteship's Note


태그 파일 중복 제거 예제

View/JSP : 2008.09.17 14:08


스프링 form태그를 이용해서 태그 파일 두 개를 만들었습니다. 하나는 일반 text, 하나는 password입니다.

osaf/ftext.tag
<%@ tag pageEncoding="euc-kr" %>

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

<%@ attribute name="path" required="true" %>
<%@ attribute name="label" required="false" %>
<%@ attribute name="size" required="true" %>
<%@ attribute name="maxlength" required="true" %>
<%@ attribute name="desc" required="false" %>

<p id="${path}row">
    <label>${label} :</label>
    <form:input path="${path}" size="${size}" maxlength="${maxlength}"  />
    &nbsp;${desc}
    <form:errors path="${path}" cssClass="error" />
</p>

osaf/fpassword.tag
<%@ tag pageEncoding="euc-kr" %>

<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

<%@ attribute name="path" required="true" %>
<%@ attribute name="label" required="false" %>
<%@ attribute name="size" required="true" %>
<%@ attribute name="maxlength" required="true" %>
<%@ attribute name="desc" required="false" %>

<p id="${path}row">
    <label>${label} :</label>
    <form:password path="${path}" size="${size}" maxlength="${maxlength}"  />
    &nbsp;${desc}
    <form:errors path="${path}" cssClass="error" />
</p>

코드가 완전 똑같아 보입니다. 무슨 틀린그림 찾기도 아닌데, 차이를 발견하기가 힘듭니다. 어쩔까~~ 내비둘까.. 계속 다른 태그 만들까.. 중복을 제거하고 갈까.. 하다가. TDD 책이 생각났습니다.

꺠진 테스트 -> 코딩 -> 녹색 -> 리팩터링.

태그 파일도 이런 순으로 만들고 있습니다. 일단 뷰부터 만들고(저 태그를 사용하는 JSP 페이지부터 만들고) -> 태그를 작성합니다. -> 화면에 나오는지 확인!..

아무래도 리팩터링을 하고 넘어가야될 듯 합니다. 어떻게 할까.. 대충 떠오릅니다. 저 태그에서 또 다른 태그를 이용해서 화면에 뿌리면되고, 그 태그에 type을 넘겨줘서 그 태그 안에서 분기문으로 ..샤샥.. 유사코드는 떠오르는데 실제 코드는 안 떠오릅니다. OTL 코드는 제 블로그 어딘가를 치팅해가면서;; ㅋ

osaf/felement.tag
<%@ tag pageEncoding="euc-kr" %>

<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core_rt" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>

<%@ attribute name="path" required="true" %>
<%@ attribute name="label" required="false" %>
<%@ attribute name="size" required="true" %>
<%@ attribute name="maxlength" required="true" %>
<%@ attribute name="desc" required="false" %>
<%@ attribute name="type" required="true" %>

<p id="${path}row">
    <label>${label} :</label>
    <c:choose>
        <c:when test="${type =='text'}">
            <form:input path="${path}" size="${size}" maxlength="${maxlength}" />
        </c:when>
        <c:when test="${type =='password'}">
            <form:password path="${path}" size="${size}" maxlength="${maxlength}" />
        </c:when>
    </c:choose>
    &nbsp;${desc}
    <form:errors path="${path}" cssClass="error" />
</p>

좋아. 이 태그를 사용해서 확인해보니, 잘 동작합니다. 그럼 이제 기존의 코드들을 수정합니다.

osaf/ftext.tag
<%@ tag pageEncoding="euc-kr" %>
<%@ taglib prefix="o" tagdir="/WEB-INF/tags/osaf" %>

<%@ attribute name="path" required="true" %>
<%@ attribute name="label" required="false" %>
<%@ attribute name="size" required="true" %>
<%@ attribute name="maxlength" required="true" %>
<%@ attribute name="desc" required="false" %>

<o:felement type="text" label="${label}" path="${path}" maxlength="${maxlength}" size="${size}" desc="${desc}" />

osaf/fpassword.tag
<%@ tag pageEncoding="euc-kr" %>
<%@ taglib prefix="o" tagdir="/WEB-INF/tags/osaf" %>

<%@ attribute name="path" required="true" %>
<%@ attribute name="label" required="false" %>
<%@ attribute name="size" required="true" %>
<%@ attribute name="maxlength" required="true" %>
<%@ attribute name="desc" required="false" %>

<o:felement type="password" label="${label}" path="${path}" maxlength="${maxlength}" size="${size}" desc="${desc}" />

OK. 중복제거 완료 입니다. 덤으로 사용자에게 선택권이 생겼습니다. type 속성을 사용해가면서 felement를 직접 쓰거나, type 속성 쓸 필요 없이 ftext나 fpassword 엘리먼트 사용할 수 있습니다.
top

Write a comment.


엑셀 시트 복사하기(with POI) + 리팩터링

모하니?/Coding : 2008.07.01 13:09


    private void copySheet(HSSFSheet from, HSSFSheet to) {
        HSSFRow firstRow = from.getRow(0);
        HSSFRow secondRow = from.getRow(1);
        HSSFRow thirdRow = from.getRow(2);
        
        HSSFRow firstRow2 = to.createRow(0);
        HSSFRow secondRow2 = to.createRow(1);
        HSSFRow thirdRow2 = to.createRow(2);
        
        Iterator<HSSFCell> iterator = firstRow.cellIterator();
        short col = 0;
        while(iterator.hasNext())
            addCell(firstRow2, col++, iterator.next().getStringCellValue());
        
        col = 0;
        iterator = secondRow.cellIterator();
        while(iterator.hasNext())
            addCell(secondRow2, col++, iterator.next().getStringCellValue());

        col = 0;
        iterator = thirdRow.cellIterator();
        while(iterator.hasNext())
            addCell(thirdRow2, col++, iterator.next().getStringCellValue());
    }

무려 세 번이나 중복되고 있지만, 일단 기능이 제대로 돌아가는지부터 보려고 허겁 지겁 코딩을 하고 결과를 확인해 보니 괜춘하네요. 여기서 그만 둘까도 생각했지만, 에이~ 뭐 시간도 많은데 저런걸 그냥 두긴 뭐하다 싶어서 리팩터링..

    private void copySheet(HSSFSheet from, HSSFSheet to, int fromRowCnt, int toRowCnt) {
        HSSFRow fromRow = null;
        HSSFRow toRow = null;
        for(int i = fromRowCnt ; i <= toRowCnt ; i++){
            fromRow = from.getRow(i);
            toRow = to.createRow(i);
            Iterator<HSSFCell> iterator = fromRow.cellIterator();
            short col = 0;
            while(iterator.hasNext())
                addCell(toRow, col++, iterator.next().getStringCellValue());
        }
    }

리팩터링 하는 김에 좀 더 Generic하게 만들어서 몇 번째 줄부터 몇 번째 줄까지 복사할지 인자로 넘겨주도록 수정 함. 이제 저 메소드는 ExcelUtils로 옮기면 ExelView쪽 코드는 약간 더 깔끔해지겠죠. 그건 뭐 간단하니 생략합니다.
top

Write a comment.