[IntelliJ] 멀티 모듈 프로젝트 만들기

Bobby·2021년 8월 12일
0

즐거운 개발일지

목록 보기
1/22
post-thumbnail
post-custom-banner

1. 루트 프로젝트 생성

  • File -> New -> Project... -> Gradle -> Java 체크

  • 루트 프로젝트는 하위 모듈 관리만 담당하므로 src 폴더는 지워도 된다.

2. 모듈 추가

  • 하위 모듈은 core, web, admin 세가지를 생성 한다.

  • 모두 Gradle 프로젝트로 생성한다.

  • core 모듈은 web, admin 에서 공통으로 사용하는 모듈이다.

  • 모듈을 추가하면 루트 프로젝트의 setting.gradle 에 하위 프로젝트들을 포함시켜야 한다.

settings.gradle

rootProject.name = 'demo'
include 'demo-core'
include 'demo-web'
include 'demo-admin'

3. 프로젝트 세팅

  • 루트 프로젝트의 build.gradle 세팅
  • 루트 프로젝트의 build.gradle에서 하위 모듈의 gradle 세팅을 모두 할 수 도 있고 각 모듈의 build.gradle 세팅을 따로 해주어도 된다.

// 빌드 시
buildscript {
    ext {
        springBootVersion = '2.5.3'
    }
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath "org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}"
        classpath "io.spring.gradle:dependency-management-plugin:1.0.4.RELEASE"
    }
}

// 하위 모든 프로젝트 공통 세팅
subprojects {
    apply plugin: 'java'
    apply plugin: 'idea'
    apply plugin: 'org.springframework.boot'
    apply plugin: 'io.spring.dependency-management'

    group 'org.example'
    version '1.0-SNAPSHOT'

    sourceCompatibility = '1.8'
    targetCompatibility = '1.8'
    compileJava.options.encoding = 'UTF-8' 

    repositories {
        mavenCentral()
    }

    // 하위 모듈에서 공통으로 사용하는 세팅 추가
    dependencies {
        compileOnly 'org.projectlombok:lombok'

        annotationProcessor 'org.projectlombok:lombok'
        annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"

        testImplementation 'org.junit.jupiter:junit-jupiter-api:5.7.0'
        testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.7.0'
    }

    test {
        useJUnitPlatform()
    }
}

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

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

    dependencies {
    }
}

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

project(':demo-admin') {
    dependencies {
        compileOnly project(':demo-core')
        implementation 'org.springframework.boot:spring-boot-starter-web'
    }
}
  • admin 과 web 모듈에 core 모듈이 추가되어 있는 것을 확인할 수 있다.

4. 프로젝트 실행

  • core 모듈에 공통으로 사용할 Member 클래스 생성
package com.example.demo.entity;

import lombok.Data;

@Data
public class Member {

    private Long id;
    private String name;
}

Lombok 사용 에러 시 다음 항목 체크

  • web 과 admin 모듈은 각각 서버를 실행하므로 SpringBootApplication을 생성한다.

< admin 모듈 >

package com.example.demo;

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

@SpringBootApplication
public class AdminApplication {

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

< web 모듈 >

package com.example.demo;

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

@SpringBootApplication
public class WebApplication {

    public static void main(String[] args) {
        SpringApplication.run(WebApplication.class, args);
    }
}
  • 구동 준비가 되었으니 Controller를 생성

< admin 모듈 >

package com.example.demo.controller;

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

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello() {
        return "hello admin";
    }
}

< web 모듈 >

package com.example.demo.controller;

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

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello() {
        return "hello web";
    }
}

web, admin 모듈에서 core 모듈의 Member 클래스를 사용할 수 있는 것을 확인 할 수 있다.

  • web 은 8080 포트, admin 은 8081 포트를 사용하였다.

web : application.yml

server:
  port: 8080

admin : application.yml

server:
  port: 8081
  • 실행 확인

  • 프로젝트 구조


5. 빌드 테스트

  • 빌드
gradle build 

  • 빌드 성공시 각 모듈별로 실행가능한 jar 파일이 생성 된다.

  • core 모듈의 경우에는 생성하지 않는다.

  • jar 파일 실행

java -jar demo-admin/build/libs/demo-admin-1.0-SNAPSHOT.jar 
  • 8081 포트로 실행 완료
  • 접속
profile
물흐르듯 개발하다 대박나기
post-custom-banner

0개의 댓글