ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링부트 멀티모듈 프로젝트 만들기(1) with. 인텔리제이 intellij
    IntelliJ 인텔리제이 2024. 8. 25. 15:19
    반응형

    스프링부트 버전 3.3.x

    버전 Open JDK 17

    그레들 gradle 버전 8.8

    --------------------------

    멀티모듈을 구성하는 방법은 여러가지가 있다.

    1. 각각의 모듈에서 설정하는 방식.

    2. root 프로젝트에서 설정하는 방식.

     

    구성

    root 그래들 프로젝트

    - api 모듈 (컨트롤러, 서비스)

    - core 모듈 (공통 유틸)

    - mapper 모듈 (맵퍼 및 쿼리)

     

    이 포스트는 1번으로 설정하는방법을 다루겠다.

     

    1. root 프로젝트 생성

     

    root프로젝트는 src경로를 삭제하기 때문에 패키지이름은 의미 없다.

     

    2. 공통으로 적용할 dependency를 설정한다. 테스트용으로 lombok 추가

     

     

    3. src 폴더 제거

     

    4. 하위에 공통 기능(util)성 모듈 추가하기

     

     

    패키지이름을 전부 동일하게 하면 안된다.  패키지 끝에 현재 모듈명을 꼭 넣어주자

     

    6. 필요없는 폴더 삭제

     

    공통 모듈은 jar로 임포트해서 사용하는 모듈이기때문에 스프링부트 어플리케이션 java 및 리소스폴더가 필요없다.

     

    7. 컨트롤러부가 있는 모듈 추가한다.

    컨트롤러를 사용하기 때문에 Web 의존을 추가한다.

     

    8. 데이터베이스 연결 및 mapper 작성을 위한 모듈을 생성한다

     

    9. root 프로젝트의 settings.gradle을 열어 하위 모듈을을 전부 임포트 해주자.

     

    10.그래들 탭을 열면 뭔가 실행가능한 어플리케이션이 많이 추가되있다.  루트 그래들 우클릭 > 하위에 연결된 의존성들을 새로고침 해준다

     

    11. 필요없는 그래들 실팽파일 제거, 루트 그래들을 제외한 하위 모듈 그래들 우클릭 > Gradle 프로젝트 연결해제를 시킨다.

     

    12. 루트 그래들을 리프레시 해주면 하위 모듈 그래들이 루트 안으로 들어간다.

     

    그래들 탭을 열면 뭔가 실행가능한 어플리케이션이 많이 추가되있다.

     

    13. 모듈 프로젝트에 필요없는 기본생성 파일 전부 제거

     

    하위 모듈 프로젝트들은 src랑 build.gradle만 남았다.

     

     

    14. 멀티모듈 그래들 설정

    지금부트 하위 모듈 및 루트프로젝트의 그래드 설정을 해보자

     

    module.api > build.gradle

    // api모듈은
    // bootJar > Spring Boot 애플리케이션으로 실행 가능한 JAR 파일로 패키징 하고,
    // jar > 일반적인 JAR 파일로 패키징하지 않는다.
    
    bootJar.enabled = true
    jar.enabled = false
    
    dependencies {
        implementation project(':module-core')
        implementation project(':module-mapper')
        implementation 'org.springframework.boot:spring-boot-starter-web'
    }

     

    module.mapper > build.gradle

    bootJar.enabled = false   // 맵퍼는 bootJar 로 패키징 할 필요 없음
    jar.enabled = true        //일반적인 JAR 파일로 패키징시킨다
    
    dependencies {
        implementation project(':module-core')
        implementation 'org.springframework.boot:spring-boot-starter'
    }

     

    module.core > build.gradle

    bootJar.enabled = false   // 공통 모듈은 bootJar 로 패키징 할 필요 없음
    jar.enabled = true        //일반적인 JAR 파일로 패키징시킨다
    
    dependencies {
        implementation 'org.springframework.boot:spring-boot-starter'
        implementation 'org.springframework.boot:spring-boot-starter-aop'
        api 'com.fasterxml.jackson.core:jackson-annotations:2.10.1'
        api 'com.fasterxml.jackson.core:jackson-databind:2.13.5'
    }

     

     

    spring_multi_module_v5 (root) > build.gradle

    // plugins 는 미리 구성해놓은 task 들의 그룹이며 특정 빌드과정에 필요한 기본정보를 포함하고 있다.
    plugins {
    	// Spring Boot Gradle 플러그인으로 사용하면 Spring Boot 종속성을 관리하고 Gradle을 빌드 도구로 사용할 때 애플리케이션을 패키징하고 실행할 수 있다.
    	// 단독으로 사용되는 경우 프로젝트에 거의 영향을 주지 않는다.
    	// 예를 들어 java 플러그인과 함께 적용되면 실행 가능한 jar 빌드 작업이 자동으로 구성된다.
    	// spring-boot-dependencies를 통해서 의존성 관리 기능을 제공한다.
    
    	id 'java'
    	id 'org.springframework.boot' version '3.1.0'
    	id 'io.spring.dependency-management' version '1.1.0'
    	id 'java-library'
    }
    
    // bootJar 작업은 실행 가능한 jar을 생성하려고 시도하기 때문에 이를 위해서는 main() 메서드가 필요하다.
    // Root 프로젝트는 main 없이 라이브러리의 역할을 하는 모듈이기 때문에 false로 비활성화해준다.
    // bootJar(dependencies와 클래스 파일을 모두 묶어서 빌드) 설정은 꺼주고, jar(클래스만 묶어서 빌드)만을 허용해준다.
    bootJar.enabled = false
    jar.enabled = true
    
    allprojects {
    	group = 'kr.co.module'
    	version = '0.0.1-SNAPSHOT'
    	sourceCompatibility = '17'
    }
    
    java {
    	toolchain {
    		languageVersion = JavaLanguageVersion.of(17)
    	}
    }
    
    subprojects {
    	// subprojects 블록 안에서는 plugins 블록을 사용할 수 없어, 플러그인 등록을 위해서는 apply plugin 을 사용해야한다.
    	// setting.gradle에서 include된 모든 프로젝트에 공통적으로 적용할 설정
    	apply plugin: 'java'
    	// build.gradle 에서 api() 를 사용하려면 java-library 플러그인을 적용해야한다.
    	apply plugin: 'java-library'
    	apply plugin: 'org.springframework.boot'
    	// spring boot dependency 플러그인을 적용하여 사용중인 부트 버전에서 자동으로 의존성을 가져온다.
    	apply plugin: 'io.spring.dependency-management'
    
    	repositories {
    		mavenCentral()
    	}
    
    	configurations {
    		compileOnly {
    			extendsFrom annotationProcessor
    		}
    	}
    
    	// 관리하는 모듈에 공통 dependencies
    	dependencies {
    		implementation 'org.bgee.log4jdbc-log4j2:log4jdbc-log4j2-jdbc4.1:1.16'
    		implementation 'org.mybatis.spring.boot:mybatis-spring-boot-starter:3.0.0'
    		runtimeOnly 'com.mysql:mysql-connector-j'
    		compileOnly 'org.projectlombok:lombok'
    		implementation 'org.modelmapper:modelmapper:2.4.2'
    		annotationProcessor 'org.projectlombok:lombok'
    		annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"
    	}
    
    }

     

    root build.gradl에 모든 모듈에서 사용할 수 있는 의존성을 기입해준다.

     

    15 . api 모듈에서 mapper모듈의 마이바티스 사용하기

    module-api 에서 sql을 호출하기 위해선 application.properties에 데이터베이스 설정이 있어야한다.

     

    module-api > application.properties

    그냥 일반적인 디비설정의 정보들을 입력하면된다.

     

    하지만 mybatis.mapper-locations는 module-mapper 모듈의 mapper 경로이다.

    현재 module-mapper의 구성은 이렇게 되어있다. 

    스프링부트을 실행하는 모듈이 아니기 때문에 마찬가지로 어플리케이션 자바가 없다.

     

    16.중요mapper 모듈을 Bean으로 등록시키기 

    제일 중요한 api 모듈 Application.java를 수정해야한다.

    @SpringBootApplication(scanBasePackages = "kr.co.module.*")
    @MapperScan("kr.co.module.mapper")
    public class ModuleApiApplication {
        public static void main(String[] args) {
            SpringApplication.run(ModuleApiApplication.class, args);
        }
    
    }

    맵퍼스캔을 하지 않으면 절대로 api모듈에서 mapepr모듈의 맵퍼를 사용하 수 없다.

     

    api 모듈이 스프링부트를 실행시킬때 mapper모듈을 빈으로 등록시켜야한다.

     

    api 모듈에서 mapper 모듈의 빈을 연결하지 못해 엄청난 삽질을 했다. ;_;

     

    mybatis를 root프로젝트에 의존성을 넣어야 api모듈에서 @@MapperScan 어노테이션을 사용할 수 있다.

     

    다음시간에는 root 그래드 설정에서 하위모듈을 설정하는 방법을 포스트하겠다.

    반응형

    댓글

Designed by Tistory.