본문 바로가기
【Programming】/JSP

Java 웹 애플리케이션의 디렉토리 구조는 어떻게 가져가는 것이 좋을까요?

반응형

※ 원문 참조:

http://wiki.javajigi.net/pages/viewpage.action?pageId=7188

왜 필요한가?

우리들이 일반적으로 개발하고 있는 대부분의 자바 웹 애플리케이션의 디렉토리 구조를 보면 프로젝트마다 제각기 다르다는 것을 알 수 있다. 물론 프로젝트의 성격에 따라 다르게 구성하는 것이 맞겠지만 기본적인 디렉토리 구조에 대한 가이드안을 만든다면 프로젝트에 참여하는 개발자들이 좀 더 빠르게 친숙해 질 수 있을 것으로 생각한다.

여러분들이 지금까지 참여한 프로젝트들의 디렉토리 구조는 어떠한가? 우선 지금까지 자바지기가 진행한 프로젝트의 디렉토리 구조를 예로 들고 각각의 구조에 대한 좀 더 좋은 방안을 찾아보고자 한다.

  이 문제를 토론 주제를 빠르게 선정한 이유는?
현재 자바지기에 대한 사이트 개편 작업을 진행할 예정이다. 사이트 개편 작업을 하면서 프로젝트의 디렉토리 구조를 정의할 때 다른 개발자들이 생각하거나 일반적으로 사용하는 디렉토리 구조를 공유하여 사용하기 위함이다. 프로그램에 정답이 없듯이 이 문제 또한 정답은 있을 수 없다. 단지 각각의 구조에 따른 장,단점이 있을 따름이다. 프로젝트의 성격에 따라서 디렉토리 구조를 결정하면 될 것으로 생각한다.

무엇을 얻을 수 있나?

Java 웹 애플리케이션의 프로젝트에 대한 디렉토리 구조를 정의함으로서 신규 프로젝트를 진행할 때 추가적인 고민없이 프로젝트를 진행하는 것이 가능하다.

다양한 디렉토리 구조

디렉토리 구조 공유

  여러분들이 지금 사용하고 있는 디렉토리 구조를 공유해주시면 더 좋겠네요. 만약 여러분이 그와 같은 구조를 만들었다면 왜 그와 같은 구조를 만들게 되었는지..지금과 같은 구조로 프로젝트를 진행했을 때의 장,단점은 무엇인지 등에 대해서 공유해주시면 좋겠네요.

해결 방법

  • 최근 대부분의 자바 웹 애플리케이션 개발에서 공통적으로 보이는 경향은 자바 소스 디렉토리와 Web 소스(js, css, jsp, html)를 분리한다.
  • 자바 소스 디렉토리는 실제 구현 소스와 테스트 소스를 분리한다. 또한 실제 구현 소스와 같은 패키지내에 테스트 소스를 구현하는 것을 원칙으로 하고 있다.
  • 빌드 환경까지 제공해줄 수 있어야 한다.

자바지기 개편안을 위한 디렉토리 구조

자바지기 개편안을 위한 디렉토리 구조는 Equinox의 디렉토리 구조를 따르는 것으로 했다. Equinox의 경우 디렉토리 구조 뿐만 아니라 각 프레임워크별로 기본 템플릿 프로젝트를 제공하기 때문에 세팅하기 쉽다.

또 한가지 Equinox를 선택하게 된 이유는 단순한 디렉토리 구조 뿐만아니라 Build 환경까지 제공한다는 것이다. Build 환경이 단순하게 Ant만을 지원했다면 선택하지 않았겠지만 Ant와 Maven의 강점 두가지를 모두 가지고 있는 구조가 마음에 들었다. 이와 같은 구조로 웹 애플리케이션을 개발할 경우 CVS나 SVN을 통하여 라이브러리를 공유하지 않은 상태로 개발하는 것이 가능하다. 또한 경우에 따라서는 Maven을 이용하여 빌드하는 것 또한 가능하기 때문이다.

Ant과 AntLib의 조합, build.xml과 pom.xml의 조합은 그 동안 해결하려고 했던 많은 문제점을 해결해 줄 수 있을 것이라 생각한다. 또한 pom.xml을 가지고 있기 때문에 Eclipse Maven IDE를 이용하여 개발하는 것이 가능하게 된다.

build.xml의 다음 코드를 통하여 Ant와 Maven이 통합되었을 때 라이브러리 관리가 얼마나 편하게 될 수 있는지 확인할 수 있을 것이다.

build.xml
    <artifact:pom file="pom.xml" id="maven.project"/>

    <artifact:dependencies pathId="compile.classpath" filesetId="compile.fileset" useScope="compile">
        <pom refid="maven.project"/>
    </artifact:dependencies>
    
    <artifact:dependencies pathId="test.classpath" filesetId="test.fileset" useScope="test">
        <pom refid="maven.project"/>
    </artifact:dependencies>
    
    <artifact:dependencies pathId="runtime.classpath" filesetId="runtime.fileset" useScope="runtime">
        <pom refid="maven.project"/>
    </artifact:dependencies>

    <target name="compile" description="Compile main source tree java files">
        <mkdir dir="${build.dir}/classes"/>
        <javac destdir="${build.dir}/classes" debug="true" optimize="false"
            deprecation="false" failonerror="true">
            <src path="${src.dir}"/>
            <classpath>
                <path refid="compile.classpath"/>
                <fileset dir="${web.dir}/WEB-INF/lib" includes="*.jar"/>
            </classpath>
        </javac>
        <!-- compile tests -->
        <mkdir dir="${test.dir}/classes"/>
        <javac destdir="${test.dir}/classes" debug="true" optimize="false"
            deprecation="false" failonerror="true">
            <src path="${test.src}"/>
            <classpath>
                <path refid="test.classpath"/>
                <path location="${build.dir}/classes"/>
                <fileset dir="${web.dir}/WEB-INF/lib" includes="*.jar"/>
            </classpath>
        </javac>
        <!-- Copy XML files to ${build.dir}/classes -->
        <copy todir="${build.dir}/classes">
            <fileset dir="${src.dir}" includes="**/*.xml"/>
        </copy>
    </target>

이와 같이 두가지를 통합하여 사용할 경우 라이브러리를 개발자간에 공유할 필요없이 pom.xml만 공유하면 된다.

반응형