본문 바로가기

Programming/Java & Spring 관련 내용 정리

[Spring] 멀티모듈 구성 방법

 

✏️ (예시) 아래와 같이 모듈 프로젝트를 구현해야 하는 상황일 때

 

 

  • 관리자 API 모듈, 스케쥴러 API 모듈, 서비스 모듈을 구성해야 함
    • 관리자 API 모듈 : 게시판 CRUD / 회원 CRUD / 로그인 담당 (controller)
    • 서비스 모듈 : service, mapper 등
    • 스케쥴러 API : 껍데기만 생성

 

 


🎯프로젝트 생성방법, pom.xml 구성 방법

 

 

  1. 먼저 전체를 아우르는 ‘basic-module’ 을 아래와 같이 new Project로 생성한다.

 

 

 

 

2. 새로 만든 ‘basic-module' 프로젝트에 아래와 같이 관리자 API 모듈 ( = admin) 을 추가한다.

  • 스케쥴러 API 모듈 ( = schedule)도 동일한 방법으로 추가한다.

 

 

 

 

 

 

3. ‘basic-module’ 프로젝트에 서비스 모듈 ( = service)을 추가한다.

 

 

 

 

 

 

** 각각의 Pom.xml은 아래와 같이 구성한다.

 

  • basic-module (최상위 pom)
    • 최상위 pom은 반드시 packging 형태가 jar가 아닌 pom으로 선언되어 있어야 한다.
    • 그리고 하위 모듈들은 <modules> 태그 내에 등록한다.

 

 

 

  • admin ( schedule 모듈도 이 admin과 동일한 방식으로 구성)
    • 하위 프로젝트는 상위 프로젝트를 <parent>라는 태그를 통해 기술하고 있다.
    • 이로써 ‘admin 프로젝트’는 basic-module에 있는 정보를 그대로 이용할 수 있게 된다.
    • basic-module의 pom을 부모로 가지고 있는 모든 하위 모듈들은 이 정보를 공유하여 빌드가 된다.
  • ‘admin 프로젝트’를 개발하기 위해 ‘service 프로젝트’가 필요하다면
    • ‘service 프로젝트’를 위와 같이 ‘admin 프로젝트' pom에 dependency로 기술한다.

 

 

 

  • service

 

 

 

 


🤔 basic-module 빌드로그 살펴보기 

 

 

  • maven에서 다중모듈 빌드는
    • ‘Reactor Plug-in’에 의해 해석되어 상속관계와 의존관계를 따져 빌드 순서가 정해진다.

 

  • basic-module의 경우 하위 프로젝트를 묶는 역할만 하기 때문에 별도로 진행하는 내용이 없어 로그가 짧다.

 

[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Build Order:
[INFO]
[INFO] basic-module [pom]
[INFO] service [jar]
[INFO] admin [jar]
[INFO] schedule [jar]
[INFO]
[INFO] ------------------------< com.ot:basic-module >-------------------------
[INFO] Building basic-module 0.0.1-SNAPSHOT [1/4]
[INFO] --------------------------------[ pom ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:3.2.0:clean (default-clean) @ basic-module ---
[INFO]
[INFO] --- maven-install-plugin:2.5.2:install (default-install) @ basic-module ---
[INFO] Installing D:\project\basic-module\pom.xml to C:\Users\Soyeon.Lee.m2\repository\com\ot\basic-module\0.0.1-SNAPSHOT\basic-module-0.0.1-SNAPSHOT.pom
[INFO]
[INFO] ---------------------------< com.ot:service >---------------------------
[INFO] Building service 0.0.1-SNAPSHOT [2/4]
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:3.2.0:clean (default-clean) @ service ---
[INFO] Deleting D:\project\basic-module\service\target
[INFO]
[INFO] --- maven-resources-plugin:3.2.0:resources (default-resources) @ service ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Using 'UTF-8' encoding to copy filtered properties files.
[INFO] Copying 1 resource
[INFO] Copying 6 resources
[INFO]
[INFO] --- maven-compiler-plugin:3.10.1:compile (default-compile) @ service ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 33 source files to D:\project\basic-module\service\target\classes
[INFO] /D:/project/basic-module/service/src/main/java/com/ot/service/config/SecurityConfig.java: D:\project\basic-module\service\src\main\java\com\ot\service\config\SecurityConfig.java uses or overrides a deprecated API.
[INFO] /D:/project/basic-module/service/src/main/java/com/ot/service/config/SecurityConfig.java: Recompile with -Xlint:deprecation for details.
[INFO]
[INFO] --- maven-resources-plugin:3.2.0:testResources (default-testResources) @ service ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Using 'UTF-8' encoding to copy filtered properties files.
[INFO] skip non existing resourceDirectory D:\project\basic-module\service\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.10.1:testCompile (default-testCompile) @ service ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to D:\project\basic-module\service\target\test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.22.2:test (default-test) @ service ---
[INFO] Tests are skipped.
[INFO]
[INFO] --- maven-jar-plugin:3.2.2:jar (default-jar) @ service ---
[INFO] Building jar: D:\project\basic-module\service\target\service-0.0.1-SNAPSHOT.jar
[INFO]
[INFO] --- maven-install-plugin:2.5.2:install (default-install) @ service ---
[INFO] Installing D:\project\basic-module\service\target\service-0.0.1-SNAPSHOT.jar to C:\Users\Soyeon.Lee.m2\repository\com\ot\service\0.0.1-SNAPSHOT\service-0.0.1-SNAPSHOT.jar
[INFO] Installing D:\project\basic-module\service\pom.xml to C:\Users\Soyeon.Lee.m2\repository\com\ot\service\0.0.1-SNAPSHOT\service-0.0.1-SNAPSHOT.pom
[INFO]
[INFO] ----------------------------< com.ot:admin >----------------------------
[INFO] Building admin 0.0.1-SNAPSHOT [3/4]
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:3.2.0:clean (default-clean) @ admin ---
[INFO] Deleting D:\project\basic-module\admin\target
[INFO]
[INFO] --- maven-resources-plugin:3.2.0:resources (default-resources) @ admin ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Using 'UTF-8' encoding to copy filtered properties files.
[INFO] Copying 1 resource
[INFO] Copying 2 resources
[INFO]
[INFO] --- maven-compiler-plugin:3.10.1:compile (default-compile) @ admin ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 4 source files to D:\project\basic-module\admin\target\classes
[INFO]
[INFO] --- maven-resources-plugin:3.2.0:testResources (default-testResources) @ admin ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Using 'UTF-8' encoding to copy filtered properties files.
[INFO] skip non existing resourceDirectory D:\project\basic-module\admin\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.10.1:testCompile (default-testCompile) @ admin ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to D:\project\basic-module\admin\target\test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.22.2:test (default-test) @ admin ---
[INFO] Tests are skipped.
[INFO]
[INFO] --- maven-jar-plugin:3.2.2:jar (default-jar) @ admin ---
[INFO] Building jar: D:\project\basic-module\admin\target\admin-0.0.1-SNAPSHOT.jar
[INFO]
[INFO] --- spring-boot-maven-plugin:2.7.3:repackage (repackage) @ admin ---
[INFO] Replacing main artifact with repackaged archive
[INFO]
[INFO] --- maven-install-plugin:2.5.2:install (default-install) @ admin ---
[INFO] Installing D:\project\basic-module\admin\target\admin-0.0.1-SNAPSHOT.jar to C:\Users\Soyeon.Lee.m2\repository\com\ot\admin\0.0.1-SNAPSHOT\admin-0.0.1-SNAPSHOT.jar
[INFO] Installing D:\project\basic-module\admin\pom.xml to C:\Users\Soyeon.Lee.m2\repository\com\ot\admin\0.0.1-SNAPSHOT\admin-0.0.1-SNAPSHOT.pom
[INFO]
[INFO] --------------------------< com.ot:schedule >---------------------------
[INFO] Building schedule 0.0.1-SNAPSHOT [4/4]
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-clean-plugin:3.2.0:clean (default-clean) @ schedule ---
[INFO] Deleting D:\project\basic-module\schedule\target
[INFO]
[INFO] --- maven-resources-plugin:3.2.0:resources (default-resources) @ schedule ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Using 'UTF-8' encoding to copy filtered properties files.
[INFO] Copying 1 resource
[INFO] Copying 0 resource
[INFO]
[INFO] --- maven-compiler-plugin:3.10.1:compile (default-compile) @ schedule ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to D:\project\basic-module\schedule\target\classes
[INFO]
[INFO] --- maven-resources-plugin:3.2.0:testResources (default-testResources) @ schedule ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Using 'UTF-8' encoding to copy filtered properties files.
[INFO] skip non existing resourceDirectory D:\project\basic-module\schedule\src\test\resources
[INFO]
[INFO] --- maven-compiler-plugin:3.10.1:testCompile (default-testCompile) @ schedule ---
[INFO] Changes detected - recompiling the module!
[INFO] Compiling 1 source file to D:\project\basic-module\schedule\target\test-classes
[INFO]
[INFO] --- maven-surefire-plugin:2.22.2:test (default-test) @ schedule ---
[INFO] Tests are skipped.
[INFO]
[INFO] --- maven-jar-plugin:3.2.2:jar (default-jar) @ schedule ---
[INFO] Building jar: D:\project\basic-module\schedule\target\schedule-0.0.1-SNAPSHOT.jar
[INFO]
[INFO] --- spring-boot-maven-plugin:2.7.3:repackage (repackage) @ schedule ---
[INFO] Replacing main artifact with repackaged archive
[INFO]
[INFO] --- maven-install-plugin:2.5.2:install (default-install) @ schedule ---
[INFO] Installing D:\project\basic-module\schedule\target\schedule-0.0.1-SNAPSHOT.jar to C:\Users\Soyeon.Lee.m2\repository\com\ot\schedule\0.0.1-SNAPSHOT\schedule-0.0.1-SNAPSHOT.jar
[INFO] Installing D:\project\basic-module\schedule\pom.xml to C:\Users\Soyeon.Lee.m2\repository\com\ot\schedule\0.0.1-SNAPSHOT\schedule-0.0.1-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary for basic-module 0.0.1-SNAPSHOT:
[INFO]
[INFO] basic-module ....................................... SUCCESS [ 0.740 s]
[INFO] service ............................................ SUCCESS [ 15.651 s]
[INFO] admin .............................................. SUCCESS [ 6.722 s]
[INFO] schedule ........................................... SUCCESS [ 5.485 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 29.174 s
[INFO] Finished at: 2022-09-06T10:29:06+09:00
[INFO] ------------------------------------------------------------------------

Process finished with exit code 0

 

 

 

 


😒 만났던 에러

 

  • AdminApplication 실행 시 아래 에러 발생
    • Description: Parameter 0 of constructor in com.ot.admin.controller.BoardController required a bean of type 'com.ot.service.Board.service.BoardService' that could not be found.
    • Action: Consider defining a bean of type 'com.ot.service.Board.service.BoardService' in your configuration.

설명: com.ot.admin.controller.BoardController에 있는 생성자의 매개변수 0에는 찾을 수 없는 'com.ot.service.Board.service.BoardService' 유형의 bean이 필요합니다.조치: 구성에서 'com.ot.service.Board.service.BoardService' 유형의 bean 정의를 고려하십시오.

 

 

→ 해결 :

Main 클래스에 아래 어노테이션을 설정하여,

찾지 못하는 bean이 존재하는 package를 scan하도록 한다.

 

 

(변경 전) 

 

 

(변경 후)

 

 

 

  • scanBasePackages : 컴포넌트 스캔(빈 탐색)을 진행할 베이스 패키지를 설정함

 

  • @MapperScan을 명시해 준 class는 basePackages로 지정한 곳에 존재하는 @Mapper로 명시된 interface를 스캔한다.
    • (ex) @MapperScan(value="매퍼 인터페이스 경로")

 


 

  • BindingException 에러 발생 시

 

 

 

  1. application.properties의 mybatis.type-aliases-package 부분의 경로가 맞는지 확인한다.

 

 

 

 

 

2. mapper.xml의

namespace 경로가 맞는지 확인한다.

 

 

 

 

→ 그래도 에러가 발생하여 수정한 내용 :

resources 하위에 있는 mapper 디렉토리 이름을 아래와 같이 수정했다.

여기서 주의할 점은 intellij에서 폴더를 만들 때 "com.ot.service.mapper" 이런 식으로 한 번에 만들 경우

 

'.'을 하위 구조가 아닌 "명칭"으로 인식 한다.

따라서 디렉토리 하위에 디렉토리를 만드는 방식으로 해야 인식이 된다.