멀티 모듈 프로젝트란?
멀티 모듈 프로젝트로 하나의 프로젝트를 진행하면서 이전에 독립된 프로젝트를 만들어보고 그 차이와 장단점에 대해서 제가 겪었던 이야기를 토대로 글을 작성하려고 합니다.
어느 정도 규모가 되는 서비스는 프런트 서버와 백 서버를 별도로 구성하여 사용한다고 한다.
일정 수준 트래픽을 감당하기 위해서 인데 내 생각은 요청을 받는 프런트 서버가 다시 클라이언트가 되어 백엔드 서버에 요청을 하여 응답을 처리하도록 하는 것 같다.
(하나의 서버로 전부 처리할 경우 트래픽을 감당하지 못할 수도 있으므로?)
이럴 경우 MVC구조를 사용할 경우 프런트 = controller 백엔드 = service은 의존적인데 어떻게 둘을 연결할 것인가 공통적으로 사용되는 클래스를 연결해 주어야 한다.
공통적으로 사용되는 코드가 무엇이 있을까?
entity , respository?
하나의 공통 프로젝트를 두고, 이 프로젝트를 여러 프로젝트에서 가져가서 사용할 수 있다면 공통적인 부분을 각각의 프로젝트에서 복사 붙여 넣기를 하지 않아도 될 것입니다.
이러한 방법에는 몇 가지 조건이 수반됩니다.
-
개발 시에는 바로 공통 프로젝트 코드를 사용할 수 있어야 한다.
-
빌드 시에는 자동으로 공통 프로젝트가 포함되어야 한다.
개발 시 공통 프로젝트를 사용하는데 test 하는 경우 에러가 발생할 수 있습니다.
common모듈인 경우 spring context를 불러오는 main함수가 존재하지 않습니다. 따라서 build.gradle설정을 따로 추가해 주어야 합니다. 공통인 모듈을 사용하는 build.gradle설정에 다음과 같은 코드를 추가해줍니다.
implementation project(':common-api')
이제 빌듯이 각 프로젝트는 공통 프로젝트를 가지고 빌드를 해야 합니다. gradle은 각 프로젝트를 실행 가능한 jar파일로 빌드하기 때문에 main메서드가 필요합니다. 그렇다고 SpringMVC를 module-common에 추가할 수는 없습니다.
이렇게 단순히 참조용 클래스들만 있는 프로젝트를 위해 gradle에서는 bootRepackage.enabled 설정을 제공합니다.
bootRepackage{
enabled =false
}
(spring-boot를 이용하는 경우) common-api의 build.gradle설정을 추가해줍니다.
jar {
enabled =true
}
bootJar {
enabled = false
}
이전 독립된 프로젝트로 진행할 때 (그 당에는 Spring boot 2.1.5 version과 maven을 사용했다)
UI Layer(controller) , Application Layer(service) , Domain Layer(entity, repository)를 하나의 프로젝트 안에 생성하며 각각 패키지로 구별하여 분리했다.
여기서 우리는 관리자와 판매자 사용자 3가지의 분리가 필요했는데 각각 사용하는 api가 달랐음에도 불구하고 하나의 api파일에 전부 모아 놓 것을 발견할 수 있다. 만약 api가 구별되지 않고 수많은 api가 존재한다면 유지보수 측면에서 상당한 고생을 할 것이다.
gradle의 멀티 모듈을 이용한다면? 상위 모듈과 하위 모듈을 별개로 생성해 각각의 의존을 연결해주어 관리자, 사용자, 판매자 모듈을 각 각따로 관리한다면 유지보수 측면에서 상당한 효율성을 가지고 있을 것입니다.
각 모듈은 필요한 의존성 만들 추가해 줄 수 있습니다. 필요 없는 것은 dependencies에서 빠져도 될 것입니다.
이러한 구조에도 조심할 부분이 존재합니다.
각각의 역할자에 대해 lib와 필요한 mvc구조 파일들이 추가된다면 좋다.
만약 어떠한 기능을 추가한다고 했을 경우 애매한 경우 common-api에 추가합니다.
또 기능을 추가하는데 한 곳에서만 사용될 거 같지 않고 공통적으로 사용해야 할 것 같으면 또 common-api에 추가될 것입니다.
공통 모듈에 좋아 보이는 코드가 존재합니다. 다른 모듈에서 그것을 가져다 사용합니다.
이러한 의존성 덩어리는 최악의 상황으로 치달을 수 있습니다. 분명 처음 의도된 코드가 변질될 수 있을 것이며 ,
공통 모듈의 부피가 걷잡을 수 없이 커진다면 영향 범위는 시스템 전체로 퍼지게 되어 리펙토링에 상당한 시간이 들어갈 수 있습니다. 멀티 모듈 설계에 대해서는 상당한 고민과 공부가 필요하다고 생각합니다.
멀티 모듈로써 설계를 하는 경우 각 도메인의 성격 자원, 비즈니스 로직 등을 생각하여 개방과 폐쇄에 대해 신경 써서 설계를 해야 할 것 같으며 분명 설정하는 부분 또한 신경 써야 하며 혼자 하는 프로젝트가 아니라면 팀원들과의 이러한 설게 대해서 충분한 이야기와 약속을 지켜 개발을 해야 할 것 같습니다.
'Spring|Spring-boot' 카테고리의 다른 글
Json Web Tokens(1) (0) | 2020.08.14 |
---|---|
회원가입을 위한 Spring security (0) | 2020.08.09 |
Lombok (0) | 2020.08.03 |
[Spring] Interceptor , ArgumentResolver (0) | 2020.07.20 |
[Spring] Spring security (0) | 2020.07.20 |
댓글