자바에서의 모듈과 Gradle 모듈이 다르다는 것 아시나요?
"멀티 모듈 프로젝트"를 주제로 하는 스터디를 진행하던 중, 우연히 나온 질문이었다.
Think.. 그 물음에 대한 답을 찾아보자!
1. 자바 모듈
모듈을 알아보기 전에, 먼저 자바 패키지의 한계에 대해서 짚고 넘어가야 한다.
자바 패키지는 자바 클래스들을 논리적으로 묶어주는 단위이다.
패키지 내에 정의되어 있는 클래스들은 기본적으로 다음과 같은 접근 제어자를 갖는다.
- `public class A`: 모든 패키지에서 접근 가능
- `(package-private) class A`: 같은 패키지에서만 접근 가능
참고로 `private class A`는 자기 자신만 접근이 가능한 클래스로, 이러한 선언 자체가 의미가 없어지게 된다.
따라서 문법적으로 최상위 클래스에서는 private으로 선언할 수 없게 되었고, 중첩 클래스로 부모 클래스에서만 접근할 수 있도록 private으로 선언이 가능하다.
이렇게 패키지 안에 정의된 클래스들은 public으로 모두에게 공개하거나, package-private으로 같은 패키지에서만 접근이 가능하는, 이분법적으로만 공개 범위를 정할 수밖에 없다. 즉, 원하는 패키지만 선택적으로 접근을 허용하는 건 불가능하다. 자바의 패키지 기반 구조만으로, 정밀한 수준의 캡슐화를 제공하는 데에는 한계를 느끼게 된 것이다.
이러한 패키지 구조의 단점을 보완하기 위해, 자바 9부터 패키지를 한 번 더 감싸는 모듈(module)이 등장하게 되었다.
여러 패키지들을 모듈이라는 하나의 논리적 단위로 묶어, 모듈 단위로 의존성을 관리하고, 모듈과 패키지 간의 접근 제어도 유연하게 설정할 수 있게 되었다. 캡슐화가 강력해진 것이다.
그러면 모듈은 어떻게 정의할까?
모듈은 최상위 패키지디렉토리와 같은 레벨에 `module-info.java` 파일을 생성해서 정의한다.
project-root/
└── src/
└── main/
└── java/
├── module-info.java ← 모듈 선언 파일
└── com/
└── example/
└── App.java
그리고 `module-info.java` 파일에서는 `exports`, `requires`로 모듈 간의 접근과 의존성을 정의할 수 있다.
- `requires`: 현재 모듈이 다른 모듈에 의존함
- `exports`: 현재 모듈의 특정 패키지를 외부 모듈에 공개함
module com.example.app {
requires com.example.db; // 모듈 이름
exports com.example.core.api; // 패키지 이름
}
2. Gradle 모듈
Gradle은 자바에서 사용되는 빌드 도구이다.
여기서 빌드는 우선 컴파일러가 `.java` 소스 파일을 JVM이 읽을 수 있도록 컴파일하여 `.class` 바이트 코드 파일을 생성하고, 필요한 라이브러리를 다운로드하고 `.jar`파일과 같이 실행 가능한 형태로 패키징하는 단계이다.
그렇다면 Gradle 모듈은 무엇일까?
Gradle에서의 모듈은 하나의 독립적인 프로젝트를 의미한다.
각 모듈은 고유의 소스 코드와 `application.yml` 등의 리소스 파일, `build.gradle`과 같은 설정 파일을 가진다.
현재 스터디 중인 "멀티 모듈 프로젝트"에서의 모듈은 Gradle 모듈을 의미한다.
일반적인 모놀리식 프로젝트에서는 하나의 `build.gradle`을 구성해, 프로젝트의 전체 의존성을 관리하고, 하나의 .jar 파일로 빌드한다.
하지만 멀티 모듈 프로젝트에서는 다음과 같은 구조로 관리하게 된다.
- 루트 프로젝트에서 `settings.gradle`로 서브 모듈들을 정의하고,
- 각 서브 모듈은 각각의 `build.gradle`로 필요한 의존성을 관리한다.
따라서 멀티 모듈 구조에서는 루트 프로젝트 `.jar` 파일뿐만 아니라, 각 서브 프로젝트도 별도로 빌드되어 각각의 `.jar` 파일이 생성되게 된다. 즉, 각 서브 모듈을 개별 라이브러리처럼 활용할 수 있게 된다.
'TIL' 카테고리의 다른 글
애플 소셜 로그인 (with. Spring) (1) | 2024.11.05 |
---|---|
OAuth 2.0 개념, 동작 과정 이해 (1) | 2024.10.31 |
Sysbench 벤치마크 & 테스트 데이터 (for. Mac) (0) | 2024.07.27 |
템플릿 메소드 패턴 vs. 전략 패턴 (0) | 2024.07.14 |