Whiteship's Note

[JSP 리팩토링] 태그 파일로 중복 코드 제거하기

모하니?/Coding : 2009.09.26 16:15

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="page" tagdir="/WEB-INF/tags/page"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="s" tagdir="/WEB-INF/tags/study"%>

    <h1>스터디 추가</h1>
    <form:form commandName="study" method="post">
        <form:input path="studyName" cssClass="text" />
        <form:errors path="studyName" />
        <form:input path="maximum" cssClass="text" />
        <form:errors path="maximum" />
        <form:input path="startDay" cssClass="text"/>
        <form:errors path="startDay" />
        <form:input path="endDay" cssClass="text"/>
        <form:errors path="endDay" />
        <form:textarea path="descr" rows="4" cols="60" cssClass="text"/>
        <form:errors path="descr" />
    <a href="<c:url value="/study/list.do"/>">취소</a>
    <input type="submit" value="저장" class="s_waitblock" />
<script type="text/javascript">
    $("#startDay").datepicker({ dateFormat: 'yy/mm/dd' });
    $("#endDay").datepicker({ dateFormat: 'yy/mm/dd' });

이미 태그 파일로 <html> </html>과 js, css 임포트 하는 부분을 제거 해 두었습니다. 태그 파일을 여러 추상화 계층으로 세분화 해서 로우 레벨 태그파일과 하이 레벨 태그파일로 나눌 수도 있겠습니다. 저 위에 보이는 page 태그는 하이 레벨 태그 파일로 볼 수 있고, s 태그는 로우 레벨로 볼 수 있습니다. 하이 레벨이라고 해서 뭔가 더 여러운 태그라는게 아니라, 로우 레벨 태그를 조합하여 한 단계 더 추상화시킨 태그파일 입니다. 이런 구분이 원래 있는 것이 아니라 제가 생각하는 걸 정리한 것 뿐이오니,,, 괜히 "하이 레벨 태그 파일" 이런식으로 구글링을 하는 사태가 없기를 바랍니다.

사설을 좀 길었네요, 일단락하기로 하고, 위 코드를 태그파일로 리팩토링하면 다음과 같이 됩니다.

    <h1>스터디 추가</h1>
    <form:form commandName="study" method="post">
    <s:ftext title="스터디명" path="studyName" />
    <s:ftext title="최대인원수" path="maximum" />
    <s:fdate title="시작일" path="startDay" />
    <s:fdate title="종료일" path="endDay" />
    <s:ftextarea title="설명" path="descr" rows="4" cols="60" />
    <s:back-button url="/study/list.do" />
    <input type="submit" value="저장" class="s_waitblock" />
<script type="text/javascript">
    $(".fdate").datepicker({ dateFormat: 'yy/mm/dd' });

이렇게 했을 때 좋은 점은 소스 코드에서 중복을 제거 했을 때 얻을 수 있는 장점과 같습니다.

그러나,,, 단점도 있는데 태그 파일에 정의해준 속성만 받아서 사용하기 때문에 그만큼 사용할 수 있는 기능이 제한 될달까.. 그런게 좀 있습니다. 해결책은 있습니다. 태그 파일에 거의 모든 속성을 다 정의해 놓고 정말 필요한 것만 required로 하고 사용해도 될테지만.. 태그 파일을 만드는 비용이 꽤 많이 들겠지요. 결국 선택의 기로에 서게 되는데, 저는 귀찮아서;; 그냥 최소한의 속성만 정의해서 쓰는 편입니다.


Write a comment.

드이어 스프링 3.0 RC1이 나왔습니다.

Spring/3.0 : 2009.09.26 08:14


주요 변경 사항은 다음과 같습니다.

Changes in version 3.0.0.RC1 (2009-09-25)

* upgraded to CGLIB 2.2, AspectJ 1.6.5, Groovy 1.6.3, EHCache 1.6.2, JUnit 4.7, TestNG 5.10
* introduced early support for JSR-330 "javax.inject" annotations (for autowiring)
* introduced early support for JSR-303 Bean Validation (setup and MVC integration)
* added default editors for "java.util.Currency" and "java.util.TimeZone"
* refined PathMatchingResourcePatternResolver's treatment of non-readable directories
* PathMatchingResourcePatternResolver understands VFS resources (i.e. works on JBoss 5.x)
* revised AccessControlContext access from BeanFactory
* AbstractBeanDefinitionParser can deal with null return value as well
* PropertyOverrideConfigurer's "ignoreInvalidKeys" ignores invalid property names as well
* PropertyPlaceholderConfigurer supports "${myKey:myDefaultValue}" defaulting syntax
* BeanFactory's default type conversion falls back to String constructor on target type
* BeanFactory tries to create unknown collection implementation types via default constructor
* BeanFactory supports ObjectFactory as a dependency type for @Autowired and @Value
* BeanFactory supports JSR-330 Provider interface as a dependency type for @Inject
* BeanFactory prefers local primary bean to primary bean in parent factory
* protected @Autowired method can be overridden with non-annotated method to suppress injection
* private @Autowired methods with same signature will be called individually across a hierarchy
* @PostConstruct processed top-down (base class first); @PreDestroy bottom-up (subclass first)
* ConfigurationClassPostProcessor detect @Bean methods on registered plain bean classes as well
* support for default "conversionService" bean in an ApplicationContext
* MBeanServerFactoryBean returns JDK 1.5 platform MBeanServer for agent id "" (empty String)
* changed NamedParameter/SimpleJdbcOperations parameter signatures to accept any Map value type
* refined logging in JMS SingleConnectionFactory and DefaultMessageListenerContainer
* introduced "ui.format" package as an alternative to PropertyEditors for data binding
* @RequestMapping annotation now supported for annotated interfaces (and JDK proxies) as well
* @RequestParam and co support placeholders and expressions in their defaultValue attributes
* @Value expressions supported as MVC handler method arguments as well (against request scope)
* JSR-303 support for validation of @MVC handler method arguments driven by @Valid annotations
* refined response handling for @ExceptionHandler methods
* @ResponseStatus usage in handler methods detected by RedirectView
* all @SessionAttributes get exposed to the model before handler method execution
* @Event/ResourceMapping uniquely mapped to through event/resource id, even across controllers
* MultipartRequest is available as a mixin interface on (Native)WebRequest as well
* removed outdated "cacheJspExpressions" feature from ExpressionEvaluationUtils
* introduced common ErrorHandler strategy, supported by message listener container
* Jpa/JdoTransactionManager passes resolved timeout into Jpa/JdoDialect's beginTransaction
* HibernateJpaDialect applies timeout onto native Hibernate Transaction before begin call
* Spring's Hibernate support is now compatible with Hibernate 3.5 beta 1 as well
* Spring's JPA support is now fully compatible with JPA 2.0 as in EclipseLink 2.0.0.M7
* SpringJUnit4ClassRunner is now compatible with JUnit 4.5, 4.6, and 4.7
* SpringJUnit4ClassRunner once again supports collective timeouts for repeated tests
* deprecated @NotTransactional annotation for test classes in favor of @BeforeTransaction

봄싹 사이트에 어서 적용해 봐야겠네요.

  1. 대한민국토리 2009.09.28 23:37 PERM. MOD/DEL REPLY

    2번항목의 JSR-330 에 대해서 언급한 블로그가 있길래 링크 겁니다.


    생각보다 관심가지고 계신 분들이 많은데요...^^

    Favicon of http://whiteship.tistory.com BlogIcon 기선 2009.09.29 00:14 PERM MOD/DEL

    아.. 찬욱이네요.ㅎㅎ
    전 DI 표준 보다 JSR-303 벨리데이션 쪽이 더 관심이 갑니다.

  2. Favicon of http://www.timberlandbaratas.com BlogIcon zapatos timberland 2012.12.25 12:12 PERM. MOD/DEL REPLY

    This airport can offer you outdoor parking options. There are about 567 parking spaces accessible. Fees differ in accordance with the model of vehicle and they are paid for 24-hour period, http://www.timberlandbaratas.com Timberland. Car hire agencies introduced at the airport comprise Avis, http://www.timberlandbaratas.com zapatos timberland, Budget, http://www.timberlandbaratas.com Timberland Online, National, and Hertz. Bus services between Port Louis and the airport run quite often each 30-60 minutes during the day, http://www.timberlandbaratas.com Mujer Timberland. Taxis are accessible outside the terminal structure always. About 60 taxis serve the Mauritius airport. An information desk is put centrally in the terminal structure, http://www.timberlandbaratas.com outlet timberland. There are some ATMs out off the arrival hall, http://www.timberlandbaratas.com timberland niños, plus currency exchange service is accessible in the check-in hall located in departures area. Also, there are bank offices in the departures areas and arrivals. A post office is placed out off the arrivals hall.Related articles:

    http://skywalker.tistory.com/332 Le patron de la Société des courses de Compiègne (Oise) a démenti samedi avoir bénéficié d'un

    http://ebhanglobaltopics.tistory.com/162 Selon un communiqué de presse de l'organisateur chilien du Dakar-2011

Write a comment.