We will find a way, we always have.

-interstellar

카테고리 없음

[독서] 자바 / 스프링 개발자를 위한 실용주의 프로그래밍 - 6

Redddy 2024. 11. 18. 21:40

9. 모듈

 

모듈이나 모듈 시스템이란 무엇일까? 라는 질문에 일반적인 나오는 답변으로는 

  • 모듈은 독립된 코드 묶음이다.
  • 자바에서 모듈 시스템은 패키지다.
  • 자바 9에서 모듈 시스템은 module-info.java다

이라고 한다. (사실 이 챕터를 읽기 전까지 모듈에 대해서 확실히 정의 내리기가 어려웠다.)

 

위 답변들 모두 모듈을 직접적으로 설명하는 것이 아니라 자바에 빗대어 설명하고 있고, 어딘가 애매모호 하다. 그리고 자바의 패키지 시스템은 모듈 시스템이 될 수 없기 때문에 '자바에서 모듈 시스템은 패키지다'라는 답변은 틀렸다. 

 

그럼 다시 구체적으로 질문해보자.

 

  • 소프트웨어에서 말하는 모듈이나 모듈 시스템이란 무엇일까?
  • 자바의 패키지는 왜 모듈 시스템이 될 수 없을까?
  • 자바 9부터 추가된 모듈 시스템(module-info.java)은 무엇이고 왜 추가된 것일까?
  • 자바 9부터 모듈 시스템(module-info.java)이 추가됐다면 자바 9 이전에는 모듈 시스템이 없었다고 봐야할까?

 

9.1 모듈성

소프트웨어 공학에서 말하는 모듈은 아래와 같다.

 

  1. 모듈은 프로그램의 기본 구성 요소다.
    이런 정의는 지나치게 넓은 의미를 가지고 있고 여전히 모듈이 무엇인지 설명하지 못한다. 예를 들어, 객체지향에서 프로그램의 기본 구성 요소는 객체이다. 그렇다면 우리는 객체 하나하나를 모두 모듈이라고 불러야 할 것이다. 그런데 객체를 모두 모듈이라고 보는 것은 조금 지나친 해석 같아 보이면서도 얼추 맞는 의미인 것 같아 모호하다. 
  2. 특수한 목적을 가지고 만들어지는 라이브러리다. 
    이런 정의는 너무 집약적이다. 만약 이 정의를 따른다면 라이브러리를 사용하지 않는 모든 애플리케이션은 모듈이 없다고 평가해야 할 것이다. 그런데 실제로 그렇지 않다. 따라서 라이브러리가 아니어도 모듈이 될 수 있다. 

 

소프트웨어 공학에서 모듈은 프로그램의 기본 구성 요소이면서 라이브러리를 포괄하는 조금 더 큰 규모의 용어다. 하지만 두 정의 역시 모호하다. 그만큼 사람마다 모듈이라는 개념을 받아들이는 수준이 다르다. 

 

여기에 책의 저자는 모듈을 이렇게 정의한다.

 

소프트웨어 관점에서 모듈이란 독립성(independence)과 은닉성(hiding)을 만족하며 연관된 코드들의 묵음이다. 

  1. 독립성: 모듈은 독립적이어야 한다. 모듈을 사용하기 전에 필요한 의존성을 알 수 있어야한다. 그리고 모듈의 의존성이 모두 준비가 된다면 모듈을 사용하는 데 아무런 문제가 없어야 한다. 외부에는 강하게 의존하지 말고 최대한 내부에서 해결해야 한다. 외부 시스템을 사용한다면 외부 시스템의 사용을 명시해야 한다.
  2. 은닉성: 모듈의 사용자는 모듈의 내부 구현은 몰라도 된다. 공개된 인터페이스를 이용해 모듈과 통신한다. 

 

그리고 모듈 시스템에 대해서는 이렇게 정의한다.

 

모듈 시스템이란 연관된 코드 묶음이 '모듈성'을 갖출 수 있게 도와주는 시스템적인 해결책이다. 모듈성을 지원하기 위해 모듈 시스템은 다음과 같은 기능을 필수적으로 지원해야 한다. 

 

  1. 의존성 관리: 모듈을 사용하기 위해 어떤 의존성이 필요한지 명시할 수 있어야 한다.
  2. 캡슐화 관리: 모듈은 불필요한 구현을 외부로 드러내지 않아야 한다. 

 

이 모듈은 어떤 외부 모듈에 의존하고 있는지이 모듈 중 어떤 컴포넌트만 외부로 노출할 것인지를 나타내주어야 한다. 자바에서는 module-info.java라고 하는 모듈 디스크립터가 바로 모듈 시스템이다.

 

 

1
2
3
4
5
module myproject.main {
    requires org.apache.httpcomponents.httpclient;
    exports com.myorg.myproject.model;
}
 
cs

 

 

자바의 패키지 시스템은 패키지 수준의 의존성 관리와 캡슐화 관리 기능을 지원하지 않기 때문에 패키지 시스템은 모듈 시스템이라고 볼 수 없다. 자바의 패키지 시스템은 연관성 높은 코드를 묶는 수단에 불과하다. 

 

모듈 디스크립터는 자바 9 버전부터 추가된 기능이고, 패키지 시스템을 모듈 시스템이라고 부를 수 없다면 자바 8 버전 이전에는 모듈 시스템이 존재하지 않았다고 봐야 할까...? 그렇다. 실제로 자바 9가 나오기 전까지는 모듈 시스템이 존재하지 않는다고 평가하기도 한다.

 

9.2 패키지 구조

일반적으로 스프링을 기반으로 하는 프로젝트를 보면 크게 두 가지 방식으로 패키지 구조를 구성하는 것을 볼 수 있다. 하나는 패키지를 구성할 때 계층이 먼저 나오는 '계층 기반 구조'이고, 또 다른 하나는 '도메인 기반구조'이다. 

 

계층 기반 구조

 

  • 이해하기 쉽고 사용하기 쉽다.
  • 도메인이 눈에 들어오지 않는다.
  • 프로젝트를 구성하는 주요 단위를 계층으로 보고 있다. 

 

도메인 기반 구조

 

  • 계층 기반 구조보다는 복잡해진다.
  • 도메인이 눈에 들어온다.
  • 프로젝트를 구성하는 주요 단위를 도메인으로 보고 있다.

 

구조에는 만병통치약이 없기 때문에 각자 상황에 맞는 것을 사용하자.

 

 


우테코 레벨 2 방탈출 미션을 진행했을 때에는 계층 기반 구조를 사용했었다가 레벨 3,4 코딩해듀오 팀프로젝트에서는 도메인 기반 구조를 사용했었다. 확실히 방탈출 미션처럼 도메인이 적은 프로젝트에서는 계층 기반 구조로 가는 것이 한 눈에 더 잘 들어왔다. 코딩해듀오 프로젝트처럼 도메인이 많아지는 경우는 도메인 기반 구조를 가져가는 것이 합리적인 선택인 것 같다.