이 내용은 박재성님이 집필하신 [자바 세상의 빌드를 이끄는 메이븐] 책을 그대로 정리한 것이다.
회사에서 스터디를 하는데 문서 보안 때문에 어쩔수 없이 블로그를 이용하게 되었고,
위 내용은 박재성님의 허락을 받았습니다.

10 메이븐 모듈

책에는 나오지 않지만 이 장을 통틀어서 가장 중요한 내용이 아닐까 해서 작성해 메모해 둠
실제 우리가 프로젝트를 하다보면 종속적인 모듈 관계보다 디렉토리는 병렬 구조에 관계만
부모 자식간의 관계를 맺고 싶을때가 있다.
즉 하나의 디렉토리에
전체 프로젝트를 관리하는 부모 역활을 하는 webzine 이 있고, 이 프로젝트의 모듈인 user, admin
그리고 user, admin의 공통 부분만을 뽑아서 core 라는 것을 만들었다고 가정하자.
1 부모에서 자식 찾기
 webziine 의 pom.xml 파일에
 <modules>
    <module>../core</module>
    <module>../admin</module>
    <module>../user</module>
 </modules>
추가  이런 식으로 부모 pom.xml 로 부터 ../ 현재 디렉토리 위에 있는 디렉토리를 명시

2 자식에서 부모 지정하기
  예를들어 core 프로젝트에서
  <parent>
     <artifactId>webzine</artifactId>
     <groupId>com.samsunglife</groupId>
     <version>0.0.1-SNAPSHOT</version>
     <relativePath>../webzine/pom.xml</relativePath>
  </parent>
와 같이 부모 pom.xml 위치를 지정해 주면된다.

 - webzine 의 관리자 모듈이 필요해서 추가해야 할 경우가 발생 했다고 가정하자. 공통 부분을 core, 일반사용자용을 user, 관리자를 admin
   이라 했을때 다음과 같은 의존 관계를 가짐
  


 1) 메이븐 모듈
  - 메이븐은 하나의 프로젝트에서 여러 모듈을 관리할수 있는 모듈 기능을 지원
  - 한 프로젝트가 여러 모듈을 가지면서 빌드를 한번에 진행. 메이븐의 모듈 개념을 이해하려고 활용하려면
    상소 Inheritance, 집합 aggregation, 의존관계 dependency 개념을 이해해야 함
  가 상속
   - 최상위 POM을 상속하듯, 프로젝트에서 공통으로 사용하는 설정은 공통 POM 파일을 만들어 관리하고 하위 모듈에서 이 POM 파일을 상속
   - 메이븐에서 상속 기능을 사용하려면 먼저 부모 parent POM 파일을 생성한 다음 부모 POM 파일의 <packaging/> 엘리먼트 값을 pom 으로 설정
     부모 parent POM 파일
     <project>
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.samsunglife</groupId>
      <artifactId>webzine-core</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <packaging>pom</packaging>
      [...]
     </project>
     자식 POM 파일은 <parent/> 엘리먼트를 이용하여 부모 POM 파일을 상속
     <project>
      <modelVersion>4.0.0</modelVersion>
      <parent>
            <artifactId>webzine</artifactId>
            <groupId>com.samsunglife</groupId>
            <version>0.0.1-SNAPSHOT</version>
      </parent>
      <groupId>com.samsunglife</groupId>
      <artifactId>core</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <name>core</name>
      <description>공통</description>
     </project>
   - <parent/> 엘리먼트를 설정하면 상위 디렉토리에 있는 pom.xml 파일을 부모 POM으로 찾음
  나 집합
   - 하나의 프로젝트가 여러 모듈로 분리될 경우 모듈간의 의존 관계가 발생하므로 빌드를 모듈별로 진행할 경우 빌드가 실패할 가능성이 높음
     각 모듈은 하나의 프로젝트로 같이 발전하기에 한번에 빌드할 필요가 있고, 여러 모듈을 빌드할때 같은 단위로 빌드할수 있도록 지원하는 기능이 집합
   - 집합 기능은 일반적으로 프로젝트의 최상위 POM 설정 파일에서 <modules/> 엘리먼트로 설정
     공통 설정을 관리하는 부모 pom.xml에서 아래와 같이 설정
     <project>
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.samsunglife</groupId>
      <artifactId>webzine</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <packaging>pom</packaging>
      <name>webzine</name>
      <modules>
        <module>core</module>
        <module>user</module>
        <module>admin</module>
      </modules>
     </project>
     위와 같이 설정한후 부모 POM 파일이 있는 디렉토리에서 빌드를 하면 최상위 프로젝트(webzine), core, user, admin 모듈이 한번에 빌드를 실행
  다 의존 관계
   - 하나의 프로젝트를 여러 모듈로 분리할 경우 각 모듈 사이에 의존 관계가 발생. core 모듈을 user, admin 모듈이 의존 관계를 가짐
     user 모듈의 pom.xml
     <project>
      <modelVersion>4.0.0</modelVersion>
      <parent>
            <artifactId>webzine</artifactId>
            <groupId>com.samsunglife</groupId>
            <version>0.0.1-SNAPSHOT</version>
      </parent>
      <groupId>com.samsunglife</groupId>
      <artifactId>user</artifactId>
      <version>0.0.1-SNAPSHOT</version>
      <name>user</name>
      <dependencies>
          <dependency>
              <groupId>com.samsunglife</groupId>
              <artifactId>core</artifactId>
              <version>0.0.1-SNAPSHOT</version>
          </dependency>
      </dependencies>
     </project>
 2) 웹진 프로젝트에 모듈 기능 적용
  - 하나의 프로젝트를 여러 프로젝트로 분리할 경우 가장 큰 이슈는 각 모듈에서 발생하는 중복 코드. 소스 외에도 설정파일, POM 파일에서
    중복 코드를 제거하기 위해 지속적인 리팩토링과 개선 작업이 필요
  


  가 모듈 생성
   - 부모 프로젝트의 <packaging/> 값을 war 에서 pom 으로 수정
     -> 부모 프로젝트로 이동한 후 mvn archetype:generate 를 실행하여 maven-archetype-quickstart 아키타입 기반으로 core 모듈을 생성
        (m2eclipse 의 maven 프로젝트 모듈 기능으로 생성해도 됨)
     -> 부모 pom.xml에서
        <modules>
        <module>core</module>
    </modules>
        추가
     -> core 프로젝트 pom.xml 에서
        <parent>
        <artifactId>webzine</artifactId>
        <groupId>com.samsunglife</groupId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
        추가
     -> 부모 프로젝트에서 mvn test 실행
     -> 같은 과정으로 user,admin 모듈 생성
     -> user, admin pom.xml에 의존 관계
        <dependencies>
          <dependency>
              <groupId>com.samsunglife</groupId>
              <artifactId>core</artifactId>
              <version>0.0.1-SNAPSHOT</version>
          </dependency>
      </dependencies>
        추가
       


  나 소스 코드 이동
   - 소스를 자식 모듈로 이동. core, user, admin 분리
  다 리소스 파일 분리
   - 같이 사용하는 파일은 복사해서 붙여넣기
  라 POM 설정 이동 및 변경
   - 생략
  마 이클립스로 모듈 가져오기
   - 부모 프로젝트에서 mvn eclipse:clean eclipse:eclipse 를 실행하면 세개의 모듈이 동시에 빌드됨
   - 만약 m2eclipse 플러그인으로 만들지 않았다면 이클립스로 가져오는 작업을 해야함
     일반적으로 General -> Existing Project into Workspace 기능을 사용하지만 이 기능을 사용할 경우
     각 모듈을 하나씩 가져오므로 한번에 가져오는
     File -> import -> Maven -> Existing Maven Projects 를 선택, 이 기능은 반드시 m2eclipse 플러그인이 설치 되어 있어야 함
     Next 를 클릭후 최상위 부모 프로젝트를 선택함
    


   - jetty 설정은 생략
 3) 웹진 프로젝트에 배치 모듈 추가
  가 웹진 프로젝트에 배치 모듈 추가
   - batch 모듈을 추가함, 부모를 상속하고 core 와 의존관계를 가짐
   - 설정 생략
  나 웹진 배치 모듈 배포 및 실행
   - 의존 관계에 있는 라이브러리를 특정 디렉토리로 복사하는 dependency 플러그인의 copy-dependencies 골 사용
   - 생략
Posted by gt1000

블로그 이미지
gt1000

태그목록

공지사항

어제
오늘

달력

 « |  » 2024.3
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
31

최근에 올라온 글

최근에 달린 댓글

최근에 받은 트랙백

글 보관함