본문 바로가기
스프링/만들면서 배우는 실무 백엔드 개발

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

by kdohyeon (김대니) 2023. 3. 21.
반응형

이번 시간에는 멀티 모듈로 프로젝트를 구성해보도록 하겠습니다.


https://github.com/kdohyeon/crypto-labs/pull/3

멀티 모듈 (Multi-module) 프로젝트?

멀티 모듈로 프로젝트를 구성하기에 앞서, 멀티 모듈은 뭘까? Java 에서 하나의 모듈은 독립적인 코드의 단위를 의미한다. 따라서 멀티 모듈은 독립적인 여러 개의 모듈이 모여 상호 연결된 것을 의미한다. 

작은 사이즈의 프로젝트를 개발할 때에는 큰 문제가 되지 않지만 점점 크기가 커지다 보면 여러 개의 서버를 만들어야 한다. API 서버도 필요하고, 배치 서버도 필요하다. 각각에 대해 단일 프로젝트로 구성하여 만들 수 있지만 공통적으로 처리해야 하는 부분이 있다면 중복 코드가 발생할 수 있고 (사실 중복 코드보다는 개발자가 똑같은 작업을 여러번 해야 한다는 귀찮음이 더 큰 것 같다) 유지보수 측면에서 좋지 않다. 또한, 프로젝트의 크기가 커지면서 각 세부 파트가 담당해야 할 역할을 명확하게 정해주는 것이 중요하고 필요한 부분에 대해서만 의존성을 부여하는 것이 필요하다.

모듈 구조 설계

그럼 멀티 모듈로 프로젝트를 구성해보자. 다양한 구조로 설계를 할 수 있겠지만 이 프로젝트에서는 아래처럼 구성하고자 한다. 추후 비즈니스가 복잡해짐에 따라 모듈이 더 추가되고 삭제될 수 있다.

crypto-labs
|-- crypto-adapters
    |-- adapter-http
    |-- adapter-json
    |-- adapter-persistence
|-- crypto-apps
    |-- app-api
    |-- app-batch
|-- crypto-libs
    |-- application-contract
    |-- application-domain
    |-- application-service
    |-- application-port

crypto-labs 프로젝트에는 크게 3개의 모듈이 존재한다, crypto-adapters, crypto-apps, crypto-libs. 또한 각 모듈 아래 세부 모듈이 더 존재하는데, 자세한 내용은 아래를 참고하자.

  • :crypto-adapters:adapter-http: 외부 HTTP 통신을 위한 모듈
  • :crypto-adapters:adapter-json: json 데이터를 다루기 위한 모듈
  • :crypto-adapters:adapter-persistence: DB 컨트롤을 위한 모듈
  • :crypto-apps:app-api: RESTful API 를 관리하기 위한 모듈
  • :crypto-apps:app-batch: 배치를 관리하기 위한 모듈
  • :crypto-libs:application-contract: 내부 어플리케이션의 enum, exception 을 관리하기 위한 모듈
  • :crypto-libs:application-domain: 내부 어플리케이션의 도메인 엔티티를 관리하기 위한 모듈
  • :crypto-libs:application-service: 내부 어플리케이션의 비즈니스 로직을 구현하기 위한 모듈
  • :crypto-libs:application-port: 내부 어플리케이션의 input/output port 를 관리하기 위한 모듈

전체적인 그림을 그린다면 아래와 같다.

crypto-labs 프로젝트의 아키텍쳐

모듈 만들기

위에 설계한대로 모듈을 만들어보자.

Directory 로 만들기

프로젝트 "crypto-labs" 에 마우스 오른쪽을 클릭하면 아래와 같은 화면이 나오는데, New > Directory 를 클릭해서 폴더를 만들어준다.

root project 오른쪽 마우스 클릭 > New > Directory

아래 예시처럼 각 모듈의 이름을 적어주고, 폴더를 생성한다.

crypto-adapters/adapter-http 입력

폴더를 생성해주고 난 뒤, 각 폴더를 모듈로 인식할 수 있도록 해주어야 한다. 방법은 settings.gradle.kts 를 수정하면 되는데, 아래 코드를 복사해서 붙여넣어보자. 

// settings.gradle.kts

rootProject.name = "crypto-labs"
include(":crypto-adapters:adapter-http")
include(":crypto-adapters:adapter-http")
include(":crypto-adapters:adapter-json")
include(":crypto-adapters:adapter-persistence")
include(":crypto-apps:app-api")
include(":crypto-apps:app-batch")
include(":crypto-libs:application-contract")
include(":crypto-libs:application-domain")
include(":crypto-libs:application-service")
include(":crypto-libs:application-port")

프로젝트가 빌드되면서 settings.gradle.kts 파일을 먼저 참조해서 프로젝트의 전체 구조를 구성하게 되는데, 위 코드는 각 폴더를 crypto-labs 하위 모듈로 인식하게 하는 과정이다.

IntelliJ 우측에 위치하는 Gradle 탭을 클릭하고 sync 버튼을 클릭해보자. 그러면 crypto-adapters 등 각 폴더가 모듈로 인식이 되면서 파란색 박스가 붙게 된다.

Gradle sync
파란색 박스가 붙은 각 모듈


멀티 모듈로 프로젝트를 구성하는 것까지 성공했습니다. 다음 시간에는 로컬에서 작업하고 있는 코드를 Github 에 올림으로써 코드 형상 관리를 해보도록 하겠습니다.

반응형

댓글