[스프링/그래들] 스프링 부트 그래들 멀티 프로젝트

중첩 멀티 프로젝트 구조

루트 프로젝트가 서브 프로젝트를 포함하고 서브 프로젝트가 다시 서브 프로젝트를 포함하는 중첩 구조인 경우 최하위 서브 프로젝트 인식을 위해서는 최상위 루트 프로젝트 settings.gradle 파일에 서브 루트 프로젝트 뿐만 아니라 서브 프로젝트의 최하위 서브 프로젝트까지 포함시켜야 한다. 그렇지 않으면 서브 루트 프로젝트의 build.gradle 파일에서 project() 메서드는 최하위 서브 프로젝트를 찾을 수 없다.


애플리케이션 설정 파일 관리

멀티 프로젝트 구성에서 애플리케이션 설정 파일(application.properties 또는 application.yml)은 관리 방법에 따라 통합하여 사용하거나 적절하게 분리하여 사용 가능하다.

루트 프로젝트와 서브 프로젝트의 애플리케이션 설정 파일은 동일한 이름으로 중복 생성할 경우 하나의 파일만 적용된다. 따라서 하나의 설정 파일에 모든 설정 정보를 기술하거나 프로젝트 별로 설정 파일을 만들고 그룹화한다. 프로젝트 별로 설정 파일을 관리할 경우 속성이 중복으로 정의되지 않도록 한다. 또다른 방법으로 서브 프로젝트 별 설정 파일을 만든 후 루트 프로젝트에서 단순히 포함시킬 수도 있다. 이렇게 하면 설정 정보를 교체하는 것이 아니라 기존 설정 정보에 새로운 정보를 추가하는 것이 된다.

방법에 따라 다음과 같은 프로젝트 구성이 가능하다.

  • 하나의 설정 파일에서 모든 설정 정보를 관리하기

    루트프로젝트
    - resources
      - applicaton.yml
      - application-prod.yml
      - application-dev.yml
    서브프로젝트
    - resources
    
  • 프로젝트 별로 설정 파일을 만들고 그룹화하기 (스프링 부트 2.4 이상)

    루트프로젝트
    - resources
      - application.yml
      - application-prodapp.yml
      - application-devapp.yml
    서브프로젝트
    - resources
      - application-prodlib.yml
      - application-devlib.yml
    
    # application.yml
    spring
      profiles:
        group:
          prod: "prodapp, prodlib"
          dev: "devapp, devlib"
    
  • 루트 프로젝트에서 서브 프로젝트의 설정 파일 포함(추가)하기

    루트프로젝트
    - resources
      - application.yml
      - application-prod.yml
      - application-dev.yml
    서브프로젝트
    - resources
      - application-prodlib.yml
      - application-devlib.yml
    
    # application-prod.yml
    spring.profiles: prod
    spring.profiles.include: prodlib
    


.properties 파일과 달리 .yml 파일은 다중 문서 구성이 가능하므로 동일한 설정 파일에 다중 프로파일 적용이 가능하다.

서브 프로젝트가 @Value 어노테이션을 사용하여 프토퍼티 값 주입을 하는 경우 해당 속성을 루트 프로젝트의 통합된 설정 파일에서 정의할지, 서브 프로젝트의 설정 파일에서 따로 정의할지 결정한다. 분리하여 관리한다면 모듈에만 변경 사항이 발생한 경우 독립적으로 반영 가능하다. 공통으로 사용되는 서브 프로젝트라면 설정 정보를 통합하여 관리하는 것이 좋지만 선택적으로 사용한다면 해당 프로젝트 내에서 관리하는 것이 좋다.


공통 빌드 스크립트

서브 프로젝트의 build 태스크 실행을 통한 빌드 시 루트 프로젝트의 빌드 스크립트가 실행된다. 반면 서브 프로젝트의, 스프링 부트 그래들 플러그인이 제공하는 bootJar 태스크 실행을 통한 빌드 시 루트 프로젝트의 빌드 스크립트가 실행되지 않으며 서브 프로젝트의 빌드 스크립트만 실행된다. 멀티 프로젝트에서 서브 프로젝트 간 공통 의존성 또는 빌드 스크립트 관리하기 위해 루트 프로젝트에 build.gradle 파일을 정의하였고, 특정 서브 프로젝트만 빌드하여 jar 파일을 생성하려는 경우 올바른 빌드를 위해 build 태스크 실행 명령어를 사용하고 내부적으로 bootJar 태스크가 실행되도록 한다.


참고

Comments