The ThoughtWorks Anthology 라는 책의 11 챕터의 빌드 아케텍트인 줄리안 심슨님의 내용은, build.xml 즉, ant 파일이 refactoring에 대한 내용입니다. 그 중에서, <macrodef> 태그를 이용한 build.xml 파일의 리펙토링 예제가 나오는데, 유용할것 같아서 개인적으로 사용하고 있는 dist target에 대해서 리펙토링을 적용해 봤습니다.
기존
<!– distribute compiled binary to dist folder –>
<target name=”dist” depends=”compile” description=”distribute library”>
<echo>dist target started</echo>
<jar destfile=”${dist.dir}/${project.name}-${project.version}.jar”>
<fileset dir=”${build.main.classes}”></fileset>
<manifest id=”MANIFEST.MF”>
<attribute name=”Built-By” value=”${user.name}”/>
<!–attribute name=”Class-Path” value=”${class-path}” /–>
</manifest>
</jar>
<copy todir=”${dist.dir}”>
<fileset dir=”${lib.dir}”>
<exclude name=”junit*.jar” />
</fileset>
</copy>
<!– compress binary –>
<zip destfile=”${dist.dir}/${project.name}-${project.version}.zip” >
<fileset dir=”${dist.dir}” includes=”**” />
</zip>
<echo>dist target completed</echo>
</target>
<target name=”dist” depends=”compile” description=”distribute library”>
<echo>dist target started</echo>
<jar destfile=”${dist.dir}/${project.name}-${project.version}.jar”>
<fileset dir=”${build.main.classes}”></fileset>
<manifest id=”MANIFEST.MF”>
<attribute name=”Built-By” value=”${user.name}”/>
<!–attribute name=”Class-Path” value=”${class-path}” /–>
</manifest>
</jar>
<copy todir=”${dist.dir}”>
<fileset dir=”${lib.dir}”>
<exclude name=”junit*.jar” />
</fileset>
</copy>
<!– compress binary –>
<zip destfile=”${dist.dir}/${project.name}-${project.version}.zip” >
<fileset dir=”${dist.dir}” includes=”**” />
</zip>
<echo>dist target completed</echo>
</target>
리펙토링된 후
<macrodef name=”dist_jar”>
<sequential>
<jar destfile=”${dist.dir}/${project.name}-${project.version}.jar”>
<fileset dir=”${build.main.classes}”></fileset>
<manifest id=”MANIFEST.MF”>
<attribute name=”Built-By” value=”${user.name}”/>
<!–attribute name=”Class-Path” value=”${class-path}” /–>
</manifest>
</jar>
</sequential>
</macrodef>
<macrodef name=”dist_copy”>
<sequential>
<copy todir=”${dist.dir}”>
<fileset dir=”${lib.dir}”>
<exclude name=”junit*.jar” />
</fileset>
</copy>
</sequential>
</macrodef>
<macrodef name=”dist_zip”>
<sequential>
<!– compress binary –>
<zip destfile=”${dist.dir}/${project.name}-${project.version}.zip” >
<fileset dir=”${dist.dir}” includes=”**” />
</zip>
</sequential>
</macrodef>
<!– distribute compiled binary to dist folder –>
<target name=”dist” depends=”compile” description=”distribute library”>
<echo>dist target started</echo>
<dist_jar />
<dist_copy />
<dist_zip />
<echo>dist target completed</echo>
</target>
<sequential>
<jar destfile=”${dist.dir}/${project.name}-${project.version}.jar”>
<fileset dir=”${build.main.classes}”></fileset>
<manifest id=”MANIFEST.MF”>
<attribute name=”Built-By” value=”${user.name}”/>
<!–attribute name=”Class-Path” value=”${class-path}” /–>
</manifest>
</jar>
</sequential>
</macrodef>
<macrodef name=”dist_copy”>
<sequential>
<copy todir=”${dist.dir}”>
<fileset dir=”${lib.dir}”>
<exclude name=”junit*.jar” />
</fileset>
</copy>
</sequential>
</macrodef>
<macrodef name=”dist_zip”>
<sequential>
<!– compress binary –>
<zip destfile=”${dist.dir}/${project.name}-${project.version}.zip” >
<fileset dir=”${dist.dir}” includes=”**” />
</zip>
</sequential>
</macrodef>
<!– distribute compiled binary to dist folder –>
<target name=”dist” depends=”compile” description=”distribute library”>
<echo>dist target started</echo>
<dist_jar />
<dist_copy />
<dist_zip />
<echo>dist target completed</echo>
</target>
위 예제처럼, 리펙토링된 내용을 살펴보면, <macrodef>태그를 통해서 기능에 대한 내용을 작게 쪼개서 빼고(<macrodef>) , 사용하는 <target>에서는 필요한 각 기능을 호출하는 템플릿 메쏘드(?)처럼 기술하게 됩니다. 어디서 많이 본 느낌인데.. 위는 기능을 작게 나눠서 메쏘드로 뽑는 extract method 리렉토링 기법과 동일하네요.. 역시 대가들에게서 많은 내용을 배우게 되는것 같습니다. ^^