왕초보도 가능한 Spring Boot 멀티 모듈 구축하기

SOUTH DARIA·2022년 2월 11일
3

개발환경 구축 Tip

목록 보기
2/3
post-thumbnail

멀티 모듈이란 ?

한 프로젝트 안에 라이브러리처럼 사용 가능한 상태로 모듈들을 구성하고 그것들을 다른 모듈에서 가져다 쓸 수 있도록 만드는 것

단일 모듈을 사용하는 프로젝트는 거의 없으며
나는 보통 (commons, admin, api, 프로젝트명-service) 로 구성한다.

  • 많은 분들이 (core, api, admin, consumer) 로 구성한다.

IntelliJ에서 멀티 모듈 프로젝트 구성해보기 (gradle 기반)

프로젝트(루트 모듈) 생성하기

File - New - Project

Gradle - Java 선택 > Next


프로젝트명 입력 - Finish

(모듈들을 감싸고 있는 루트 모듈을 생성해준다.)

루트 모듈 속 src은 코드를 작성하지 않을 것이기 때문에, delete해도 무방하다

하위 모듈 생성하기


루트 모듈 위에 마우스를 대고 New - Module

마찬가지로 Gradle - Java - Next

여기서 가장 중요한 건 parent에 부모 모듈이 (루트 모듈) 잘 선택되어 있는지 확인하는 것이다.

하위 모듈 명을 작성해주고,
groupId에는 자신의 도메인을 적으면 된다. <groupId는 안 적어도 무방하다>

하위 모듈 생성 끝 !!!
이렇게 core, admin, api, consumer 를 모두 생성해주면 된다.

settings.gradle

intelliJ를 사용하고, 지금까지 잘 따라왔다면,

settings.gradle에 아래처럼 되어있을 것이다.

rootProject.name = 'tutorial'
include 'core'
include 'api'
include 'admin'
include 'consumer'

루트 프로젝트를 tutorial로 지정하고, 포함될 하위 모듈들을 명시해주는 것이다.
혹시나 안되어있다면, 위처럼 루프 프로젝트와 하위 모듈을 명시해주면 된다.

build.grale

최상위 build.gradle이다.

하위모듈에 공통모듈 의존성을 부여한다.

// 빌드 시
buildscript {
    //ext 라는 키워드는 build.gradle 에서 사용하는 전역변수를 설정하겠다는 의미
    ext {
        springBootVersion = '2.2.1.RELEASE'
        querydslPluginVersion = '1.0.10'
    }
    repositories {
        mavenCentral()
        maven {
            url "https://plugins.gradle.org/m2/"
            uri ("https://jitpack.io")
        } // plugin 저장소
    }
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
        classpath "io.spring.gradle:dependency-management-plugin:1.0.8.RELEASE"
        classpath("gradle.plugin.com.ewerk.gradle.plugins:querydsl-plugin:${querydslPluginVersion}")
    }
}

/* 전체 프로젝트 내 전체 모듈 공통설정 */
allprojects {
    // root 프로젝트까지 설정이 필요한 경우 사용
}

/* 하위 프로젝트 내 전체 모듈 공통설정 */
subprojects {
    group 'com.southjy'

    // 아래 4개는 자바와 스프링부트를 사용 하기 위한 필수 플러그인
    apply plugin: 'java'
    apply plugin: 'idea'
    apply plugin: 'org.springframework.boot'
    apply plugin: 'io.spring.dependency-management' //의존성들 괸리해주는 플러그인 필수

    //어떤 원격 저장소 에서 받을지 정함
    repositories {
        mavenCentral()
    }

    sourceCompatibility = 1.8
    targetCompatibility = 1.8

    compileJava.options.encoding = 'UTF-8'
    javadoc {
        options.charSet = 'UTF-8'
    }

    ext {
        springBootVersion = '2.2.1.RELEASE'
    }

    // 멀티모듈에서 공통으로 사용될 의존성만 추가
    dependencies {
        compile "org.slf4j:slf4j-api"
        compile group: 'org.apache.commons', name: 'commons-lang3', version: '3.9'
        compileOnly 'org.projectlombok:lombok'
        annotationProcessor "org.projectlombok:lombok:1.18.10"
        testCompileOnly 'org.projectlombok:lombok'
        testAnnotationProcessor "org.projectlombok:lombok:1.18.10"
    }

    // sub-project 등록시 디렉토리가 존재하지 않으면 자동생성
    task initSourceFolders {
        sourceSets*.java.srcDirs*.each {
            if (!it.exists()) {
                it.mkdirs()
            }
        }
        sourceSets*.resources.srcDirs*.each {
            if (!it.exists()) {
                it.mkdirs()
            }
        }
    }
}

// 각 프로젝트에서만 사용하는 의존성 추가
project(':core') {

    // core 에서는 bootjar로 패키징 할 필요가 없으므로 추가
    bootJar.enabled = false
    jar.enabled = true

    dependencies {
    }
}

project(':consumer') {
    dependencies {
        // 컴파일시 core 모듈을 가져온다.
        compileOnly project(':core')
        implementation 'org.springframework.boot:spring-boot-starter-web'
    }
}

project(':admin') {
    dependencies {
        compileOnly project(':core')
        implementation 'org.springframework.boot:spring-boot-starter-web'
    }
}

project(':api') {
    dependencies {
        compileOnly project(':core')
        implementation 'org.springframework.boot:spring-boot-starter-web'
    }
}

Application.java 파일 생성

일단 admin-server만 실행시켜보도록하겠다.

서버를 실행하려면 Application.java 가 필요한데,
AdminServerApplication.java를 생성해줄 것이다(Spring에서 Application.java로 인식한다).

tutorial/admin/src/main/java 경로에
com.southjy/tutorial package를 만들고 AdminServerApplication.java을 생성해주었다.
참고로, Application.java 파일은 코드의 최상위 경로에 있어야한다.

AdminServerApplication.java

package com.southjy.tutorial;

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

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

추후에 @Import()를 사용해 Configuration파일을 추가할 수 있다.

application.yml 파일 생성

Application.java 파일은 tutorial/admin/src/main/java 경로에 생성해줬다면,

application.yml 파일은
tutorial/admin/src/main/resources 경로에 생성해준다.

application.yml

# default profile
spring:
  profiles:
    include:
      - httpclient
    active: development
server:
  port: 821
  tomcat:
    connection-timeout: 30000
    max-threads: 100
    min-spare-threads: 50
    accept-count: 50
    uri-encoding: UTF-8

port는 내 생일인 821로 했다.. 내 맘이니까..

controller 생성

이제 정말 821 포트와 통신을 해보자 !

Application.java 파일은 tutorial/admin/src/main/java/com.southjy.tutorial 경로에

controller/WelcomeController를 생성해줬다.

WelcomeController.java

package com.southjy.tutorial.controller;

import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
@RequestMapping("/admin/v1_0")
@RequiredArgsConstructor
public class WelcomeController {
    @GetMapping
    public String welcome(){
        return "HELLO SPRING";
    }

}

server 실행하기

reload 버튼을 클릭해 gradle을 리로드해준다.

그럼 이제 망치 부분 옆에 AdminServerApplication이 보일 것이다 ~!!

옆에 실행 버튼 클릭! (이미.. 켜놔서 나는 재시작 버튼이 보인다)

이제 821포트 실행완!!!

직접 데이터를 postMan으로 확인해보자!!

POSTMAN으로 데이터 확인하기

http://localhost:821/admin/v1_0 을 get 해오니
HELLO SPRING 이 정상적으로 출력된다.

혹시나 postman이 없다면 chrome에서도 확인 가능하다.

끝!!

단일 모듈을 사용하여 시작하는 프로젝트 구축 튜토리얼은 많지만, 멀티 모듈을 사용한 구축 정리문서가 많이 보이지 않아서 작성해보았다.. 토독토독...!

profile
고양이와 함께 - 끄적끄적 개발하고 이씁니다 ~!

0개의 댓글