멀티모듈 실습해보기
멀티모듈 프로젝트 ??
기존의 단일 프로젝트들을 프로젝트 안의 모듈로서 갖을 수 있게 하여 다중 모듈을 한 프로젝트에서 관리한다.
독립적인 프로젝트들이 모여 동작하는 한 시스템을 개발하는 경우 독립적인 시스템들이 동일하게 사용하는 부분을 동일하게 각각의 프로젝트에서 구현해야 한다. (ex_ Domain, Repository 등)
이 경우 공통부분에 변경이 생기면 모든 독립적인 프로젝트에도 동일하게 변경을 해줘야한다.
- 상당히 비효율적이다. 실수발생 가능성도 높다.
멀티모듈을 통해서 루트프로젝트 내 여러곳에서 공통적으로 사용되는 부분을 모듈로 분리해서 관리할 수있다.
문제점
- 그래들 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
- 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
프로젝트 생성 참고: https://www.hanumoka.net/2019/10/04/springBoot-20191004-springboot-gradle-multimodule/
멀티모듈 생성 참고 : https://jojoldu.tistory.com/123
멀티모듈 정리 참고 : https://woowabros.github.io/study/2019/07/01/multi-module.html
프로젝트 생성 시 입력하는 groupId와 artifactId
https://maven.apache.org/guides/mini/guide-naming-conventions.html
groupId : 프로젝트를 식별하기 위한 id
artifactId : 버전을 제외한 jar 이름
의문점
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') } }