임대일

[Spring] Spring Boot 멀티 모듈 어플리케이션 설정: Gradle, DDD 본문

스프링

[Spring] Spring Boot 멀티 모듈 어플리케이션 설정: Gradle, DDD

limdae94 2024. 4. 28. 15:42
도메인 주도 설계에서 모듈 구조를 설계할 때에는 각 도메인이나 하위 도메인에 따라 모듈을 구분하는 것이 중요합니다. 예를 들어 블로그 포스트 관리 시스템의 경우, 주요 도메인은 아마도 "포스트(Post)"일 것입니다.
따라서 도메인을 기준으로 모듈 구조를 설계할 수 있습니다.

 

1. 도메인(Domain)

도메인의 사전적 의미는 도메인(domain)이란 단어는 영토, 분야, 영역, 범위를 뜻하는 단어(예를 들어 소유지, 토지 소유권(법률) 등)였으나 인터넷 주소의 의미로 확장되었다. 어떤 전문 분야에 대해 얘기할 때 해당 도메인에 대한 지식이 필요하다와 같이 말하기도 한다. 

 

흔히 프로그래머들에게는 "어플리케이션 내에서 로직들의 정보 영역 혹은 범위" 에 해당한다. 또한 " 소프트웨어로 해결해야할 문제의 영역"으로도 유명하다. 가령, 어떤 웹 서비스를 만들 때 회원을 가입하고, 회원을 탈퇴하는 일련의 작업은 "회원" 과 관련된 일련의 작업들이며 여기서 "회원" 이라는 도메인이 있다고 볼 수 있다.

 

2. 도메인 주도 설계( DDD, Domain Driven Design)

  • 도메인 주도 설계(Domain-Driven Design, DDD)는 소프트웨어를 개발할 때 중요한 접근 방법 중 한 가지이다.
  • 복잡한 도메인을 이해하고 그에 맞춰 소프트웨어를 설계하는 데 초점을 맞춘다.
  • 소프트웨어 시스템을 보다 유연하고 확장 가능하게 설계할 수 있다.
  • 도메인 주도 설계의 원칙을 적용하면, 도메인 모델과 실제 코드 간의 일관성을 유지하면서 개발할 수 있다.

도메인 주도 설계는 많은 이점을 제공하지만, 다음과 같이 몇 가지 단점도 고려해야 한다.

  • 복잡한 비즈니스 도메인을 다루는 데 유용하지만, 도메인을 충분히 이해하고 모델링하는 데 시간이 오래 걸린다.
  • DDD의 개념과 원칙을 이해하고 습득하는 데 러닝 커브가 발생한다.
  • DDD를 잘못 적용하면 시스템이 과도하게 복잡해진다.
  • DDD는 도메인 전문가와 개발팀 간의 상당한 협력을 요구한다.
  • 일부 프로젝트 또는 조직에서는 DDD 를 적용하기에 기술적인 제약이 따를 수 있다.
  • DDD 를 적용하면 초기 모델링 및 설계 단계에서 추가적인 시간과 리소스가 발생되기 때문에 비용이 증가된다.

따라서 DDD 의 이러한 특징을 고려하여 프로젝트의 특성과 요구사항에 알맞게 적절한 설계 방식을 선택해야 한다.

 

 

3. Gradle

그루비를 이용한 빌드 자동화 시스템으로  컴파일, 테스트, 패키징, 배포 등의 작업을 자동화하여 빌드 프로세스를 단순화한다. 이다. Groovy와 유사한 도메인 언어를 채용하였으며, 현재 안드로이드 앱을 만드는데 필요한 안드로이드 스튜디오의 공식 빌드 시스템이기도 하다. Java, C/C#, Python 등과 같은 여러 가지 언어를 지원한다. 

 

4. IntelliJ 에서 빌드 툴 Gradle

빌드 관련 파일인 build.gradle, gradlew, gradlew.bat, settings.gradle 파일이 생성된다. 그리고 /gradle 디렉토리도 함께 생성되는데,  /gradle/wrapper 디렉터리 안에 gradle-wrapper.jar, gradel-wrapper.properties 파일 두 개가 존재한다.  /gradle 디렉터리 안에 두 파일은 자동으로 gradle 버전 관리 및 다운로드를 담당한다.

따라서 Gradle Wrapper 를 이용하면 Gradle 이 설치되지 않은 시스템에서도 Gradle 로 프로젝트를 빌드할 수 있다. 환경에 종속되지 않게 프로젝트를 빌드할 수 있는 장점이 있다. gradle.wrapper 는 다음과 같이 구성된다. Maven 의 중앙 저장소도 지원하기 때문에 라이브러리를 그대로 가져다 사용할 수 있다.

 

 

5. 빌드 단계(Build Phases)

빌드 단계는 Initialization, Configuration, Execution 3가지 단계로 구성되어 있다.

 

6. Initialization Phase

프로젝트 구조를 파악하는 단계로 settings.gradle 파일이 이 단계에서 호출/실행된다. 프로젝트 내 어떠한 서브 디렉토리에서도 gradle 을 실행시킬 수 있는데, 만약 gradle 이 없는 디렉토리에서 실행을 시키는 경우에는 부모 디렉토리에서 settings.gradle 을 찾아서 실행한다. 프로젝트 구성에 따라 멀티 모듈 또는 싱글 모듈 프로젝트로 빌드를 수행한다.

 

7. Configuration Phase

build.gradle 파일이 실행되는 단계이다. build.gradle 은 빌드 스크립트 파일로 프로젝트를 빌드하기 위해 작성되는 파일이다. 의존성, 플러그인 설정 등에 대한 정의를 작성한다.

 

8. Execution Phase

의존성의 순서에 맞게 Task 를 실행한다. 주로 라이브러리 다운로드, 코드 컴파일, input 읽기, output 출력하기 등이 포함되어 있다.

 

9. Gradle.properties

Gradle 빌드 스크립트 파일의 설정 파일이다. 빌드 설정을 하거나 성능 최적화를 할 때 사용한다.

 

10. Settings.gradle

프로젝트 구성 정보를 기록하는 파일이다. 하위 프로젝트가 어떤 관계로 구성되어 있는지를 기술한다. Gradle 은 settings.gradle 파일을 기반으로 프로젝트를 구성한다.

 

 

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

 

 

11-1. 최상단 프로젝트 우측 마우스 클릭  > New > Directory

 

 

11-2. 모듈 이름 작성("multi-module-e")

 

 

11-3. 아직은 프로젝트 안에서 모듈이 아니라 하나의 디렉토리로 생성된다.

따라서 디렉토리 모양에 파란색 박스가 없음 모듈로 인식된 multi-module-a, multi-module-c 는 파란색 박스가 함께 노출한다. 아직 디렉토리인 multi-module-e 는 디렉토리 모양만 노출된다.

 

 

11-4. settings.gradle 파일에 include("multi-module-e") 입력하기

 

 

11-5. Gradle 에서 Reload Gradle.. 버튼 클릭

 

 

11-6. build.gradle 파일 수정

  • plugins { ... } 아래 모든 코드를 subprojects 내부로 옮기기
  • apply plugin: 3줄 코드 추가하기

 

 

11-6. multi-module-e 모듈 우측 마우스 클릭 > New > Directory

multi-module-e 에서 생성한 디렉토리 안에 4개 디렉토리 생성한다.

  • src/main/java
  • src/main/resources
  • src/test/java
  • src/test/resources

 

 

11-7. 디렉토리 생성 완료

 

 

11-8. multi-module-e 의 src/main/java 디렉토리 우측 마우스 클릭 > New > Package

 

 

11-8. 패키지 안에 MyApplicationE 자바 클래스와 동일하게 아래와 같이 작성

 

 

 

'스프링' 카테고리의 다른 글

Spring Boot Junit5 이해하기: @WebMvcTest, @SpringBootTest  (0) 2024.04.13