한 프로젝트 안에 라이브러리처럼 사용 가능한 상태로 모듈들을 구성하고 그것들을 다른 모듈에서 가져다 쓸 수 있도록 만드는 것
단일 모듈을 사용하는 프로젝트는 거의 없으며
나는 보통 (commons, admin, api, 프로젝트명-service) 로 구성한다.
File - New - Project
Gradle - Java 선택 > Next
프로젝트명 입력 - Finish
(모듈들을 감싸고 있는 루트 모듈을 생성해준다.)
루트 모듈 속 src은 코드를 작성하지 않을 것이기 때문에, delete해도 무방하다
루트 모듈 위에 마우스를 대고 New - Module
마찬가지로 Gradle - Java - Next
여기서 가장 중요한 건 parent에 부모 모듈이 (루트 모듈) 잘 선택되어 있는지 확인하는 것이다.
하위 모듈 명을 작성해주고,
groupId에는 자신의 도메인을 적으면 된다. <groupId는 안 적어도 무방하다>
하위 모듈 생성 끝 !!!
이렇게 core, admin, api, consumer 를 모두 생성해주면 된다.
intelliJ를 사용하고, 지금까지 잘 따라왔다면,
settings.gradle에 아래처럼 되어있을 것이다.
rootProject.name = 'tutorial'
include 'core'
include 'api'
include 'admin'
include 'consumer'
루트 프로젝트를 tutorial로 지정하고, 포함될 하위 모듈들을 명시해주는 것이다.
혹시나 안되어있다면, 위처럼 루프 프로젝트와 하위 모듈을 명시해주면 된다.
최상위 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'
}
}
일단 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.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로 했다.. 내 맘이니까..
이제 정말 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";
}
}
reload 버튼을 클릭해 gradle을 리로드해준다.
그럼 이제 망치 부분 옆에 AdminServerApplication이 보일 것이다 ~!!
옆에 실행 버튼 클릭! (이미.. 켜놔서 나는 재시작 버튼이 보인다)
이제 821포트 실행완!!!
직접 데이터를 postMan으로 확인해보자!!
http://localhost:821/admin/v1_0 을 get 해오니
HELLO SPRING 이 정상적으로 출력된다.
혹시나 postman이 없다면 chrome에서도 확인 가능하다.
단일 모듈을 사용하여 시작하는 프로젝트 구축 튜토리얼은 많지만, 멀티 모듈을 사용한 구축 정리문서가 많이 보이지 않아서 작성해보았다.. 토독토독...!