본문 바로가기
개발/Java || Spring

03. 멀티 모듈 프로젝트 구성하기

by leedonggeun 2023. 3. 12.

왜 멀티 모듈로 구성할까?

일반적으로 하나의 웹사이트는 여러 가지 기능이 있다.
웬만한 웹사이트를 예시로 들어도, 아래와 같은 항목은 기본적으로 지원한다.

사용자 생성/삭제/수정
게시판 생성/삭제/수정
관리자 관리

이 모든 기능들을 하나의 프로젝트에서 관리한다면 생각만 해도 복잡할 것이다.
기능이 적을 땐 물론 간편하고 쉽게 쉽게 개발할 수 있다.

하지만 서비스의 규모가 커졌을 땐? 뒤늦게 아차! 싶더라도 기존 방식으로 개발할 수밖에 없다.
왜냐고? 당장 서비스의 규모가 급속도로 커지는데 저것들을 리팩토링 하기엔 전혀 기회비용이 맞지 않는다.

하지만 이를 하나의 패키지에서 모두 관리하게 되면 굉장히 복잡할 것이다.
그렇다고 모듈마다 하나의 단일 프로젝트로 따로 만든다면 그것도 리소스가 불필요하게 소모된다.

그렇기 때문에, 우리는 하나의 프로젝트 안에서 여러 개의 모듈로 구성된 멀티 모듈 프로젝트로 구성할 예정이다.

1. 기본 프로젝트 구성

일반적으로는 하나의 프로젝트에서 src/ 디렉토리 아래에 구현한다.

2. 모듈 생성

프로젝트 Explorer에서 프로젝트를 우클릭하여 [New] > [Module] 버튼을 눌러 모듈을 생성한다.

2-1. 모듈 생성 결과

user 라는 소스 디렉토리가 생성되며, 루트 프로젝트(app)의 settings.gradle에는 include 'user'가 자동으로 입력된다.
* 만약 입력이 안됐다면 수동으로 include '{모듈명}'을 입력해주면 된다.

3. 멀티 모듈 설정

3-1. build.gradle 설정

루트 프로젝트(app)의 build.gradle를 이렇게 바꿔줍니다.

user 모듈은 별도로 실행 가능한 jar파일이 아닌, 디펜던시로서 사용될 예정이기 때문에
bootJar 옵션을 false, jar 옵션을 true로 설정하였습니다.
plugins {
	id 'java'
	id 'org.springframework.boot' version '3.0.4'
	id 'io.spring.dependency-management' version '1.1.0'
}

group = 'kr.co.dglee'
version = '0.0.1-SNAPSHOT'

sourceCompatibility = '17'
targetCompatibility = '17'

repositories {
	mavenCentral()
}

dependencies {
	implementation 'org.springframework.boot:spring-boot-starter-web'
	testImplementation 'org.springframework.boot:spring-boot-starter-test'

	implementation project(':user')
}

tasks.named('test') {
	useJUnitPlatform()
}

// 하위 모듈 공통 셋팅
subprojects {
	apply plugin: 'java'
	apply plugin: 'org.springframework.boot'
	apply plugin: 'io.spring.dependency-management'

	group = 'kr.co.dglee'
	version = '0.0.1-SNAPSHOT'

	compileJava.options.encoding = 'UTF-8'

	sourceCompatibility = '17'
	targetCompatibility = '17'

	repositories {
		mavenCentral()
	}

	dependencies {
		implementation 'org.springframework.boot:spring-boot-starter-web'
		testImplementation 'org.springframework.boot:spring-boot-starter-test'
	}
}

project(":user") {
	bootJar { enabled = false}
	jar { enabled = true}

	dependencies {
	}
}

app 프로젝트에서 user project가 import됨을 확인

3-2. Main Application 설정

user 모듈의 패키지 구조는 kr.co.dglee.user 입니다. 
차후, user 말고도 admin, board, etc...가 추가될 수 있으니 @ComponentScan의 pakcage를 kr.co.dglee로 시작하는 모든 패키지를 검색할 수 있도록 설정해줍니다.

3-3. 테스트 컨트롤러 및 메서드 작성

useradd 라는 문자열을 반환하는 /users/add 테스트용 메서드를 생성해줍니다.

4. 멀티 모듈 확인하기

Application을 Run 하고, http://localhost:8080/users/add 로 접근했을 때 useradd라는 문자열이 보이면 성공입니다.

5. 마치며...

이렇게 기본적인 틀은 완성했습니다. 그외 롬복, JPA, querydsl 등은 차차 게시글로 남기겠습니다.

이번 프로젝트는 그동안 회사에서 업무를 하며 미흡했거나, 이렇게 하면 더 좋지 않았을까? 하는 것들을 중점적으로 적용할 예정입니다.
안해본 것들을 시도하고, 조금 더 트렌드에 맞는 것들을 공부하여 내 지식으로 습득하고자 함입니다.

댓글