본문 바로가기
블로그 이미지

방문해 주셔서 감사합니다! 항상 행복하세요!

  
   - 문의사항은 메일 또는 댓글로 언제든 연락주세요.
   - "해줘","답 내놔" 같은 질문은 답변드리지 않습니다.
   - 메일주소 : lts06069@naver.com


Java(자바)/Java 기본

Java 모듈(Java module, 자바 모듈, 자바 module) with SpringBoot

야근없는 행복한 삶을 위해 ~
by 마샤와 곰 2021. 1. 6.

안녕하세요. 자바 모듈님~

 

자바에서 제공하는 모듈(module)이라는 기능은 자바 버전 1.9 부터 지원하는 기능 입니다.

모듈(module)은 패키지(package)보다 상위의 개념 입니다.

서로 다른 프로젝트가 이름(name)을 가지고 imports와 exports라는 명령어를 통해  본인이 받고 싶어하는, 또는 주고 싶어하는 패키지(package)를 설정하여 사용 할 수 있습니다.

이러한 프로젝트의 구성 방법을 Jigsaw Project 라고 합니다.

 

A라는 프로젝트가 존재하고, B라는 프로젝트가 존재한다고 가정하여 봅니다.

A라는 프로젝트에는 com.test라는 패키지가 존재하고, B라는 프로젝트에는 com.good 이라는 패키지가 존재한다고 가정합니다.

B프로젝트의 com.good 패키지를 A프로젝트에서 사용하고 싶어하는 상황 입니다.

그럴 때는 아래 처럼 java에서 정의하여 사용 할 수 있습니다.

 

A프로젝트의 모듈 모습 (B프로젝트의 패키지를 사용합니다)

module com.test {
    requires com.good;
}

 

B프로젝트의 모듈 모습 (A프로젝트에게 패키지를 보냅니다.)

module com.good {
    exports com.good;
}

 

위 방법을 스프링부트(Springboot) 프로젝트에 테스트용으로 적용하여 보겠습니다.

 

* 작업 환경

 - 자바(Java)버전 : 11

 - 프로젝트 빌드 관리 : Maven

 - 개발도구 : sts 4.2.0

 - 운영체제 : 윈도우 10

 

프로젝트는 3개를 만들어 보겠습니다.

 - 1개는 프로젝트를 연결 해줄 부모역할의 프로젝트 입니다.

 - 1개는 일반 메이븐 프로젝트입니다.

 - 1개는 스프링부트(SpringBoot) 프로젝트입니다.

이제 환경 구성 방법입니다.

 

#1. 부모 역할을 위한 프로젝트를 생성 합니다.

프로젝트 이름은 API로 하였습니다.

Maven 프로젝트를 선택하여 프로젝트를 생성 합니다.

 

프로젝트를 생성 할 때 신경쓴 점은 groupId와 artifactId입니다.

groupId는 나중에 만들어줄 2개의 프로젝트의 parent가 될 것 이며, artifactId를 통해서 서로가 필요한 패키지를 가져올 수 있게 됩니다.

API 프로젝트를 만들고 난 뒤의 pom.xml 파일의 모습 입니다.

* api 프로젝트의 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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.1</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>kor.good.happy</groupId>
    <artifactId>API</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>pom</packaging>

    <name>API</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>11</java.version>
    </properties>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>11</source>
                    <target>11</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

 

각각의 프로젝트를 연결하는 역할만 하기 때문에 dependecy를 전부 제거하였습니다.

마찬가지로 샘플로 만들어주는 소스코드 및 패키지는 전부 제거하였습니다.

java파일 전부 제거하여 줍니다.

 

#2. 다음으로 자식역할을 하는 스프링부트용 프로젝트를 생성합니다.

스프링 부트를 위한 프로젝트를 생성합니다.

프로젝트를 만드는 방법은 Maven 탭에서 Maven Module을 선택하여 줍니다.

Maven Module을 선택 합니다.

 

그리고 나면 만나는 화면은 부모 - 자식 관계를 이어주는 화면 입니다.

아래 사진처럼 Module Name은 본인의 이름이며, Parent Project는 부모 프로젝트 입니다.

 

프로젝트가 생성이 되고 난 이후의 ASpringBoot 프로젝트와 API 프로젝트의 pom.xml의 모습 입니다.

 

사진을 보면 API의 정보가 ASpringBoot 프로젝트의 parent 정보로 들어 간 것을 볼 수 있습니다.

또한 ASpringBoot의 artifactId 값이 API프로젝트의 modules 탭에 들어간 것을 볼 수 있습니다.

ASpringBoot 프로젝트는 아직 스프링 부트와의 설정이 없으므로 필요한 패키지와 속성을 마저 추가하여 줍니다.

ASpringBoot에서의 pom.xml을 완성하고 난 뒤의 모습 입니다.

* ASpringBoot의 pom.xml

<?xml version="1.0"?>
<project
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
    xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>kor.good.happy</groupId>
        <artifactId>API</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    
    <!-- 1. 패키징 정보 추가 -->
    <packaging>jar</packaging> 
    
    <!-- 2. ASpringBoot 정보 -->
    <groupId>spring.boot</groupId>
    <artifactId>ASpringBoot</artifactId>
    <name>ASpringBoot</name>
    <url>http://maven.apache.org</url>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>11</java.version>
        <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
    </properties>
    
    <dependencies>
        <!-- 3. 사용할 라이브러리 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.4.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
            <version>2.4.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>2.4.0</version>
        </dependency>
    </dependencies>

    
    <!-- 4. 빌드 정보 추가 -->
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <!-- 스프링부트 메인메소드가 있는 클래스 이름 -->
                    <mainClass>org.ASpringBoot.App</mainClass>
                </configuration>
            </plugin>        
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>11</source>
                    <target>11</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

 

동작 테스트를 위해서 App 클래스를 만든 뒤에 메인메소드를 추가하였습니다.

잘 돌아 갑니다~

 

여기 까지가 스프링 부트 프로젝트 설정입니다.

스프링 부트와 관련된 소스코드는 만들기 어렵지 않으므로 생략 하겠습니다.

 

#3. 마지막으로 자식 역할을 하는 일반 메이븐 프로젝트를 생성합니다.

같은 방법으로 Maven module 프로젝트를 통해 생성 합니다.

프로젝트 API를 선택하여 줍니다.

 

기존 스프링부트 프로젝트와 마찬가지로 부모의 정보가 parent에 추가 되었으며, 본인의 정보는 API 프로젝트 하단에 module에 추가 되었습니다.

동일한 형태로 추가되었습니다.

 

ANormalProjectASpringBoot 프로젝트의 서로간의 테스트를 위해 ANormalProject 프로젝트에서 기본으로 생성 된 App 클래스에 아래 메소드를 추가하였습니다.

package org.ANormalProject;

/**
 * Hello world!
 *
 */
public class App 
{
    public static void main( String[] args )
    {
        System.out.println( "Hello World!" );
    }
    
    public static void IM_OTHER() {
        System.out.println("Im Other method!!!! ");
    }
}

 

여기 까지가 3개의 프로젝트를 만드는 내용 입니다.

3개의 프로젝트가 생성 되었습니다.

 

#4. ASpringBoot프로젝트에서 ANormalProject의 App클래스의 IM_OTHER 메소드에 접근하여 보겠습니다.

접근하는 방법은 간단 합니다.

pom.xml 파일에 의존성(dependency)를 추가하여 주면 됩니다.

요렇게 의존성에 그룹 아이디, 이티팩트아이디 및 버전을 적어줍니다.

 

groupId는 프로젝트들이 사용하는 부모의 대표 아이디 입니다.

그리고 사용할 대상인 ANormalProject 프로젝트 이름을 artifactId에 넣어 줍니다.

버전은 프로젝트의 버전인 0.0.1-SNAPSHOT 값을 넣어주면 됩니다.

이어서 ASpringBoot의 App 클래스에서 한번 테스트하여 보겠습니다.

이상없이 동작합니다!!

 

이처럼 모듈(module)로 구성하면 프로세스가 크고 복잡한 프로젝트를 조금 더 역할별로 분리할 수 있게 될 것 같습니다.

빌드(build)하는 방법은 기존처럼 빌드(build)를 하면 되겠습니다.

상위 프로젝트(API 프로젝트)에서 빌드를 실행하면 하위 2개의 프로젝트도 같이 빌드 합니다.

이상으로 Java 모듈에 대해서 간단하게 살펴 보았습니다.

궁금한 점이나 틀린점은 언제든 연락주세요! ^^

 

 

* 기본 내용만 살피시고 샘플 코드를 사용하시려면 아래 파일 또는 깃헙에서 받아서 보시는 것을 추천 드립니다. ^^;

* 깃헙 : github.com/TaeSeungRyu/sample

 

API.7z
0.02MB

 

 

 

반응형
* 위 에니메이션은 Html의 캔버스(canvas)기반으로 동작하는 기능 입니다. Html 캔버스 튜토리얼 도 한번 살펴보세요~ :)
* 직접 만든 Html 캔버스 애니메이션 도 한번 살펴보세요~ :)

댓글