모던 자바 인 액션 14장 : 자바 모듈 시스템

Adam·2024년 7월 7일
0

모던 자바 인 액션

목록 보기
14/20
post-thumbnail

압력: 소프트웨어 유추

관심사분리

컴퓨터 프로그램을 고유의 기능으로 나누는 동작을 권장하는 원칙

장점

  • 개별 기능을 따로 작업할 수 있으므로 팀이 쉽게 협업할 수 있다
  • 개별 부분을 재사용하기 쉽다
  • 전체 시스템을 쉽게 유지보수할 수 있다

정보 은닉

세부 구현을 숨기도록 장려하는 원칙

세부 구현을 숨김으로 프로그램의 어떤 부분을 바꿨을 때 다른 부분까지 영향을 미칠 가능성을 줄인다

자바 소프트웨어

자바에서는 public, protected, private등의 접근 제한자와 패키지 수준의 접근 권한 등을 이용해 메서드, 필드 클래스의 접근을 제어

하지만 이와 같은 방법은 원하는 접근 제한을 달성하기 힘들고 최종 사용자에게 원하지 않는 메서드를 공개해야 된다는 단점이 존재

자바 모듈 시스템을 설계한 이유

자바 9 이전의 한계

모듈화의 한계

자바는 클래스, 패키지, JAR 세 가지 수준의 코드 그룹화를 제공

클래스에 대한 접근 제한자와 캡슐화를 지원했미난 패키지와 JAR 수준에서는 캡슐화를 거의 지원하지 않음

  • 제한된 가시성 제어
    • 한 패키지의 클래스와 인터페이스를 다른 패키지로 공개하려면 public으로 선언해야 한다→클래스와 인터페이스는 모두에게 공개가 됨
    • 내부적으로 사용할 목적으로 만든 구현을 다른 프로그래머가 임시적으로 사용해서 정착해버릴 수 있으므로 기존의 애플리케이션을 망가뜨리지 않고 라이브러리 코드를 바꾸기 어려움
    • 코드가 노출되어 보안적으로도 좋지 못함
  • 클래스 경로
    • 같은 클래스를 구분하는 버전 개념이 없다
    • 클래스 경로는 명시적인 의존성을 지원하지 않는다
      • 각각의 JAR안에 있는 모든 클래스는 classes라는 한 주머니로 합쳐짐
      • 한 JAR가 다른 JAR에 포함된 클래스에 집합을 사용하라고 명시적으로 의존성을 정의하는 기능을 제공하지 않음→충돌이 발생할 가능성이 있음

거대한 JDK

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는 자동 모듈이 된다

자동 모듈은 암묵적으로 자신의 모든 패키지를 노출

모듈 정의와 구문들

  1. requires: 컴파일과 런타임에 한 모듈이 다른 모듈에 의존함을 정의
  2. exports: 지정한 패키지를 다른 모듈에서 이용할 수 있도록 공개 형식으로 만듬
  3. requires transitive: 다른 모듈이 제공하는 공개 형식을 한 모듈에서 사용할 수 있다고 지정
  4. exports to: 사용자에게 공개할 기능을 제한해서 가시성을 좀 더 정교하게 제어
  5. open: 모든 패키지를 다른 모듈에 반사적으로 접근 허용
  6. uses/provides: provides 구문으로 서비스 제공자를 uses 구문으로 서비스 소비자를 지정
profile
Keep going하는 개발자

0개의 댓글