마이크로 서비스를 구성하기에 앞서 , 서비스에 이용되는 라이브러리에대해 빌드툴에서 의존성 설정을 올바르게 해야합니다.

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

스프링을 사용하는 요소만큼은 단순해질필요가 있습니다.

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


의존성 단순화:

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

link :https://start.spring.io/

Spring 은 여러가지 오픈소스의 집합체입니다. Rest를 사용하기위해 A-REST를, JSON을 사용하기위해 B-JSON,

데이터베이스를 사용하기위해 C-JPA등을 사용할수가 있습니다.

하지만 각 오픈소스는 별개로 업그레이드가되며

A-1  , B-3 , C-5  와같이 버젼의 분기가일어나며 각각 다른 버젼조합을 사용하게되며

그 조합에다른 문제파악은 순전히 그것을 사용하는 개발자가 파악해야하는 부분입니다.

stater의 그룹 집합은 spring boot에서 그 조합을 충분히 검증을 하고 그룹화한 모듈이며

각 하위 버젼을 뭘로 쓸지 신경쓸필요가 없습니다.

단지 메이져 버젼만을 선택하고 , 웹요소에 사용되는 수많은 의존성을 우리는 'spring-boot-starter-web' 만 사용하면 됩니다.

이것은 여러가지 파편화된 라이브러리 의존성을 쉽게 관리할수 있게합니다. 

이것은 마이크로 서비스를 가기위해 아주 중요합니다. 단지 하나의 어플리케이션에서만 수백라인의 의존 복잡성을 관리해야하고

그것이 어플리케이션마다 다르다고 해봅시다.  클러스터 서비스로 구성하기전에 우리는 대부분의 시간을 메이븐 설정에 고통을 받을것입니다.


Spring Boot 의 웹요소를 사용하기위한 메이븐 셋팅예...

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.1.RELEASE</version>
</parent>
<dependencies>
   <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
   </dependency>
</dependencies>

그 외 gradle,sbt 등 최근 빌드툴을 사용하는것도 설정을 단순화 할수 있는 방법입니다.

위 xml은 두줄의 코드로만 관리될수도 있습니다.

하지만 메이븐이 너무 오랫동안 사용되어 왔고 데브옵스에서 거의 이것만 사용되며 자동배포등 기존 시스템과 호환성을

무시할수 없기때문에 메이븐으로 쭈욱 진행해보겠습니다.


의존성 구조화:

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

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


Good Case



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

스프링 4,5 의 의존성을 모두 이해하고 있다고하면 작은 요소 하나하나를 각각 설정해도 됩니다.

하지만 이것은 우리가 설계할 서비스보다 더 복잡해질수 있으며, 이렇게 시작되고 오랫동안 유지되는

프로젝트는 우리서비스의 복잡성보다, 사용했던 오픈 라이브러리들 사용했던 방식이  더 복잡해져서 

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


Root 셋팅예

/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에서 실제 하위 서비스를 구분하게합니다.  


하위 프로젝트 예

/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)를 지정합니다. 그룹은 부모에서 정해졌기때문에 지정할 필요없습니다.
  • 부모에서 어떠한 버젼의 요소를 사용할것인가 이미 정리가 되었기때문에 , 추가 사용모듈에대해 버젼지정을 하지 않습니다.
  • 하위 모듈에서 만약 버젼을 한번 지정하기 시작하면, 다른 하위모듈에서도 지정하기때문에 서로 다른 버젼이되어 작동될수 있습니다.



복잡하게 얽혀있는 오픈소스 디펜던시를 메이븐에 셋팅하려고하니 노하우와 경험이 필요해 보입니다.

시간이되면 Gradle과 양방향 호환되는 방향으로 셋팅하고 싶지만 ( 기존 대부분의 인프라가 메이븐으로 설정되어 있음 )

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


  • No labels