멀티모듈 프로젝트 세팅

목차

  1. 1. ROOT 프로젝트
  2. 2. API 모듈 생성
  3. 3. common 모듈 생성
  4. 4. 모듈 정보 등록
  5. 5. 모듈간 의존성 설정
    1. 발생하는 오류 해결
      1. ‘:common’ could not be found in root project ‘api’
      2. prepareKotlinBuildScriptModel not found
  6. 6. 모듈 간 자바 클래스 및 스프링 빈 사용하기

멀티 모듈 프로젝트 생성 및 멀티 모듈 설정을 해보자.

1. ROOT 프로젝트

멀티모듈에서 ROOT 프로젝트는 별다른 dependency는 필요없음 -> dependency 추가없이 스프링 프로젝트 생성 후 아래의 필요없는 디렉토리 및 파일을 삭제한다.

  1. src 폴더
  2. HELP.md 파일

2. API 모듈 생성

Root프로젝트와 같이 api모듈에 불필요한 디렉토리 및 파일을 지워주자.

  1. resources/static
  2. resources/templates
  3. HELP.md 파일

생성된 api모듈을 띄워보자. 성공!

3. common 모듈 생성

  • api 모듈과 동일하게 모듈을 생성해준다.(dependency는 lombok만 추가)
  • common모듈은 따로 애플리케이션을 띄우기 위한 모듈이 아니기 때문에 CommonApplication 파일을 삭제해주자.

common모듈의 초기 구조는 아래와 같다.

4. 모듈 정보 등록

root프로젝트에 어떤 모듈을 가지고 있는지 알려줘야 한다. root프로젝트의 settings.gradle 파일에 아래와 같이 모듈 정보를 등록한다.

include 'api'
include 'common'

수정한 사항에 문제가 없는지 api모듈을 띄워보자.

5. 모듈간 의존성 설정

api모듈에서 common모듈을 가져다 사용할 예정이니 api모듈의 build.gradle에 의존성을 추가해보자. common모듈의 의존성 설정을 할 때는 root 프로젝트의 settings.gradle에 선언한 값과 동일한 값이어야 함.

... 

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

발생하는 오류 해결

‘:common’ could not be found in root project ‘api’

A problem occurred evaluating root project 'api'.
> Project with path ':common' could not be found in root project 'api'.

모듈 별로 settings.gradle 파일이 있는데 이 파일은 root 프로젝트에서만 관리를 하고 각 모듈에서는 관리를 할 필요가 없음. -> 모듈 내에 있는 settings.gradle 파일을 삭제해보자.

prepareKotlinBuildScriptModel not found

Task 'prepareKotlinBuildScriptModel' not found in project ':api'.

-> build.gradle 에 아래의 코드를 추가

tasks.register('prepareKotlinBuildScriptModel'){}
  • 문제가 해결되고 난 후 항상 프로젝트를 기동해보자.

6. 모듈 간 자바 클래스 및 스프링 빈 사용하기

api모듈에서 common모듈의 빈을 주입받아서 사용하려고 하면 common모듈에 있는 빈을 찾지 못했다는 에러와 함께 애플리케이션이 기동되지 않는다.

  • 이 때 Component Scan과 ApiApplication의 위치에 대해서 생각해보자.
    • 우리가 주입받아 사용하려는 빈의 위치는 api모듈이 기동되면서 componentScan 대상에 포함되지 않는다.
    • kr.hyunbenny.api의 경로에 ApiApplication가 위치해 있고 kr.hyunbenny.common.service의 경로에 CommonService가 위치해 있다고 할 때 -> ApiApplicatoin의 위치를 kr.hyunbenny.api -> kr.hyunbenny 로 변경해주면 kr.hyunbenny 하위를 컴포넌트 스캔 하면서 정상적으로 기동 및 common모듈에 있는 빈을 주입받아 사용할 수 있다.

하지만 ApiApplication의 위치를 변경해서 사용하는 방법은 좋은 방법 같아 보이지는 않는다.

@ComponentScan에 보면 basePackages라는 설정이 존재한다. 그리고 @SpringBootApplication에는 이 값을 받아 @ComponentScan에 basePackages로 설정하도록 되어 있다.

이것을 이용하면 Application 파일의 위치 변경 없이도 다른 모듈의 빈을 컴포넌트 스캔하여 주입받아 사용할 수 있다.

@SpringBootApplication(scanBasePackages = {"kr.hyunbenny.api", "kr.hyunbenny.common"})
public class ApiApplication {

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

}


맨 위로 ↑

Copyright © hyunbenny. 공부한 내용을 끄적거리는 낙서장입니다.