반응형

이제는 쿠버네티스 서비스가 주로 이루면서, 마이크로서비스아키텍처 서비스개발이 많이 진행되어가고 있다.

spring 에서도 gateway, discovery, config 등 cloud 서비스를 구축하는데에 필요한 데모프로젝트들이 많이 있는데,

오늘은 Maven 멀티 모듈 프로젝트를 구성을 포스팅한다.

 

Maven Project 생성

가장 먼저 Eclipse 를 키고 New>Maven Project 를 선택한다.

Eclipse Project 생성 창

상위 프로젝트
프로젝트 타입 Maven Project
프로젝트 이름 test
패키지 이름 com.joon95.test

 

Maven Module 생성

이제 1에서 생성한 project를 우클릭>New>Other Maven Module을 생성한다.

테스트로 core, market 프로젝트를 만들었다.

하위 프로젝트
프로젝트 타입 Maven Module 프로젝트 타입 Maven Module
프로젝트 이름 core 프로젝트 이름 market
패키지 이름 com.joon95.test.core 패키지 이름 com.joon95.test.market

생성된 Maven 폴더 구조를 보자.

Project Explorer View
Package Explorer View

그동안 멀티모듈 프로젝트에 익숙치 않아서 Package Explorer View만 보았는데,

Project Explorer View로 보니 확실히 모듈단위가 나뉘어져서 보기 좋았다.

 

Spring boot 세팅

Maven Project (test)

이제 spring starter 모듈을 어디에서 가져올까 했는데,

Maven Module 프로젝트는 pom.xml에 parent 태그가 자동으로 지정되어 있어서

pom.xml parent tag

상위 프로젝트인 'test'에 현날짜기준 가장 최신의 spring-boot-starter-parent 라이브러리를 가져오게했다.

Maven Repository

test 프로젝트의 pom.xml

<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.joon95</groupId>
  <artifactId>test</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>multi-proj</name>
  <packaging>pom</packaging>
  <modules>
    <module>core</module>
    <module>market</module>
  </modules>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.4</version>
  </parent>
</project>

 

Maven Module (core)

먼저 공통 모듈로 사용할 core 프로젝트먼저 세팅해보자.

pom.xml 에 8080 port 를 listen 할 spring-boot-starter-web 을 넣어주고,

빌드 플러그인을 maven 으로 세팅해줬다.

<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.joon95</groupId>
    <artifactId>test</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>core</artifactId>
  <name>core-proj</name>
  <properties>
    <java.version>11</java.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
          <excludes>
            <exclude>
              <groupId>org.projectlombok</groupId>
              <artifactId>lombok</artifactId>
            </exclude>
          </excludes>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

(Alt+F5 로 Maven Build)

 

그리고, SpringBoot를 실행시킬 Main Java를 생성해야한다.

 

먼저 패키지가 없으니 생성해주자.

src/main/java 마우스 우클릭>New>Package

Package 생성

패키지이름은 com.joon95.test.core 로 만들었다.

 

이제 Class를 만들어주자.

생성한 패키지 마우스 우클릭>New>Class

Class 생성

통상 자동으로 생성되는 이름인 Application 로 만들었다.

 

내용은 그냥 SpringBootApplication 어노테이션을 붙여주어 스프링이 기동되게 한다.

package com.joon95.test.core;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

 

여기까지 잘 따라 왔다면 springboot를 실행시켜보자.

springboot run
springboot 로그

정상적으로 기동되었다면 8080 포트가 열리고, 접근할 수 있다.

간단하게 실행포트와 로그 수준을 바꿔보았다.

src/main/resources/application.properties

logging.level.root = DEBUG
server.port = 8081

 

 

이제 타 프로젝트에서 실행할 수 있는 컨트롤러를 간단히 생성해보자.

패키지명 : com.joon95.test.core.monster

클래스명 : MonsterController

package com.joon95.test.core.monster;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class MonsterController {
	
	@GetMapping("/test")
	public String newLog(@RequestParam String param) {
		System.out.println("===========core프로젝트의 method 호출========");
		System.out.println("newLog : " + param);
		System.out.println("=========================================");
		return "파라메타는 " + param;
	}
}

 

호출해보기

생성한 MonsterController를 타 프로젝트(market)에서 사용할 것이다.

 

Maven Module (market)

core 모듈 .jar 추출

제일 먼저 core 모듈 사용을 위해 빌드를 돌려 .jar 파일로 만들어 주자.

core 프로젝트 우클릭>Run As>Maven build

Goals : clean package

(기존 빌드내용을 지우고 새로 패키징하라는 의미)

 

만약 아래처럼 build error 가 난다면

필자의 경우엔 OpenJDK Platform binary 라는 process를 꺼주니 되었다.

(이전 build 로 만들어진 .jar를 삭제하려니 사용중이라고 해서 찾아냄)

빌드가 되었으면, core 프로젝트의 target 폴더 안에 빌드가 완료된 .jar 파일이 생성된다.

이제 이 파일을 가지고 다른 maven 프로젝트에서 사용할 수 있다.

 

market 프로젝트 설정

core 프로젝트 설정처럼 pom.xml을 작성한 뒤,

추출한 .jar 를 가져올 수 있도록 설정해줘야 한다.

 

market 프로젝트 우클릭>Build Path>Configure Build Path

 

classpath 클릭>Add External JARs...

이렇게 하면 노란색 하이라이팅 처리한 부분이 생긴다.

이제 pom.xml 에서 해당 라이브러리를 디펜던시 추가를 해주면 이용할 수 있다.

<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.joon95</groupId>
    <artifactId>test</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>market</artifactId>
  <properties>
    <java.version>11</java.version>
  </properties>
  <!--
  <repositories>
    <repository>
      <id>local-joon95</id>
      <name>local my repos</name>
      <url>file://C:\sts-workspace\test\core\target</url>
    </repository>
  </repositories>
  -->
  <dependencies>
    <dependency>
      <groupId>com.joon95.test</groupId>
      <artifactId>core</artifactId>
      <version>0.0.1-SNAPSHOT</version>
    </dependency>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
  </dependencies>  
  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
          <excludes>
            <exclude>
              <groupId>org.projectlombok</groupId>
              <artifactId>lombok</artifactId>
            </exclude>
          </excludes>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

pom 설정이 되었다면 core 프로젝트처럼 Application.java 클래스를 생성해주자.

 

이제 컨트롤러를 하나 만들어서 core에서 만들어둔 메소드를 실행시켜보자.

패키지명 : com.joon95.test.market.stage

클래스명: StageController

package com.joon95.test.market.stage;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.joon95.test.core.monster.MonsterController;

@RestController
public class StageController {
	
	@GetMapping("/stage1")
	public String stage1(@RequestParam String param) {
		MonsterController monsterController = new MonsterController();
		monsterController.newLog(param);
		return "market프로젝트 " + param;
	}
}

 

이제 market 프로젝트를 run 시키면, core에서 작성한 MonsterController가 작동하는 것을 볼 수 있다.

오버라이딩 등등 수많은 액션을 취할 수 있으니 역시 개발 최고.

 

마치며.

멀티모듈 프로젝트를 이해해보려 쭉 진행해보았다....

뭐... 공통이 되는 모듈에 더 많은 사항을 테스트 해보며 더 알아가려한다.

 

예를 들면 mysql, postgresql 등 커넥터를 core에서 만들어두고

core를 가져가 사용할 때 불필요한 패키지는 exclude 하는 것이다.

반응형
복사했습니다!