Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

최근 모던 빌드툴에 비해 메이븐은 설정이 복잡하고 어렵습니다. 그래서 스프링을 웹 프레임웍으로 선택하였다고하면프레임워크로 선택을 하였으면,

스프링을 사용하는 요소만큼은 단순하게 의존성을 셋팅할 필요가 단순해질필요가 있습니다.

원문문서 : https://spring.io/guides/gs/multi-module/


의존성 단순화:

Spring Boot INITIALIZER 을 이용한 Spring 의존요소 단순화

...

  • 모든 프로젝트가 공통으로 참조하는것 ( 오픈소스 공통 라이브러리)
  • 특정 프로젝트만 참조하는것 ( 특정 로컬 참조)
  • 그룹 프로젝트가 공통으로 참조하는것 ( 내부공통 라이브러리)
Bad
Good

Image Modified

의존성 관계가 스파게티가 되는 일반적인 예입니다.


Good Case

Image Modified



여기서 의존성 단순화 목표는 , 우리가 사용할 스프링요소에대해서 크게 신경쓰지 않는 것입니다.

...

더이상 신규 라이브러리를 도입하기 어려운 상황이 오게됩니다.


Root 셋팅예

Code Block
languagejava
themeEmacs
title/pom.xml
<?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
languagejava
themeEmacs
title/eureka-serviceregistry/pom.xml
<?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과 양방향 호환되는 방향으로 셋팅하고 싶지만 ( 기존 대부분의 인프라가 메이븐으로 설정되어 있음 )

메이븐에서 계속 깔금한 구조를 개선및 시도중에 있습니다.