[Java] Jigsaw 모듈 시스템

Jerry·2021년 9월 7일
0

language & framework study

목록 보기
20/28

Jigsaw 모듈 시스템

Java 9의 가장 큰 특징은 직소(jigsaw) 프로젝트를 이용한 모듈 시스템 도입입니다.

jigsaw 프로젝트의 목표는 다음과 같습니다.
  • 라이브러리와 규모가 큰 시스템을 모듈화하고 강력한 접근 제어

    => 캡슐화를 통한 느슨한 결합으로 유지관리성 향상

    => 불필요하고 비인가된 모듈 간 결합을 방지하여 모듈의 올바른 사용을 유도

    => 보안성 향상

  • 성능 최적화 : JPMS(Java Platform Module System)의 일환으로 JRE를 작은 단위의 모듈들로 쪼갰습니다. 이 덕분에 어플리케이션에서 실제로 사용하는 모듈만 패키징하여 배포 가능합니다.

    • 기존에는 애플리케이션이 사용하지 않더라도 XML, SQL, Swing 같은 패키지는 항상 같이 배포
    • JPMS는 모듈간 참조를 JVM start-up 타임에 검사

    => 필요한 모듈만으로 경향화된 배포 가능. 용량이 작은 컴퓨터나 라즈베리파이와 같은 소형 기기에서 보다 경량화된 프로그램으로 실행 가능

    => JVM은 모듈 dependency graph를 이용해 애플리케이션에서 어떤 모듈을 필요로 하는지 체크. 만약 필요한 모듈을 못 찾으면 JVM은 missing module을 report하고 종료하므로 런타임 오류 방지

    (JPMS 이전에는 해당 missing class 를 실제로 사용하려고 시도할 때(런타임 특정 시점) 오류를 발견)

jigsaw 모듈 테스트

프로젝트 구조

  • com.jigsawtest1

    • module-info 정의
  module com.jigsawtest1 {
    exports jigsaw.car;
  }
  • jigsaw.car.Car
  package jigsaw.car;
  
  public class Car {
      private int price;
      private String carName;
  
      public Car(int price, String carName) {
          this.price = price;
          this.carName = carName;
      }
  
      public int getPrice() {
          return price;
      }
  
      public void setPrice(int price) {
          this.price = price;
      }
  
      public String getCarName() {
          return carName;
      }
  
      public void setCarName(String carName) {
          this.carName = carName;
      }
  
      public void changeCarName(String newName){
          carName="new_"+newName;
      }
  
      @Override
      public String toString() {
          return "Car{" +
                  "price=" + price +
                  ", carName='" + carName + '\'' +
                  '}';
      }
  }
  • jigsaw.car.notexported.PrivateCar
  package jigsaw.car.notexported;
  
  public class PrivateCar {
      private int price;
      private String carName;
  
      public PrivateCar(int price, String carName) {
          this.price = price;
          this.carName = carName;
      }
  
      public int getPrice() {
          return price;
      }
  
      public void setPrice(int price) {
          this.price = price;
      }
  
      public String getCarName() {
          return carName;
      }
  
      public void setCarName(String carName) {
          this.carName = carName;
      }
  
      public void changeCarName(String newName){
          carName="new_"+newName;
      }
  
      @Override
      public String toString() {
          return "Car{" +
                  "price=" + price +
                  ", carName='" + carName + '\'' +
                  '}';
      }
  }
  
  • org.jigsawtest2

    • module-info 정의
  module org.jigsawtest2 {
      requires com.jigsawtest1;
  }
  • jigsaw.person.Person
  package jigsaw.person;
  
  import jigsaw.car.Car;
  
  public class Person {
      String name;
      int age;
      Car car;
  
      public Person(String name, int age, Car car) {
          this.name = name;
          this.age = age;
          this.car = car;
      }
  
      public String getName() {
          return name;
      }
  
      public void setName(String name) {
          this.name = name;
      }
  
      public int getAge() {
          return age;
      }
  
      public void setAge(int age) {
          this.age = age;
      }
  }
  • jigsawTest
  package jigsaw.person;
  
  import jigsaw.car.Car; // module-info에 정의되어있으므로 다른 모듈이어도 사용 가능
  //import jigsaw.car.notexported.PrivateCar;
  
  /* com.jigsawtest1 모듈에 exports 되어있지 않은 패키지이므로 import해도 오류발생
  Package 'jigsaw.car.notexported' is declared in module 'com.jigsawtest1',
   which does not export it to module 'org.jigsawtest2' */
  
  public class jigsawTest {
  
      public static void main(String[] args){
          Car car=new Car(10000,"super car");
          System.out.println(car);
          Person person=new Person("jerry",30,car);
          person.car.changeCarName("bmw");
          System.out.println(car);
  
         // PrivateCar privateCar = new PrivateCar(10000,"super car"); 사용 불가
      }
  }

[output]

Car{price=10000, carName='super car'}
Car{price=10000, carName='new_bmw'}

[참고]

profile
제리하이웨이

0개의 댓글