압력 : 소프트웨어 유추
관심사분리
컴퓨터 프로그램을 고유의 기능으로 나누는 동작을 권장하는 원칙
SoC를 적용함으로 파싱, 분석, 레포트 기능을 모듈이라는 각각의 부분 즉, 코드 그룹으로 분리할 수 있다.
Soc 원칙은 모델, 뷰, 컨트롤러 같은 아키텍처 관점 그리고 복구 기법을 비즈니스 로직과 분리하는 등의 하위 수준 접근 등의 상황에 유용하다.
1. 개별 기능을 따로 작업할 수 있으므로 팀이 쉽게 협업할 수 있다.
2. 개별 부분을 재사용하기 쉽다.
3. 전체 시스템을 쉽게 유지보수할 수 있다.
정보 은닉
캡슐화는 특정 코드 조각이 애플리케이션의 다른 부분과 고립되어 있음을 의미한다. 캡슐화된 코드의 내부적인 변화가 의도치 않게 외부에 영향을 미칠 가능성이 줄어든다. 자바에서는 클래스 내의 컴포넌트에 적절하게 private키워드를 사용했는지를 기준으로 컴파일러를 이용해 캡슐화를 확인할 수 있다. 하지만 자바 9 이전까지는 클래스와 패키지가 의도된 대로 공개되었는지를 컴파일러로 확인할 수 있는 기능이 없었다.
자바 소프트웨어
UML 다이어그램 같은 도구를 이용하면 그룹 코드 간의 의존성을 시각적으로 보여줄 수 있으므로 소프트웨어를 추론하는데 도움이 된다.
자바 모듈 시스템을 설계한 이유
모듈화의 한계
자바는 클래스, 패키지, JAR 세 가지 수준의 코드 그룹화를 제공한다. 클래스와 관련해 자바는 접근 제한자와 캡슐화를 지원했다. 하지만 패키지와 JAR 수준에서는 캡슐화를 거의 지원하지 않았다.
제한된 가시성 제어
자바는 정보를 감출 수 있는 접근자를 제공한다. Public, protected, 패키지 수준 private 이렇게 네 가지 가시성 접근자가 있다.
클래스 경로
JAR 조합에는 몇 가지 약점이 존재한다.
첫째, 클래스 경로에는 같은 클래스를 구분하는 버전 개념이 없다. 경로에 두 가지 버전의 같은 라이브러리가 존재할 때 어떤 일이 일어날지 예측할 수 없다.
둘째, 클래스 경로는 명시적인 의존성을 지원하지 않는다. JAR가 다른 JAR에 포함된 클래스 집합을 사용하라고 명시적으로 의존성을 정의하는 기능을 제공하지 않는다.
거대한 JDK
JDK 라이브러리는 많은 내부 API는 공개되지 않아야 한다. 안타깝게도 자바 언어의 낮은 캡슐화 지원 때문에 내부 API가 외부에 공개되었다. 예를 들어 스프링(Spring), 네티(Netty), 모키토(Mokito)등 여러 라이브러리에서 sun.misc.Unsafe라는 클래스를 사용했는데 이 클래스는 JDK 내부에서만 사용하도록 만든 클래스다. 이런 문제들 때문에 JDK 자체도 모듈화할 수 있는 자바 모듈 시스템 설계의 필요성이 제기되었다.
자바 모듈 : 큰 그림
자바 8는 모듈이라는 새로운 자바 프로그램 구조 단위를 제공한다. 모듈은 module이라는 새 키워드에 이름과 바디를 추가해서 정의한다. 모듈 디스크립터(module descriptor는 module-info.java)라는 특별한 파일에 저장된다
모듈 정의와 구문들
requires
컴파일 타임과 런타임에 한 모듈이 다른 모듈에 의존함을 정의한다.
exports
지정한 패키지를 다른 모듈에서 이용할 수 있도록 공개 형식으로 만든다. 아무 패키지도 공개하지 않는 것이 기본 설정이다. 어떤 패키지를 공개할 것인지를 명시적으로 지정함으로 캡슐화를 높일 수 있다. exports는 패키지명을 인수로 받지만 requires는 모듈명을 인수로 받는다는 사실에 주의하자
requires transitive
다른 모듈이 제공하는 공개 형식을 한 모듈에서 사용할 수 있다고 지정할 수 있다.
exports to
사용자에게 공개할 기능을 제한함으로 가시성을 좀 더 정교하게 제어할 수 있다.
open과 opens
모듈 선언에 open 한정자를 이용하면 모든 패키지를 다른 모듈에 반사적으로 접근을 허용할 수 있다. Opens 구문을 모듈 선언에 이용해 필요한 개별 패키지만 개방할 수 있다.
uses와 provides
자바 모듈 시스템은 provides 구문으로 서비스 제공자를 uses 구문으로 서비스 소비자를 지정할 수 있는 기능을 제공
'Programming > Java' 카테고리의 다른 글
EPISODE 16. 모던 자바 인 액션(CHAPTER 16 CompleatableFuture : 안정적 비동기 프로그래밍) (0) | 2023.08.19 |
---|---|
EPISODE 15. 모던 자바 인 액션 (CHAPTER 15 CompletableFuture와 리액티브 프로그래밍 컨셉의 기초) (0) | 2023.08.01 |
EPISODE 13. 모던 자바 인 액션(CHAPTER 13 디폴트 메서드) (1) | 2023.07.24 |
EPISODE 12. 모던 자바 인 액션(CHAPER 12 새로운 날짜와 시간 API) (0) | 2023.07.21 |
EPISODE 11. 모던 자바 인 액션(CHAPTER 11 null 대신 Optional 클래스) (0) | 2023.07.20 |