비긴메이트x서울창업허브 - Java9 모듈 프로그래밍

3 분 소요

금일은 비긴메이트와 서울창업허브에서 주관하여 무료로 진행해 주는 STARTUP DEVELOPER 세미나에 참석하였습니다. 사내에서 JDK10을 사용 중이지만 사실 Java8 기능들만 사용하고 있고 Java9, 10에서 추가된 기능들을 사용하고 있지않는 상황에서 Java9 모듈프로그래밍 강의가 있어서 참여하게 되었습니다.

강의 내용 및 강사님 소개는 다음과 같습니다.

  • 주제: Java 9 모듈 프로그래밍
  • 내용: 유동환 강사님께서 지필하신 책인 Java 9 모듈 프로그래밍을 기준으로 요약하고, 실습하는 강의
  • 강사: 유동환
    • 책쓰는 프로그머 협회 회장
    • 저서: RxJava 프로그래밍 등… (Spring Framework의 Webflux를 학습할 때 참고하여 본 책이였었죠…)

1. Java 모듈화 소개

기존에 자바의 경우 버전업은 지속적으로 되었지만, 최신 언어들과 비교하였을 경우엔 최신 트랜드를 빠르게 반영하지 못하는 모습을 보였었습니다. Java8 부터는 모던이라는 표현을 하기 시작하였습니다. 모던이라고 하는것 처럼 자바는 기존에 비해 Java8 버전 부터 발빠르게 최신 기술을 반영하고 있습니다.

모듈화의 의미

유사한 목적은 가진 항목끼리 묶어서 세분화 하는 것을 말합니다.

  • 자바 언어의에는 이미 아래와 같은 모듈화를 지원해 주고 있습니다.
    • 라이브러리(jar 파일 등)
    • interface
    • package
    • 접근 제어자를 통한 구조화 가능

위에서 말한것 처럼 자바에서는 이미 모듈화를 할 수 있었습니다. 그런데 Java9부터 생긴 모듈화란 무엇이고, 왜 생긴걸 까요?

기존과 달라진 점

  • 달라진 Javadoc

    • Modules

  • 모듈화 된 JDK(Project Jigsaw)

    • 순환 참조를 모두 제거하였다.
    • 기존의 JDK의 경우 많은 패키지가 얽히고 섫히는 참조구조를 가지고 있었는데 이것을 모두 제거 하였습니다.
  • 모듈화된 라이브러리 사례(JUnit 5)

    • JUnit이 5버전이 나오면서 의존성 관리가 기존보다 많아져서 복잡하고, 귀찮아졌다는 생각을 하였는데 모듈화된 사례로 나와서 반성하게 되었습니다…ㅠㅠ

요약

  • Modul 키워드 추가 (module-info.java)
    • exports, requires 등
  • JDK 모듈로 재작성 됨 (Project Jigsaw)
    • java.base, java.xml, java.sql 등
  • 모듈은 패키지 단위로 exports 함
    • 기존에는 클래스 단위로 표현하지만 모듈은 패키지 단위로 합니다.
  • public 접근 제한자도 exports 해야만 외부에서 참조 가능(리플렉션도 불가능)
    • 기존에는 public 접근 제한자 일경우 모든 클래스에서 접근할 수 있었는데 모듈에서는 public 접근자라도 export하지 않으면, 모듈에서만 접근할 수 있고 모듈 범위를 넘어서는 다른 모듈에서는 접근할 수 없다.
  • 동일 패키지는 중복할 수 없음(Split packages)
    • 기존에는 여러 라이브러리에서 동일한 패키지를 사용할 수 있었으나, Java9에서는 동일한 패키지를 사용할 수 없다.
  • JVM 시작시 필요한 모든 클래스를 확인(Module Resolution)
  • Custom JDK를 만들 수 있다.(JLink)

지원되는 IDE

  • IntelliJ IDEA (2017.9)
  • 이클립스 Photon (2018.6)
  • Netbeans 9.0 RC1 (2018.7)

Java 모듈 주의사항

  • deault 패키지는 불가 (패키지명 필수)
  • 같은 패키지가 의존하는 타 모듈에 존재할 수 없음

2. 첫번 째 자바 모듈 만들기

실습

3. 모듈 의존성

실습

4. 플랫폼 API 활용

java.base 모듈

java.base 모듈은 모듈로 분리하더라도 항상 의존성을 가져야 하는 것들을 묶어서 모듈화 한 것입니다.

  • 따로 참조하지 않아도 됨
  • 왠만한 기본 패키지는 모두 들어있음

5. 그레들 연동

필자의 경우 의존성 관리 도구로 처음 접했던 것이 Maven 이였습니다. Maven 기반으로 프로젝트를 작업하다가 이직을 하면서 gradle을 처음 접하게 되면서, mavan에 비해 문법이 쉽고, 간소화 되었다는 느낌을 많이 받았었습니다.

프로젝트 진행을 하면서 gradle을 많이 접하게 되지만, 라이브러리 의존성 관리나 task를 추가하는 등의 간단한 작업만 하다보니 학습에 대한 필요를 느끼지 못하고 그냥 사용법만 익혀왔었습니다. 해당 강사님께서 gradle에 대해 간단하게 소개를 해 주시는데 개념을 잡을 수 있어서 유용한 시간이었습니다.

그레들이란?

  • 범용 빌드 도구
    • Java, Java web projects, C, C++ 등
    • 폴리글랏 프로그래밍 (Facebook은 20여개의 언어를 동시 빌드)
  • Groovy 언어 기반
    • Groovy 언어를 몰라도 스크립트 작성 가능
    • DSL(Domain Speific Language)
  • Ant와 Maven을 계승
    • Ant의 유연함 -> 대부분 Ant task를 gradle에서 실행 가능
    • Maven의 체계성을 혼합 -> 폴더 구조가 복잡해짐
  • 명령창에서 빌드할 수 있음
    • 젠킨스 등 CI와 연동 가능

그레들의 구성 요소

  • Project 수준의 build.gradle vkdlf
    • 프로젝트의 전반의 설정
    • Repository 지정
  • 모듈 수준의 build.gradle 파일
    • 필요한 라이브러리 기술
  • settings.gradle 파일
  • gradle.properties 파일
  • local.properties 파일

자바 버전 별 gradle 지원 버전

  • gradle 4.4: java9 지원
  • gradle 4.7: java10 지원

6. 모듈 서비스

모듈 서비스란?

  • 직접 의존성이 아닌 간접 의존 계층을 제공
    • 직접 의존성이란? 해당 모듈이 어디에 위치하고, 어디서 가져와야 하느지 알고 하는 의존성
  • 느슨한 결합
    • 서로를 몰라도 기능 개선이 가능해짐

7. Custom JDK 만들기

  • 응용 프로그램에 필요한 자신만의 런타임을 만드는 도구
  • 하나의 간단한 애플리케이션을 구성할 때, 불필요한 JDK API를 제외함으로써 경량의 JDK를 제공할 수 있습니다.

8. 결론

MSA로 서비스하고 있는 경우 Java9의 모듈화를 통해서 Java Runtime 시간 및 배포에 필요한 비용이 많이 줄어들기 때문에 유용하다고 합니다.

그 이외에도 다양한 기능들이 있는거 같습니다만… 아직 사내에서 제공하는 서비스에서 도입을 통해 얻을 수 있는 결과물에 비해 러닝 커브와 구축 비용이 많을 것으로 판단되었습니다. 추후 모듈 프로그래밍이 필요한 요건이 발생할 참고해 봐야 겠습니다.

또한 규모가 큰 프로젝트의 경우 라이브러리를 배포할 때 private로 숨겨둔 클래스나 메서드들을 리플렉션으로 사용하는 것을 언어 단에서 사전에 방지할 때 사용할 수도 있습니다.

아직 Jicsaw를 이용한 모듈화는 대부분의 자바 개발자들에게는 시기상조인거 같습니다. 물론 필요하다면 사용할 수는 있겠지만 아직까지 사례도 부족하고, 다양한 라이브러리에서 모두 지원해 주지 않는다고? 합니다.

댓글남기기