2020년 8월 17일 월요일

멀티모듈 실습해보기

 멀티모듈 실습해보기

  • 멀티모듈 프로젝트 ??

    • 기존의 단일 프로젝트들을 프로젝트 안의 모듈로서 갖을 수 있게 하여 다중 모듈을 한 프로젝트에서 관리한다.

    • 독립적인 프로젝트들이 모여 동작하는 한 시스템을 개발하는 경우 독립적인 시스템들이 동일하게 사용하는 부분을 동일하게 각각의 프로젝트에서 구현해야 한다. (ex_ Domain, Repository 등)

    • 이 경우 공통부분에 변경이 생기면 모든 독립적인 프로젝트에도 동일하게 변경을 해줘야한다.

      • 상당히 비효율적이다. 실수발생 가능성도 높다.
    • 멀티모듈을 통해서 루트프로젝트 내 여러곳에서 공통적으로 사용되는 부분을 모듈로 분리해서 관리할 수있다.

  • 문제점

      1. 그래들 6.4.1 오류 발생
      • 생성 시 6.4.1로 설정되었는데 빌드가 안된다! 검색을 해보면 인털리제이 이슈로 나온다

      • 버전을 낮췄다.. 6.4.1 -> 5.6.1

      • 프로젝트 경로에서 다음을 실행하면 된다.

      ./gradlew wrapper --gradle-version 5.6.1

      • 나는 gradle/wrapper/gradle-wrapper.properties 에서 버전을 바꿔주었다. 위의 방법이 맞는 방법 같다.

        distributionBase=GRADLE_USER_HOME
        distributionPath=wrapper/dists
        distributionUrl=https\://services.gradle.org/distributions/gradle-5.6.1-bin.zip
        zipStoreBase=GRADLE_USER_HOME
        zipStorePath=wrapper/dists
        
      1. common에 생성한 repository나 domain을 자꾸 인식을 못하여 다음과 같이 Application에 명시해줌
      @SpringBootApplication(scanBasePackages = "com.example")
      @EntityScan("com.example.domain")
      @EnableJpaRepositories(basePackages={"com.example.repository"})
      
      • 해결! : 생성한 repository 경로가 다른 모듈과 달랐음!

        • 기존 common 모듈 : com.example.domain.Member.java
        • 기존 api 모듈 : com.example.multimodulestestproject.ModuleApiApplication.java
        • 변경 common모듈 : com.example.multimodulestestproject .domain.Member.java


  • 프로젝트 생성 시 입력하는 groupId와 artifactId

  • 의문점

    • MSA랑 멀티모듈이랑 다른걸까??

      • MSA 는 기능기반으로 분리하여 아예 의존성 없는 모듈간 통신으로 서비스를 하는 것 같고 멀티모듈은 그냥 방식인 것 같음.
      • 모놀리스방식도 멀티모듈이 가능한듯?
    • 애초에 모두 묶어서 프로젝트를 만들면?

      • 모두 합친 프로젝트에 자주 변경되는 부분이 있을텐데 그 부분 때문에 전체 재배포가 필요해진다.

      • 해당 부분을 분리하여 각각 만듦으로써 필요한 부분만 변경(배포)이 가능해진다.

  • 변경 전 build.gradle

plugins {
    id 'org.springframework.boot' version '2.3.2.RELEASE'
    id 'io.spring.dependency-management' version '1.0.9.RELEASE'
    id 'java'
}

group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '1.8'

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter'
    compile 'org.springframework.boot:spring-boot-starter-web'
    developmentOnly 'org.springframework.boot:spring-boot-devtools'
    testImplementation('org.springframework.boot:spring-boot-starter-test') {
        exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
    }
}

test {
    useJUnitPlatform()
}
  • 변경 후 build.gradle

buildscript {
    ext {
        springBootVersion = '2.3.2.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        classpath "io.spring.gradle:dependency-management-plugin:1.0.9.RELEASE"
    }
}



subprojects {
    group = 'com.example'
    version = '0.0.1-SNAPSHOT'

    apply plugin: 'java'
    apply plugin: 'org.springframework.boot'
    apply plugin: 'io.spring.dependency-management'

    sourceCompatibility = '1.8'

    repositories {
        mavenCentral()
    }


    dependencies {
        testCompile group: 'junit', name: 'junit', version: '4.12'
    }
}

project(':module-api') {
    dependencies {
        compile project(':module-common')
    }
}

project(':module-web') {
    dependencies {
        compile project(':module-common')
    }
}

댓글 없음:

댓글 쓰기