[Error] 아무것도 안건들렸는데, module-info.java Error

신창호·2023년 3월 21일
0

Error

목록 보기
1/1

나타나는 에러 현상

  • Modeule-info.java 파일에서 아래와 같이 일어났다.

module com.example.programmers {
    requires javafx.controls; // 에러
    requires javafx.fxml; // 에러

    opens com.example.programmers to javafx.fxml;
    exports com.example.programmers;
}
  • 결론 적으로는, javafx.controls 와 javafx.fxml 를 찾을 수 없어서 나타나는 에러인데, 이게 갑자기 왜 이렇게 되었는지 알아보자.

사전지식

  • 먼저 모듈에 대해 알면 좋다. 또한 javaFx에대해서도 알아보자.
  • java 9는 공식적으로 java Platform Modile System, 줄여서 Module이라고 알려진 새로운 수준의 추상화를 도입했다.
  • 모듈에는 종속성의 개념이 있으며, Public API를 내보내고 구현 세부 정보를 숨김/비공개 상태로 유지할 수 있다.
  • 이렇게 모듈형 시스템을 고안하게된 주된 동기는 가용 메모리가 훨씬 적은 장치에서 실행 할 수 있는 모듈형 JVM을 제공 하는 것이 었다.






JavaFX

  • intelliJ에서도 new Project시 javaFx가 있는 걸 알 수 있다.

개요

  • 자바 UI가 많이 변하게된다.

AWT(Abstract Window Toolkit)

  • 자바언어 초기에는 인터넷이 활성화되기 전이기 때문에, 대부분의 클라이언트 애플리케이션은 운영체제가 제공하는 네이티브 UI 컴포넌트를 이용해서 개발되었다.
  • AWT는 java1.0 에 포홤된 라이브러리로, 운영체제가 제공하는 네이티브 UI 컴포넌트를 이용하는 툴킷이다.

⇒ 즉, 운영체제마다 UI모양이 달랐다.

Swing

  • AWT의 다음 세대로 단점을 개선하기 위해 출시되었다.(2000년대 초반)
    • Swing의 중점은 네이티브 UI 컴포넌트를 사용하지 말자는 것
  • 장점
    • 모든 운영체제상에서 동일한 UI을 갖도록 자신만의 UI을 가진다.
  • 단점
    • 실행성능이 느려지고, 메모리를 더 많이 사용하게 된다.
    • 운영체제에서 제공해주는 UI가 훨씬 더 빨리 발전되면서 메리트가 있었다.

JavaFx

  • 크로스 플랫폼에서 실행하는 리치 클라이언트 애플리케이션(Rich Client Application)을 개발하기 위한 그래픽과 미디어 패키지를 말한다.
    • 쉽게 말해, 데스크탑 뿐만아니라 임베디드까지 적용할 수 있도록 가벼운 UI 제공
  • 레이아웃, 스타일, 애플리케이션 로직을 분리 개발
  • 자바7 업데이트6버전부터 JDK에 포함된다.
    • Swing보다 가벼워지고 더 강력해졌기 때문에 대체되었다.

  • JavaFx 애플리케이션에서 UI 생성, 이벤트 처리, 멀티미디어 재생, 웹 뷰 등과 같은 기능은 JavaFX API로 개발하고 그 외의 기능은 자바 표준 API를 활용하여 개발할 수 있다.
  • 화면 레이아웃과 스타일, 애플리케이션 로직을 분리할 수 있기 때문에 디자이너와 개발자들이 협력해서 JavaFX 애플리케이션을 개발할 수 있는 구조를 가지고 있다.
  • 레이아웃과 애플리케이션 로직을 분리하고 싶다면 레이아웃은 FXML 파일로 작성하고 애플리케이션은 자바 코드로 작성
    하면 된다.






모듈

  • 모듈이란 서로 밀접하게 연관된 패키지들과 리소스들의 그룹
    • 자바 패키지들의 패키지(package of Java Packages)"라고도 볼 수 있다.
    • 코드의 재사용성을 높이기 위해 추상화 단계를 하나 더 추가한 것이다.

모듈 설명자

  • 모듈을 만들때, 모듈을 여러가지 설정할 수 있는 설명자 파일이 필요하다.
  • module-info.java에 정의할 내용 작성하며, 설정할 수 있는 값은 아래와 같다.
    • 이름
    • 종속성
      • 이 모듈이 의존하는 다른 모듈 목록
    • 공용패키지
      • 모듈 외부에서 접근 할 수 있는 모든 패키지 목록
    • 제공되는 서비스(Service Provider)
      • 다른 모듈에서 사용할 수 있는 서비스 구현자가 되도록 한다.
    • 사용된 서비스(Service Consumer)
      • 현재 모듈이 서비스의 소비자가 될 수 있도록 한다.
    • 리플렉션 허용
      • 다른 클래스가 리플랙션을 사용하여 패키지의 private 멤버에 접근할 수 있는지의 여부를 명시

모듈타입

새 모듈 시스템에는 4가지 유형의 모듈이 있다.

  • 시스템 모듈(System Modules)
    • list-modules 명령어를 입력했을 때 조회되는 모듈들

    • Java SE 및 JDK 모듈이 여기에 포함

  • 애플리케이션 모듈(Application Modules)
    • 일반적으로 우리가 모듈을 사용하기로 결정했을 때 빌드하고자하는 모듈이 이 모듈이다.
    • 이들은 JAR에 포함된 컴파일된 module-info.class 파일에 명명되고 정의된다.
  • 자동 모듈(Automatic Modules)
    • 기존 JAR 파일을 모듈 경로(module path)에 추가하여 비공식 모듈을 포함시킬 수 있다.
    • 모듈 이름은 JAR의 이름에서 파생된다. 자동 모듈은 모듈 경로에 로드된 다른 모든 모듈들에 대한 전체 읽기 액세스 권한을 가지게 된다
  • 이름없는 모듈
    • 클래스 또는 JAR가 모듈 경로(module path)가 아닌 클래스 경로(classpath)에 로드되면, 이름이 지정되지 않은 모듈에 자동으로 추가된다.

    • 이전에 작성된 java코드와 하위 호환성을 유지하기 위함이다.






디폴트 모듈

  • 위에 언급한 시스템 모듈 list-modules 명령어을 입력했을 때 나오는 모듈들은 크게 4가지 주요 그룹으로 나눈다.
    • java
      • 핵심 javaSE언어에 대한 구현 클래스
    • javafx
      • UI 라이브러리
    • jdk
      • JDK에 필요한 모든 것
    • Oracle
      • 오라클에 특화된 모듈

모듈 선언

  • 모듈을 설정하려면 module-info.java라는 모듈 설명자 파일을 패키지 루트 레벨에 생성해야 한다.
    • 이 파일에는 모듈을 생성하는데 필요한 모든 데이터가 들어있다
module com.example.programmers(모듈이름) {
    // 설정값들은 모두 Optional
}
  • module' 키워드로 모듈 선언을 시작하고, 그다음 모듈 이름을 쓴다

Requires

  • 이 모듈의 종속성을 나타낸다.
module com.example.programmers {
    requires javafx.controls;
    requires javafx.fxml;
}
  • 이렇게 되면, 이제 javafx.controls, javafx.fxml 모듈에 대한 종속성을 갖게 된다.(런타임, 컴파일 타임 둘다.)

Exports

  • 모듈 내의 모든 public 멤버들을 외부로 노출시키기 위해 'exports' 키워드를 사용한다.
    • 디폴트로, 모듈은 자신의 API를 다른 모듈에 노출시키지 않는다.
module com.example.programmers {
    exports com.example.programmers;
}

Opens

  • 특정 패키지에 대해서만 리플렉션을 허용하고 싶을 경우, 'opens' 키워드를 사용하면 된다.
module com.example.programmers {
    opens com.example.programmers to javafx.fxml;
}






정리

  • 항상 Spring으로 java Web Application을 만들다보니, javaFx에 대해 맛만 봐보았다. 다른 Project에 대해서 나도 모르게 거부감을 가지고 있었던 것 같다.
  • 기회가 된다면 다른 프레임워크나 툴로도 개발을 진행해보는 것도 개발 시야를 넓이기위해 필요한 과정인 것 같다.

참고자료

profile
한단계씩 올라가는 개발자

0개의 댓글