ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Multi Module Project 생성하기
    빌드 자동화 도구/Gradle 2024. 4. 8. 03:34

     

    프로젝트 진행 중에 서비스 별로 레포지토리를 생성하여 관리하니, 공통으로 들어가는 코드들의 중복이 발생하는 것을 느낄 수 있었습니다.

    그래서 프로젝트를 멀티모듈의 형태로 바꾸고 한 개의 레포지토리에서 관리해야겠다고 생각하던 차에, 실제 프로젝트에 적용하기에 앞서서

    연습삼아 한번 멀트 모듈 프로젝트를 만들어보겠습니다.

     

    이 프로젝트는 블로의 Junit에 사용될 프로젝트 입니다

     


    아래의 글은 다음의 순서로 작성되었습니다.

    1. 시작하기 전에

    2. setting.gradle 설정하기

    3. build.gradle 설정하기

    4. 동작 확인하기

     

     

    1. 시작하기 전에

    현재 디렉토리 구성은 이렇습니다.

    /Junit/concurrency

     

    /concurrency 경로에는 테스트 작성을 위해서 스프링부트 프로젝트를 생성해 두었습니다.

    여러가지 주제를 독립적으로 다루기 위해서는 개별 모듈로 관리하는 것이 좋아보입니다.

     

    이제부터 /Junit 을 루트 프로젝트로 사용하고 각 주제들을 서브 프로젝트로 관리하는 프로젝트 구조를 만들어보겠습니다.

     

     

    2. setting.gradle을 루트 프로젝트에 생성

    Junit 디렉토리를 루트프로젝트로 만들고 concurrency 디렉토리를 서브 모듈로 만들 예정입니다.

     

    2-1.  setting.gradle의 위치변경

    setting.gradle에는 rootProject 정보와 포함될 서브 프로젝트의 이름을 적고, 보통 루트 프로젝트에서 관리합니다.

    /concurrency 에 있는 setting.gradle을 /junit으로 올려주고 프로젝트 이름을 정해줍니다.

     

     

     

    2-2.  setting.gradle에 하위 프로젝트 추가

    하위 프로젝트로 포함될 경로이름을 추가해줍니다.

    'include' 키워드에 ':디렉토리명 '을 입력해주면, 빌드시에 해당 경로를 서브 모듈로 인식합니다.

     

     

    3. build.gradle을 루트 프로젝트에 생성

     

    먼저 /concurrency의 build.gradle을 먼저 살펴봅니다.

    plugins {
    	id 'java'
    	id 'org.springframework.boot' version '3.2.4'
    	id 'io.spring.dependency-management' version '1.1.4'
    }
    
    group = 'com.example'
    version = '0.0.1-SNAPSHOT'
    
    java {
    	sourceCompatibility = '17'
    }
    
    configurations {
    	compileOnly {
    		extendsFrom annotationProcessor
    	}
    }
    
    repositories {
    	mavenCentral()
    }
    
    dependencies {
    	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    	implementation 'org.springframework.boot:spring-boot-starter-web'
    	compileOnly 'org.projectlombok:lombok'
    	runtimeOnly 'com.mysql:mysql-connector-j'
    	annotationProcessor 'org.projectlombok:lombok'
    	testImplementation 'org.springframework.boot:spring-boot-starter-test'
    }
    
    tasks.named('test') {
    	useJUnitPlatform()
    }

     

     

     

    3-1. build.gradle을 루트 프로젝트에 생성하기

    이 중에서 앞으로 생성될 다른 서브 프로젝트에서도 사용될 가능성이 있는 내용을 루트 프로젝트의 build.gradle로 이동시켜줍니다.

    루트의 build.gradle는 전역적인 버전관리나 중복 최소화를 할 수 있는 방향에서 사용하면 좋을 것 같습니다.

     

    루트 프로젝트의 build.gradle 에 추가한 내용입니다.

    plugins {
        id 'java'
        id 'org.springframework.boot' version '3.2.4' apply false
        id 'io.spring.dependency-management' version '1.1.4' apply false
    }
    
    java {
        sourceCompatibility = '17'
    }
    
    
    configurations {
        compileOnly {
            extendsFrom annotationProcessor
        }
    }
    
    allprojects {
        repositories {
            mavenCentral()
        }
    }
    
    subprojects {
        apply plugin: 'java'
    
        dependencies {
            compileOnly 'org.projectlombok:lombok'
            annotationProcessor 'org.projectlombok:lombok'
            testImplementation 'org.springframework.boot:spring-boot-starter-test'
        }
    }
    
    tasks.named('test') {
        useJUnitPlatform()
    }

     

     

    3-2. 서브 프로젝트의 build.gradle 변경하기

    루트 프로젝트의 build.gradle에 추가한 내용을 제외하고 새로 구성한 concurrency의 build.gradle 입니다.

    plugins의 버전은 루트에서 설정한 버전을 따라가도록 설정하였습니다.

    plugins {
    	id 'org.springframework.boot'
    	id 'io.spring.dependency-management'
    }
    
    group = 'com.concurrency'
    version = '0.0.1-SNAPSHOT'
    
    dependencies {
    	implementation 'org.springframework.boot:spring-boot-starter-web'
    	implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    	runtimeOnly 'com.mysql:mysql-connector-j'
    }

     

     

     

    4. 동작 확인하기

    Intellij 기준으로 .idea 파일제거 하고 다시 실행해서 gradle 프로젝트라는 것을 IDE가 인식하게 만들어줍니다.

    설정이 마무리 되었을 때의 프로젝트 폴더 구조입니다.

     

    우측의 gradle 탭에서 bootRun을 실행해줍니다

     

     

    스프링 프로젝트가 정상적으로 작동하는 것을 확인할 수 있습니다.

     

     

    앞으로 프로젝트에서 공통으로 사용될 코드들을 또 다른 하위프로젝트로 묶은 뒤에 가져다 쓰는 형태로 사용하면 중복을 줄일 수 있을 것으로 기대됩니다!!

     

     

    감사합니다

     

     

     

Designed by Tistory.