멀티 모듈 프로젝트는 무엇인지, Spring boot에서 multi-module project를 생성하는 방법(maven)은 어떻게 되는지 정리한 내용입니다.
참고 자료 및 코드의 git 주소는 포스팅 맨 하단에 있으며, 잘못된 내용은 댓글로 남겨주시면 확인하여 수정하겠습니다. 감사합니다.
1. Multi Module Project를 적용하는 이유
작은 단위에서부터 시작된 대부분의 프로젝트들은 시간이 지날수록 기능이 추가되면서 점점 더 커지고 복잡해지는데요.
기능이 많아지고, 요청이 많아질수록 그 요청들을 하나의 프로그램에서 처리하기가 어려워지는데, 때문에 하나로 운영하던 서비스가 클라이언트 서비스와 운영 시스템으로 나뉘는 등의 분리가 일어나게 됩니다.
이렇게 프로그램이 나누어졌을 때의 가장 큰 문제점은 각각의 프로그램에 있는 domain의 동일성을 보장하는 것인데요.
예를 들어 하나로 운영하던 프로젝트가 클라이언트 서비스(client api)와 운영 시스템(admin api)으로 나눠졌을 때, 회원(user)에 대한 domain(Entity)은 각각의 프로젝트에서 동일해야 합니다.
하지만 두 개의 프로젝트는 별개이기 때문에 각각의 코드로 관리될 것이고, 어느 한쪽에서 domain(Entity)을 수정했다면 다른 쪽에서도 domain을 수정해줘야 하는데요.
이 과정에서 어느 한쪽에서 수정이 되지 않았다거나, 잘못 수정되어 domain이 달라지는 경우 문제가 발생하게 되는 것(정확하게는 발생할 가능성이 생기는 것)입니다. 이러한 방식은 개발자에 대한 의존성이 높은 방식인데요.
또한 프로젝트가 클라이언트 서비스, 운영 시스템 외 점점 더 분리되어 많아지는 경우, 프로젝트 수에 따라 IDE(통합 개발 환경)을 실행시켜야 하는 등의 접근성 문제도 발생하게 됩니다.
때문에 이러한 문제들을 해결하기 위한 방안으로 멀티 모듈 프로젝트가 도입되었는데요.
멀티 모듈 프로젝트는 무엇이며, 사용했을 때의 장점은 무엇이 있는지 이어서 살펴보겠습니다.
2. 멀티 모듈 프로젝트란?
What's Module?
A Module is a group of closely related packages and resources along with a new module descriptor file.
In other words, it's a "package of Java Packages" abstraction that allows us to make our code even more reusable.
(출처 baeldung.com/java-9-modularity)
프로그래밍에서 모듈이란 '프로그램을 구성하는 시스템을 기능 단위의 독립적인 부분으로 분리한 것'이라고 볼 수 있는데요. 위 내용을 참고하여 덧붙이자면 '관련된 패키지와 리소스들을 재사용할 수 있는 그룹'으로도 볼 수 있습니다.
이런 모듈들을 하나의 프로젝트 안에 담은 구조를 멀티 모듈 프로젝트(multi-module project)라고 하며, 하나의 프로젝트 안에 있기 때문에 필요한 모듈의 기능을 다른 모듈에서 가져다 쓸 수 있게 되는 것입니다.
3. 장점
장점으로는 서로 독립된 프로젝트에서 발생하던 domain의 동일성 보장 문제를 해결할 수 있습니다.
쉽게 하나의 module에 정의된 domain을 다른 모듈에서 사용할 수 있는 것인데, Entity 뿐만 아니라 Repository 등을 모두 사용할 수 있기 때문에 domain의 동일성 보장뿐만 아니라 중복된 코드가 줄어든다는 장점도 있습니다.
4. 기본적인 multi-module project 생성 방법
이어서는 멀티 모듈 프로젝트를 생성하는 방법(maven)을 살펴볼 텐데요.
프로젝트를 세팅하는 것은 간단하지만, 이 구조를 통해 공통된 기능을 어떻게 배치하고 효율적으로 사용할 수 있도록 코드를 짜느냐가 멀티 모듈 프로젝트에서 가장 중요한 부분이 될 것 같습니다.
4-1. 프로젝트 생성
먼저 프로젝트를 생성합니다. 여기서 생성되는 프로젝트는 아래 구조 예시에서 루트 프로젝트가 될 것입니다.
multi-module: 루트 프로젝트
└─ core-module: Entity, Repository 및 Utility 등
└─ client-module: 사용자 어플리케이션
└─ admin-module: 관리자 애플리케이션
(생성해 볼 프로젝트 구조 예시)
4-2. 모듈(Module) 생성
다음과 같은 방식으로 모듈을 생성합니다. (core-module, client-module, admin-module)
모듈을 생성하고 나서의 루트 프로젝트 pom.xml 파일입니다. 생성된 모듈들이 들어가 있는 것을 확인할 수 있습니다.
(루트 프로젝트는 모듈을 담을 프로젝트이기 때문에 src 폴더가 필요하지 않습니다. 해당 상태는 루트 프로젝트의 src 폴더를 삭제한 상태입니다.)
<packaging>pom</packaging>
루트 프로젝트의 pom.xml 파일 중 packaging 부분을 보면 jar나 war가 아닌 pom으로 되어있는 것을 볼 수 있는데요.
패키징을 pom 유형으로 설정하여 프로젝트가 상위로 사용됨을 선언하게 됩니다.
이렇게 추가된 모듈의 의존성 부분을 살펴보면 루트 프로젝트에서 설정된 의존성이 모듈인 core-module에도 동일하게 적용되는 것을 확인할 수 있습니다.
생성된 모듈들을 실행하기 위해서는 각각 다음과 같이 main 메서드를 가진 Application 클래스를 생성해야 하며, 각 모듈의 resourece 폴더 아래에 .properties 파일을 통한 설정을 할 수 있습니다.
4-3. core-module
core-module에서는 다음과 같이 전체 프로젝트에서 공통으로 사용할 domain 관련 클래스들을 생성합니다.
core-module에 정의한 domain 클래스들을 사용하기 위해서는 각 모듈의 pom.xml 파일에서 다음과 같이 core-module의 의존성을 추가해주면 됩니다.
(client-module에서 core-module의 User.Class를 사용할 수 있게 됨)
< 참고 자료 >
< 코드 참고 >
(위 예시와 완전 똑같지는 않지만 multi-module 형식으로 만들어보고 있는 프로젝트입니다.)
'Programming > Spring Boot' 카테고리의 다른 글
Spring Boot + GraphQL 기본적인 사용법 정리 (0) | 2022.10.11 |
---|---|
Spring Boot 부트스트랩(bootstrap) 템플릿 적용하는 방법 (0) | 2022.10.05 |
SpringBoot form-data list object (객체 리스트 받는 방법) (0) | 2022.09.06 |
Querydsl 서브쿼리 사용하는 방법(select절, where절) (0) | 2022.08.24 |
FeignClient 기본적인 사용법 (Spring Cloud OpenFeign) (0) | 2022.08.12 |