[Java] 자바에서 패키지(package)와 모듈(module)의 차이점

Cynthia Kim
4 min readJun 30, 2021

--

모듈(Module)

얼마 전부터 자바를 배우기 시작했습니다. (와!) 그리고 패키지(package)라는 개념을 습득하면서 그나마 익숙했던 앵귤러(Angular)에서의 모듈(Module)과 비슷하게 받아들였었죠. 그런데 이게 웬 걸? Java 9 부터는 모듈 지원을 한다는 것입니다! 완전 잘못 생각하고 있던 것이죠. 그렇다면 자바에서 패키지와 모듈의 차이점은 무엇일까요?

패키지(Package)

자바의 패키지는 하나의 디렉토리로 클래스들의 묶음이다. 보통 비슷한 성격들의 클래스들을 모아 둔다. 하위 패키지도 포함하는 중첩된 구조도 가능하다. 그런 경우, .(dot)를 사용해서 표현한다.

상위패키지.하위패키지.클래스

모듈(Module)

자바의 모듈은 외부에서 재사용 할 수 있는 패키지들을 묶은 것을 말한다. 어떻게 보면 이클립스에서 개발하는 프로젝트는 하나의 모듈을 개발하는 것. 그리고 서로 다른 프로젝트가 import와 export를 이용하여 패키지(package)를 주고 받는다. 패키지의 상위 개념이라고 할 수 있다.

그렇다면 왜 자바에는 모듈과 패키지로 나누어져 있는 걸까? 그것도 초기부터가 아니고 나중에서야 나눠지게 된 걸까? 기존의 패키지만으로는 부족한 점들을 커버하기 위해서 생긴 것이다. 자바가 점점 더 다양한 곳에 사용되고 규모가 커짐에 따라 여러가지 문제가 생기기 시작했다.

첫째로, 패키지의 캡슐화(Encapsulation)가 완벽하지 않다. 객체지향 프로그래밍에서 세부 구현을 숨기는 캡슐화는 필수적인 기법이다. 하지만 자바에서 클래스는 액세스 지정자로 멤버의 공개 여부를 마음대로 지정하는데 비해 패키지의 정보 은폐는 약하다. 클래스를 숨길 수는 있지만 공개 또는 비공개 둘 중 하나만 선택할 수 있어 여러 패키지에서 공용으로 사용할 클래스를 외부에 대해 숨길 수 없다. 공용으로 사용할 클래스를 공개해 버리면 라이브러리 내부 뿐만 아니라 외부에서도 자유롭게 사용할 수 있다. 클래스는 패키지 내부로 숨길 수 있지만 패키지는 숨겨 두고 내부에서만 사용할 방법이 없다. 이럴 때는 문서나 가이드를 통해 내부용 패키지는 사용하지 말라고 부탁 또는 협박하는 수밖에 없는데 모든 개발자가 이런 권장 사항을 다 지키는 것은 아니다. 사용자가 내부 기능을 직접 사용하면 이후 자유롭게 유지, 보수할 수 없다. 그래서 문법적으로 완전히 숨길 수 있는 강한 캡슐화가 필요해졌다.

둘째로, 빌드 단계에서 프로그램 구동에 필요한 모든 클래스가 다 있는지 확인할 수 없다. 자바는 동적 로딩을 통해 필요한 클래스를 실행중에 로드한다. 덕분에 시작이 빠르고 생성할 클래스를 선택할 수 있지만 실행 직후에는 누락 사실을 바로 알 수 없다는 문제가 있다. 클래스 누락을 방지하려면 실행중에 로드되는 클래스가 다 있는지 수작업으로 일일이 확인하는 수밖에 없다.

마지막으로, 런타임이 거대해져 배포가 어려워졌다. 초기의 자바 플랫폼은 라이브러리의 모든 클래스를 rt.jar라는 단 하나의 파일에 통합하여 배포했다. rt는 런타임(Run Time)이라는 뜻이며 자바 프로그램이 실행되기 위한 모든 클래스가 포함되어 있는 자바 플랫폼 그 자체이다. 단일 파일이라 배포하기 쉽고 별 문제가 없었다. 그러나 자바 버전이 올라 가면서 rt.jar는 용량 60M에 2만개의 클래스를 포함하는 초대형 런타임이 되었고 앞으로는 더 늘어날 것이 뻔하다. PC에서는 별 무리가 없지만 임베디드 장비에 설치하기에는 너무 거대하다. 게다가 단일 파일이라 불필요한 것까지 한꺼번에 배포할 수밖에 없다. 꼭 필요한 클래스만 추려 원하는 런타임을 생성하고 런타임과 프로그램을 같이 배포할 수 있어야 할 필요가 생겼다.

이러한 문제들을 해결하기 위해 도입된 것이 모듈화다.

--

--

Cynthia Kim
Cynthia Kim

Written by Cynthia Kim

👩🏻‍💻🧘🏻‍♀️🏋🏻‍♀️🍷🥗💄

No responses yet