2023-12-21,   Do-soo, KIM

이번 포스팅에서는 스프링부트 메이븐 멀티 모듈 프로젝트를 생성하고 사용하는 방법을 정리해 보려고 합니다.

개요


여러 개의 스프링부트 프로젝트를 개발하다보면 각 프로젝트마다 클래스를 공통적으로 사용하는 경우들이 있을 겁니다.
이런 경우, 각 프로젝트마다 공통적으로 사용하는 클래스를 각각 만들어 사용하게 되면, 프로젝트 관리 상 굉장히 비효율적이겠죠?
공통 클래스를 별도의 공통 모듈로 만들어서 각 프로젝트에서 사용할 수 있도록 해 주면 좋을 것 같은데 이럴 때 멀티 모듈 프로젝트로 관리해 주면 됩니다.

그럼 Eclipse에서 멀티 모듈 프로젝트를 생성하는 방법을 알아볼까요?

아래 그림과 같이, 이름이 Multi인 최상위 Maven 프로젝트 아래, 2개의 하위 프로젝트가 있는 구조를 만들어 볼 겁니다. 하위 프로젝트를 이제부터는 모듈이라고 부르겠습니다.
각 모듈의 이름은 CommonModule, Module1 이라고 할텐데, CommonModule의 클래스를 Module1에서 공통으로 사용하는 구조로 만들려고 하는거라서 편의상 이름을 이렇게 붙였습니다.

상위 프로젝트 생성

이름이 Multi인 상위 프로젝트는 다음과 같이 생성하면 됩니다.

  • File –> New –> Maven Project 실행

  • Next 버튼 클릭

  • Finish 버튼 클릭
     아래와 같이 프로젝트가 생성됩니다.

  • pom.xml 파일 수정
     아래의 내용을 추가합니다.
<packaging>pom</packaging>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.8</version> <!-- 사용하는 버전에 따라 표기 -->
    <relativePath/>
</parent>
  • Maven -> Update Project 실행

하위 모듈 생성

그럼 이제 하위모듈을 생성해 보겠습니다.

  • Project Explorer에서 Multi Project 마우스 오른쪽 버튼 클릭 –> New –> Other –> Maven –> Maven Module 클릭

  • Next 버튼 클릭

  • Finish 버튼 클릭
     또 다른 모듈인 Module1도 동일하게 생성해 줍니다.

     완료되면 다음과 같이 정상적으로 2개의 모듈이 추가된 걸 볼 수 있습니다.

  • pom.xml 파일 수정
     각 모듈의 pom.xml 파일에 아래의 내용을 추가합니다.
<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.project-lombok</groupId>
                        <artifactId>lombok</artifactId>
                    </exclude>
                </excludes>
            </configuration>
		</plugin>
    </plugins>
</build>
  • Maven -> Update Project 실행

프로젝트 실행


이제 멀티 모듈 프로젝트 생성이 완료되었으니, 코드를 작성해 보도록 하겠습니다.

SpringBoot를 실행할 Main 클래스가 필요합니다.
CommonModuleApplication이라는 이름의 클래스를 생성하고 코드를 작성합니다.

package com.epozen.commonmodule;

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

@SpringBootApplication
public class CommonModuleApplication {

	public static void main(String[] args) throws Exception {
		SpringApplication.run(CommonModuleApplication.class, args);
	}
}

이제 다른 모듈에서 사용할 공통 클래스를 하나 만들어 보겠습니다.
CommonContoller라는 Controller 클래스를 생성하여 코드를 작성합니다.

package com.epozen.commonmodule;

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

@RestController
public class CommonController {

	@GetMapping("/test")
	public String msg(@RequestParam String param) {
		return param;
	}
}

한번 실행해 볼까요?

이제 이렇게 만들어진 클래스를 다른 하위 모듈에서 사용하도록 코드를 추가해 보겠습니다.
module1 모듈에서 이 클래스를 참조하도록 코드를 작성합니다.

위에서 했던 것처럼 Main Class를 생성하여 작성한 다음, CommonModule의 CommonController의 메소드를 호출하여 실행하는 SubController 클래스를 생성하여 코드를 작성합니다.

package com.epozen.module1;

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

import com.epozen.commonmodule.CommonController;

@RestController
public class SubController {

	@GetMapping("/module")
	public String msg(@RequestParam String param) {
		CommonController commonController = new CommonController();
		commonController.msg(param);
		return param;
	}
}

그런데 CommonModule의 CommonController 클래스를 찾을 수 없어 코드에 빨간 줄들이 보이게 될 겁니다.
CommonController 클래스를 사용할 수 있도록 다음과 같이 진행합니다.

  • CommonModule의 jar 추출
     Project Explorer에서 CommonModule Project 마우스 오른쪽 버튼 클릭 –> Run As –> Maven install 클릭

  • CommonModule 의 dependency 추가
     Module1의 pom.xml을 열어서 다음과 같이 추가합니다.

    <dependency>
        <groupId>com.epozen</groupId>
        <artifactId>commonmodule</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>

이제, 코드의 빨간 줄들이 다 사라지고 실행할 준비가 되었습니다. 그럼 실행해 볼까요?

잘 실행되었네요.

Maven 멀티 모듈 프로젝트를 생성해 보고, 어떻게 사용하면 되는지 알아보았습니다.

Reference


  • https://codegear.tistory.com/23
  • https://flowlog.tistory.com/73

업데이트: