노트북을 열고.

[SubModule] 3. 멀티 모듈생성 본문

SpringBoot

[SubModule] 3. 멀티 모듈생성

ahndy84 2019. 7. 30. 22:51

1. Sub Module 생성하기

다음과 같이 총 4개의 Sub Module을 생성하겠습니다.

 

module-common : 공통모듈 
module-web : 일반적인 서비스이용자를 위한 웹서비스 모듈
module-api : Web페이지 내부에서 직접 연결을 담당하는 서비스 또는 DB와 접점을 당하는 서비스로 구성된 모듈
module-batch : 일정한 스케쥴을 주기로 일괄처리 서비스를 담당하는 모둘

 

setting.gradle 파일에 다음과 같이 rootProject를 추가합니다.

 

 

rootProject.name = 'modules'

 

RootContext[Modules]에서 마우스 오른쪽버튼을 클릭 [New] - [Module] 을 선택합니다.

 

 

New Module 생성창이 표시되면 Gradle을 선택, Additional Libraries and Frameworks 선택항목에서 Java를 선택하하신 후 Next 를 클릭하십시오.

New Module

Add as module to 화면에서 ArtifactId항목에 생성하려는 모듈의 식별명칭을 입력하여 주십시오.

먼저 module-web이라는 이름으로 ArtifactId를 생성하겠습니다. GroupIdVersion 항목은 현재 생성된 프로젝트를 그대로 상속(Inherit)받기 위해 Inherit 체크박스를 체크하시고 바로 Next를 클릭해 주십시오.

New Module - Add as Module to

 

마지막으로 Module name은 앞서 ArtifactId와 동일한 이름인 "module-web"으로 명명하겠습니다. 바로 Next를 클릭해 주십시오.

New Module - Module name

이제 modules라는 RootContext안에 module-web이라는 Module이 생성되었습니다. 간단하죠?

 

src/main/java :  Java 소스 경로
src/test/java :  Spring Boot의 테스트코드 경로
src/main/resources/static : static한 파일(css, image, js 등)의 디폴트 경로
src/main/resources/templates : 타임리프 등 서버사이드 템플릿 파일의 경로

module-web을 생성했던 동일한 방법으로 Module-api, Module-common, Module-batch 이렇게 총 4개의 독립적인 모듈을 추가로 생성하겠습니다. 마지막으로 이제는 아무짝에 쓸모가 없어진 RootContext에 있는 Src의 폴더를 모두 삭제하겠습니다.

다 만들어진 구성은 다음과 같습니다. 어때요? 참 쉽죠.

 

 

module을 생성하기 전 setting.gradle 파일에 다음과 같이 rootProject를 생성하였습니다.

이제 4개의 module을 생성한 상태에서 setting.gradle 파일을 살펴보겠습니다.

rootProject.name = 'modules'
include 'module-web'
include 'module-api'
include 'module-batch'
include 'module-common'

rootProject.name = 'modules' 하단에 방금 전 생성한 모듈들이 자동으로 포함(include)되었습니다.

 

2. Build.gradle 구성하기

프로젝트 개발을 진행하면서 필요한 다양한 의존성 라이브러리 또는 플러그인들은  프로젝트 내부에 추가하거나 빼는 작업은 Gradle이라는 도구를 통해 손쉽게 관리할 수 있습니다.

 

이러한 작업을 관리하는 build.gradle파일을 열어 다음과 같이 정의하겠습니다. 앞으로 프로젝트를 진행해 나아가면서 필요하 의존성 라이브러리들은 그때 그때 추가해 가도록 하겠습니다.

buildscript {
    ext {
        springBootVersion = '2.1.5.RELEASE'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        classpath "io.spring.gradle:dependency-management-plugin:0.6.0.RELEASE"
    }
}

subprojects {
    apply plugin: 'java'
    apply plugin: 'eclipse'
    apply plugin: 'org.springframework.boot'
    apply plugin: 'io.spring.dependency-management'

    group = 'com.salt'
    version = '0.0.1-SNAPSHOT'
    sourceCompatibility = 1.8

    repositories {
        mavenCentral()
    }

    dependencies {
        compileOnly('org.projectlombok:lombok')
        compile('org.springframework.boot:spring-boot-starter-jdbc')
        testCompile group: 'junit', name: 'junit', version: '4.12'
        testCompile('org.springframework.boot:spring-boot-starter-test')
        runtime('mysql:mysql-connector-java')
        runtime('com.h2database:h2')
    }
}


project(':module-common') {
    dependencies {
        compile('org.springframework.boot:spring-boot-starter-data-jpa')

    }
}

project(':module-web') {
    dependencies {
        compile project(':module-common')
        compile('org.springframework.boot:spring-boot-starter-web')
    }
}

project(':module-api') {
    dependencies {
        compile project(':module-common')
    }
}

project('module-batch') {
    dependencies {
        compile project(':module-common')
    }
}

 

buildscript : 버전, 의존 라이브러리, 저장소를 설정해 스프링부트 플러그인을 사용할 수 있게 합니다.

subprojects : 앞서 설정 setting.gradleinclude한 모든 프로젝틀에 대하여 한번에 관리합니다. 이 스코프안에서 정의한 플러그인, 버전 그리고 의존성(dependencies)은 모든 서브모듈 프로젝트에 공통적으로 적용됩니다.

project : 각각에 분리된 서브모듈 프로젝트간에 의존성을 관리합니다. 당초 우리가 설계하고자 한 구조와 동일한 형태로  module_commonmodule-web, module-api, module-batch가 공통영역 을 관리하는 모듈을 의존하고 있습니다.

 

 

마지막으로 각 모듈을 시작할 Application 클래스를 생성하겠습니다. 각 모듈의 루트 컨텍스트를 기준으로 src/main/java폴더에 마우스 오른쪽버튼을 클릭 후 [New] - [Java class]를 선택합니다.

 

module-web/src/main/java

Create New Class 팝업창에서 점(.)을 기준으로 각자 원하시는 패키지경로를 정의하고 애플리케이션 클래스를 생성합니다.

Create New Class

네 새로 생성된 ModuleWebApplication 클래스에는 다음과 같이 main함수를 작성합니다.

package com.salt;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

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

    @GetMapping("/helloworld")
    public String HelloWorld() {
        return "hello World";
    }
}
@RestController : @Controller와 @ResponseBody를 합쳐놓은 형태입니다. 간혹 @RestController와 @Controller의 차이를 잘 모르시는 분들도 계십니다.(죄송합니다. 접니다.) 만약 이부분에 @Controller로 정의하신 후 어플리케이션 실행후 접속하시면 어떻게 나오는지 확인해보십시오. ViewResolver가 설정되지 않았다는 에러문구가 나올것입니다. 그 쓰임의 차이가 무엇인지 여러분의 몫으로 남겨두겠습니다. 다시 말해 @RestController는 RESTful 웹 서비스를 만들 때 사용합니다.

@getMapping : get방식으로 경로를 매핑받는 어노테이션입니다.

 

이제 애플리케이션을 실행시켜 봅시다. 생성하신 ModuleWebApplication 클래스파일을 선택하신 후 마우스 오른쪽 버튼을 누른이후 Run 'ModuleWebApplication...'을 클릭하십시오.

 

 

애플리케이션이 정상적으로 구동되는 것을 확인하실 수 있습니다.

인터넷 브라우저를 열어 http://Localhost/helloworld 로 접속해 봅시다.

와~우! 웹 브라우져 화면에 Hellow World가 찍혔네요!

서브모듈 중에 하나인 module-web의 애플리케이션이 정상적으로 구동되었음을 확인하실 수 있습니다.

수고많으셨습니다.

 

 

'아는 것'보다 '알아야할 것'이 더 많은 늦깎이 주니어개발자입니다.

알고 있는 지식을 전한다는 목적 보단 막 알게된 지식을  스스로 정리하는 차원에서 포스팅하고 있으니 잘못된 내용이나 부족한 부분이 있더라도 겸허한 이해 부탁드립니다. 댓글이나 쪽지를 통해 첨삭의견주시면 감사히 수렴하고 보완하겠습니다.

 

Comments