ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 챕터[14] 자바 모듈 시스템
    모던자바인액션 2020. 10. 21. 16:05

    서론

     

    자바 모듈 시스템


    10년 동안 직소 프로젝트 내부 기능이며, 자바 9에서 가장 많이 이야기 나오는 새로운 기능인 모듈 시스템에 대하여 알아보자.
    물론 그전에 잠깐 현재 자바의 모듈화는 어떤식으로 했는지 부터 알아보자.

    1. 관심사 분리(SoC)

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

    1. 특정 회계 애플리케이션을 개발한다고 가정 할 경우 SoC를 적용함으로 파싱, 분석, 레포트 기능을 모듈이라는 각각의 겹치지 않은 코드 그룹으로 분리할 수 있다.

    2. SoC 원칙은 모델, 뷰, 컨트롤러 같은 아키텍처 관점 그리고 북구 기법을 비즈니스 로직과 분리하는 등의 하위 수준 접근 등의 상황에 유용하다. 추가로 SoC 원칙은 다음과 같은 장점을 제공한다.

      1. 개별 기능을 따로 작업할 수 있으므로 팀이 쉽게 협업이 가능하다.

      2. 개별 부분을 재사용하기 쉽다.

      3. 전체 시스템을 쉽게 유지보수할 수 있다.

    2. 정보 은닉

    정보 은닉은 세부 구현을 숨기도록 장려하는 원칙이다. 소프트웨어를 개발할 때 요구사항은 자주 바뀜으로 캡슐화를 이용하여 프로그램을 제작한다. 캡슐화는 특정 코드 조각이 애플리케이션의 다른 부분과 고립되어 있음을 의미하며, 코드의 내부적인 변화가 의도치 않게 외부에 영향을 미칠 가능성이 줄어든다.
    자바에서는 클래스 내의 컴포넌트에 적절하게 private 키워드를 사용했는지를 기준으로 컴파일러를 이용해 캡슐화를 확인할 수 있다. 하지만 자바 9 이전까지는 클래스와 패키지가 의도된 대로 공개되었는지를 컴파일러로 확인할 수 있는 기능이 없었다.


    자바 모듈화 시스템 설계 이유

    1. 모듈화의 한계 : 자바9 이전까지는 모듈화된 소프트웨어 프로젝트를 만드는데 한계가 있었다. (자바는 클래스, 패키지, JAR 세 가지 수준의 코드 그룹화를 제공하는 반면 클래스와 관련해서는 접근 제어자와 캡슐화를 지원했지만 패키지와 JAR 수준에서는 캡슐화를 거의 지원하지 않았다.)

      1. 제한된 가시성 제어 : 자바에서 정보를 감출 수 있는 접근 제어자 public, protected, 패키지 수준, private 이렇게 4가지 가시성 접근자가 존재하며, 한 패키지의 클래스와 인터페이스를 다른 패키지로 공개하려면 public으로 선언을 해야한다. 하지만 public으로 선언하였기에 사용자가 내부 구현을 맘대로 사용할 수 있어 내부적으로 사용할 목적으로 만든 구현을 다른 프로그래머가 임시적으로 사용해서 정착해버릴경우 기존의 애플리케이션을 망가뜨리지 않고 라이브러리 코드를 바꾸기가 어려워지며 보안측면에서도 코드가 노출되어 코드를 임의 조작하는 위협에 더 많이 노출될 수 있다.

      2. 클래스 경로 : 클래스를 모두 컴파일한 다음 보통 한 개의 평범한 JAR 파일에 넣고 클래스 경로에 이 JAR 파일을 추가해 사용할 수 있다. 그러면 JVM이 동적으로 클래스 경로에 정의된 클래스를 필요할 때 읽는다. 하지만 클래스 경로와 JAR 조합에는 몇가지 문제가 존재한다.

        1. 클래스 경로에는 같은 클래스를 구분하는 버전 개념이 없어서 라이브러리의 클래스를 지정할 때 버전 1.0을 사용하는지 2.0을 사용하는지 지정할 수 없어 두가지의 라이브러리가 존재할 때 어떤 일이 일어날지 모른다.
        2. 클래스 경로는 명시적인 의존성을 지우너하지 않는다. 각각의 JAR 안에 있는 모든 클래스는 classes라는 한 주머니로 합쳐진다. 즉 한 JAR가 다른 JAR에 포함된 클래스 집합을 사용하라고 명시적으로 의존성을 정의하는 기능을 제공하지 않는다. 이 상황에서는 클래스 경로 때문에 어떤 일이 일어나는지 파악하기 어려우며 빠진게 있는지, 충돌이 있는지 의문이 든다. 메이븐이나 그레들 같은 빌드 도구는 이런 문제를 해결하는 데 도움을 준다. 하지만 자바 9 이전에는 자바 JVM 누구도 명시적인 의존성을 정의를 하지 않았다. 결국 JVM 이 ClassNotFoundExcpeiton 같은 에러를 발생시키지 않고 애플리케이션을 정상적으로 실행할 때 까지 클래스 경로에 클래스 파일을 더하거나 클래스 경로에는 클래스를 제거해보는 수 밖에 없다.

    자바 모듈 큰 그림

    자바 8에서는 모듈이라는 새로운 구조 단위를 제공합니다.

    모듈 디스크립터는 module-info.java 라는 특별한 파일에 저장되고, 보통 패키지와 같은 폴더에 위치합니다.

     

    자바 모듈 디스크립터 구조 도식화

    모듈 디스크립터는 보통 패키지와 같은 폴더에 위치하며 한 개 이상의 패키지를 서술하고 캡슐화 할 수 있지만 단순한 상황에서는 이들 패키지 중  한 개만 외부로 노출시킨다.

    댓글

Designed by Tistory.