컴퓨터 프로그램을 고유의 기능으로 나누는 동작을 권장하는 원칙
장점
세부 구현을 숨기도록 장려하는 원칙
세부 구현을 숨김으로 프로그램의 어떤 부분을 바꿨을 때 다른 부분까지 영향을 미칠 가능성을 줄인다
자바에서는 public, protected, private등의 접근 제한자와 패키지 수준의 접근 권한 등을 이용해 메서드, 필드 클래스의 접근을 제어
하지만 이와 같은 방법은 원하는 접근 제한을 달성하기 힘들고 최종 사용자에게 원하지 않는 메서드를 공개해야 된다는 단점이 존재
자바 9 이전의 한계
자바는 클래스, 패키지, JAR 세 가지 수준의 코드 그룹화를 제공
클래스에 대한 접근 제한자와 캡슐화를 지원했미난 패키지와 JAR 수준에서는 캡슐화를 거의 지원하지 않음
JDK: 자바 프로그램을 만들고 실행하는 데 도움을 주는 도구의 집합
시간이 지나면서 JDK의 사이즈가 커지며 클라우드 환경 등에서 문제를 일으키게 됨
JDK 자체도 모듈화하여 필요한 부분만 골라 사용하고, 클래스 경로를 쉽게 유추할 수 있으며, 플랫폼을 진화시킬 수 있는 강력한 캡슐화를 제공할 새로운 건축 구조가 필요
모듈 디스크립터에 export로 어디에 해당 모듈을 노출 시킬것인지 required를 통해 어떤 다른 모듈을 필요로 하는지 나타낼 수 있다
이런 모듈의 세부사항은 IDE가 처리하고 사용자에게는 잘 드러나지 않는다
너무 세분화하게 모듈화를 하면 초기비용이 높아진다
하지만 프로젝트가 커지면서 캡슐화와 추론의 장점이 두드러진다
세부적인 모듈화
거친 모듈화
시스템을 실용적으로 분해하면서 진화하는 소프트웨어 프로젝트가 이해하기 쉽고 고치기 쉬운 수준으로 적절하게 모듈화 되어 있는지 주기적으로 확인하는 프로세스를 갖아야 한다
module expensese.readers{
requires java.base;// 모듈명
// 패키지명
exports com.example.expenses.readers;
exports com.example.expenses.readers.file;
exports com.example.expenses.readers.http;
}
exports
requires
모듈 경로상에 있으나 module-info 파일을 가지지 않은 모든 JAR는 자동 모듈이 된다
자동 모듈은 암묵적으로 자신의 모든 패키지를 노출