Page History
...
최근 모던 빌드툴에 비해 메이븐은 설정이 복잡하고 어렵습니다. 그래서 스프링을 웹 프레임웍으로 선택하였다고하면프레임워크로 선택을 하였으면,
스프링을 사용하는 요소만큼은 단순하게 의존성을 셋팅할 필요가 단순해질필요가 있습니다.
원문문서 : https://spring.io/guides/gs/multi-module/
의존성 단순화:
Spring Boot INITIALIZER 을 이용한 Spring 의존요소 단순화
...
- 모든 프로젝트가 공통으로 참조하는것 ( 오픈소스 공통 라이브러리)
- 특정 프로젝트만 참조하는것 ( 특정 로컬 참조)
- 그룹 프로젝트가 공통으로 참조하는것 ( 내부공통 라이브러리)
Bad |
---|
의존성 관계가 스파게티가 되는 일반적인 예입니다. | |
Good Case | |
여기서 의존성 단순화 목표는 , 우리가 사용할 스프링요소에대해서 크게 신경쓰지 않는 것입니다.
...
더이상 신규 라이브러리를 도입하기 어려운 상황이 오게됩니다.
Root 셋팅예
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.webnori.psmon.cloudspring</groupId>
<artifactId>psmon-cloudspring</artifactId>
<version>0.1.0</version>
<packaging>pom</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.1.RELEASE</version>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
<spring-cloud.version>Greenwich.M3</spring-cloud.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<modules>
<module>config-service</module>
<module>eureka-serviceregistry</module>
<module>library</module>
<module>front-web</module>
<module>accountapi</module>
<module>lobbyapi</module>
<module>gameapi</module>
</modules>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
</project> |
설정 포인트:
- 사용되는 라이브러리의 버젼을 모두 중앙에서 관리합니다. properties 설정및 dependencyManagement에서 목표를 이룰수 있습니다.
- spring-boot-starter 을 사용하여 부트 사용 요소를 단일화 합니다.
- repositories 는 spring의 snapshorts버젼을 사용못하게 막습니다. (릴리즈 이상만 사용)
- modules는 이 시스템이 가진 하위 시스템을 명시합니다. ( 기본으로 하위 디렉토리)
- groupid지정은 전체 모듈이 같이 사용할수 있게 그룹핑하며 artifactid에서 실제 하위 서비스를 구분하게합니다.
하위 프로젝트 예
Code Block | ||||||
---|---|---|---|---|---|---|
| ||||||
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<artifactId>eureka-serviceregistry</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>eureka-serviceregistry</name>
<description>Demo project for Spring Boot</description>
<parent>
<groupId>com.webnori.psmon.cloudspring</groupId>
<artifactId>psmon-cloudspring</artifactId>
<version>0.1.0</version>
<relativePath>../</relativePath>
</parent>
<properties>
</properties>
<dependencies>
<!-- Eureka Server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
|
설정포인트:
- 자신의 부모를 (parent)를 지정합니다. 그룹은 부모에서 정해졌기때문에 지정할 필요없습니다.
- 부모에서 어떠한 버젼의 요소를 사용할것인가 이미 정리가 되었기때문에 , 추가 사용모듈에대해 버젼지정을 하지 않습니다.
- 하위 모듈에서 만약 버젼을 한번 지정하기 시작하면, 다른 하위모듈에서도 지정하기때문에 서로 다른 버젼이되어 작동될수 있습니다.
Note |
---|
복잡하게 얽혀있는 오픈소스 디펜던시를 메이븐에 셋팅하려고하니 노하우와 경험이 필요해 보입니다. 시간이되면 Gradle과 양방향 호환되는 방향으로 셋팅하고 싶지만 ( 기존 대부분의 인프라가 메이븐으로 설정되어 있음 ) 메이븐에서 계속 깔금한 구조를 개선및 시도중에 있습니다. |