본 내용은 아직 정확한 이해를 가지지 못했습니다. 부정확한 부분이 많이 존재하기 때문에 주의해주세요
자바의 동시성과 병렬성을 많은 시간과 노력으로 점점 더 진화하고 있다. 하지만 우리가 지금까지 코딩을 하며 동시성과 병렬성을 얻기 위해 스레드를 직접적으로 코딩하는 사람은 많지 않을것이다. 왜냐하면 어렵고 그렇게 쉬운 작업이 아니기 때문이다. 하지만 자바 9에 들어서면서 플로우 API의 추가와 발전은 자바의 동시성과 병렬성을 한층 높여주는 계기를 만들어 주었다. 이제부터는 자바가 동시성과 병렬성을 구현하기 위해 생각한 컨셉과 사상을 알아 볼 것이다.
1.
Thread, Future, 자바가 풍부한 동시성 API를 제공하도록 강요하는 진화의 힘
2.
비동기 API
3.
동시 컴퓨팅의 박스와 채널 뷰
4.
CompletableFuture 콤비네이터 박스를 동적으로 연결
5.
리액티브 프로그래밍용 자바 9 Flow API의 기초를 이루는 발행 구독 프로토콜
6.
리액티브 프로그래밍과 리액티브 시스템
최근 소프트웨어를 개발 방법을 획기적으로 뒤집는 두가지 추세가 존재한다. 첫 번째는 애플리케이션을 작동시키는 하드웨어와 관련된 것이고 두 번째는 여러 애플리케이션을 합쳐 하나의 애플리케이션으로 만드는 것이다.
•
하드웨어의 발전
•
여러 소프트웨어들의 조합 (매시업 형태)
두 가지 형태 중 우리는 매시업 형태에 대해서 유의 깊게 생각해볼 것 이다. 만약 여러 애플리케이션을 합쳐서 하나의 서비스를 제공한다고 생각해보자. 예를 들어 우리는 영국의 축구 뉴스를 수집하고 번역하여 긍정적인 기사와 부정적인 기사의 수와 분석을 보여주는 애플리케이션을 개발한다고 가정해보자.
1.
영국의 축구 일간지 정보 크롤링
2.
축구 뉴스, 일간지 등의 정보 번역 (구글 번역 API)
3.
통계 및 분석 API (다른 전문 통계 및 분석 API)
4.
화면 보여주기
이러한 형태로 우리의 애플리케이션을 구성할 수 있다. 하지만 여기서 중요한 점은 애플리케이션 자체에 국한된 API가 아닌 외부 구글 번역 API, 분석 API 두 가지를 사용했다. 이러한 매시업 형태의 애플리케이션을 개발하게 된다면 몇 가지 문제가 발생할 수 있다.
•
외부 API의 느린 반응, 응답
•
응답을 기다리는 동안의 자원 낭비
•
외부 API에서 발생하는 오류
•
외부 API와 자체 비즈니스로직의 호환 등
이 장에서는 응답을 기다리는 동안의 자원 낭비에 대응 할 수 있는 프로그래밍 방법의 기초 컨셉을 배워볼 것이다.
정리
•
자바의 동시성 지원은 계속 진화하고 있다. 스레드 풀은 보통 유용하지만 블록되는 태스크가 많다면 다시 생각해보자.
•
메서드를 비동기 (결과를 처리하기전에 반환)로 만들면 병렬성을 추가할 수 있으며 부수적으로 루프를 최적화한다.
•
박스와 채널모델을 이용해 비동기 시스템을 시각화할 수 있다.
•
자바 8 CompletableFuture 클래스와 자바 9 플로우 API 모두 박스와 채널 다이어그램으로 표현 할 수 있다.
•
CompletableFuture 클래스는 한 번의 비동기 연산을 표현한다. 콤비네이터로 비동기 연산을 조합함으로 Future를 이용할 때 발생했던 기존의 블로킹 문제를 해결 할 수 있다.
•
플로우 API는 발행-구독 프로토콜, 역압력을 이용하면 자바의 리액티브 프로그래밍의 기초를 제공한다.
•
리액티브 프로그래밍을 이용해 리액티브 시스템 즉, 반응성, 회복성, 탄력성을 가진 시스템을 구현할 수 있다.