✏️ (예시) 아래와 같이 모듈 프로젝트를 구현해야 하는 상황일 때
- 관리자 API 모듈, 스케쥴러 API 모듈, 서비스 모듈을 구성해야 함
- 관리자 API 모듈 : 게시판 CRUD / 회원 CRUD / 로그인 담당 (controller)
- 서비스 모듈 : service, mapper 등
- 스케쥴러 API : 껍데기만 생성
🎯프로젝트 생성방법, pom.xml 구성 방법
- 먼저 전체를 아우르는 ‘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 에러 발생 시
- application.properties의 mybatis.type-aliases-package 부분의 경로가 맞는지 확인한다.
2. mapper.xml의
namespace 경로가 맞는지 확인한다.
→ 그래도 에러가 발생하여 수정한 내용 :
resources 하위에 있는 mapper 디렉토리 이름을 아래와 같이 수정했다.
여기서 주의할 점은 intellij에서 폴더를 만들 때 "com.ot.service.mapper" 이런 식으로 한 번에 만들 경우
'.'을 하위 구조가 아닌 "명칭"으로 인식 한다.
따라서 디렉토리 하위에 디렉토리를 만드는 방식으로 해야 인식이 된다.
'Programming > Java & Spring 관련 내용 정리' 카테고리의 다른 글
[Spring] Thread-safe 에 대해서 고찰해 보다. (0) | 2023.03.20 |
---|---|
[코드리뷰 받은 내용 정리] 코드를 작성할 때 '이것'을 생각해보자! (0) | 2023.02.13 |
[Spring Batch] 오류가 나면 어떻게 해야할까? - Skip과 Retry (0) | 2022.10.28 |
[Spring Batch] 스프링 배치를 써야 할까? (0) | 2022.09.22 |
[Spring Batch] Step에서 데이터를 처리하는 방법 2가지 (+ 예제) (0) | 2022.09.22 |