Spring Camp 2017 1일차

스프링 캠프 2017 1일차 정리

Posted by kingbbode on April 22, 2017

Recently by the same author:


3년차 웹 개발자

4년차로 접어든 웹 개발자의 3년차 늦은 회고

You may find interesting:


SpringOne Tour Seoul - Spring Cloud Gateway

스프링 원 투어 서울 컨퍼런스 중 정윤진님의 Spring Cloud Gateway 세션


스프링캠프 2018-Consumer Driven Contract

Consumer Driven Contract 기법을 활용한 마이크로서비스 API의 진화

키노트

35년 간의 발전

  • PC의 등장
  • 대용량 장치의 등장
  • 네트워크(인터넷)의 등장
  • PC를 휴대 가능한 시대

컴퓨터가 사람에게 스며들고 있다

Session 1. 프로세스, 스레드, 리액티드

Thread 일반

  • 코드상 정의된 데이터가 Process 영역에서 Heap, Stack 영역을 확보하며 Run

  • 가상 메모리는 프로세스 간 주소공간을 논리적으로 차단

  • 하나의 프로세스 안에서 Thread가 발생

스레드 장점

  • 스레드 생성에 비용이 필요하지만 프로세스를 만드는 것보다 저렴
  • 스레드들간 HEAP 메모리 공간 공유

Context Switching

  • 스케줄러에 의한 Thread 실행 관리

  • 오버헤드가 발생할 수 있다

    • cpu register에 등록해놓고 재사용하기 때문

Process vs Thread

  • L1, L2, L3 등 캐시의 등장으로 위 문제를 어느정도 해결해주어 멀티 스레드가 각광을 받기 시작!

ThreadPool

  • 미리 만들어놓고 재사용
  • 스레드의 수를 제한

Thread in JVM

  • 추상화 레벨이 높아 속도가 좋지 않음

비동기가 필요한 상황

  • 여러 API를 호출하는 과정이 동기방식으로 처리된다면 각 요청의 부하를 모두 겪게 됨.

  • 비동기 방식이라면 이런 부하가 필요하지 않음.

Java 비동기 API

  • Thread(Runable)

    • 동작 순서 처리 어려움
    • 결과 값을 받아오기 어려움
  • Future(Callable)

    • 쉽게 비동기 요청을 제어 가능
    • 그러나 Callback Hell을 만날 수 있음
  • CompletableFuture(Future, CompletionStage\)

    • Java8부터 등장
    • 테스크 간의 순서를 체이닝 방식으로 해결

NIO

  • ThreadPool이 꽉차는 현상은 아직 풀지 못했다.
    • Non-Blocking 으로 해결할 수 있지 않을까?

Nonblocking I/O

  • Selector에 의해 단일 스레드로 처리 가능
  • DeferredResult

Reactive에 대한 의문

  • event programming 방식에서 절차형으로 프로그래밍하려고 하니 오히려 어려운게 아닐까?

정리

  • 학습 범위를 정의하고 좁혀보자.
    • react streams
    • spring framework 5

Session 2. Async & Spring

동기

  • A와 B가 시작시간 또는 종료시간이 일치하면 동기

블록킹, 논블록킹

  • 동기,비동기와는 관점이 다름
  • 내가 직접 제어할 수 없는 대상을 상대하는 방법

세분화하여 동기/비동기, 블록킹/논블록킹을 정의하는 자세가 필요

@Async

  • 반환 타입이 void, Future, ListenableFuture, CompletableFuture만 지원

SimpleAsyncTaskExecutor

  • @Asyanc가 사용하는 기본 TaskExecutor

    • SimpleAsyncTaskExecutor(기본)
    • Executor
    • ExecutorService
    • TaskExecutor

      • Core

      • Queue

      • Max

  • 쓰레드 풀 아님

  • @Async를 본격적으로 사용한다면 실전에서 사용하지 말 것

DeferredResult

@Async와 DeferredResult

ListenableFuture vs DeferredResult

  • 기본 비동기 작업은 ListenableFuture가 더 쉽다.
  • ListenableFuture는 조합이 어렵다(콜백의 중첩). 그래서 DeferredResult를 사용하는 것이 좋다.

CompletableFuture vs DeferredResult vs ListenableFuture

  • CompletableFuture가 더 간결하고, 쉽다.

결론은 CompletableFuture가

REST

RestTemplate

  • 동기방식

AsyncRestTemplate

  • 논블록킹 IO 라이브러리와 함께 써야함
  • 조합을 하려면 ListenableFuture의 complete와 exceptionally를 사용하여 CompletableFuture로 변환

결론

  • 비동기 작업과 API 호출이 많은 @MVC 앱이라면

    • @MVC
    • AsyncRestTemplate + 논블록킹 IO 라이브러리
    • @Async와 적절한 TaskExecutor
    • ListenableFuture, CompletableFuture
  • 사용하는 이유?

    • 모르면 쓰지마라
    • 설명할 수 있어야 함
    • 증명할 수 있어야 함
  • 비동기 스프링 기술의 단점?

    • 모르면 쓰지마라
    • 잘못 쓰면 코드 복잡
    • 디버깅 힘들고
    • 혜택도 없음

Session 3. Spring Web Flux

용도

  • 비동기-논블록킹 리액티브 개발
  • 자원을 낭비하지 않고, 작업을 처리할 수 있는 고성능 웹 애플리케이션

새로운 요청-응답 모델

  • 서블릿 스택을 버림
  • ServerRequest, ServerResponse

지원 웹 서버/컨테이너

  • Servlet 3.1+ (Tomcat, Jetty, ..) - 비동기-논블록킹
  • Netty
  • Undertow

함수형 Web Flux

요청 처리 방식

  • 매핑
    • RouterFunction
  • 바인딩, 핸들링, 응답
    • ServerResponse를 리턴하는 HandlerFunction

장점

  • 모든 웹 요청 처리 작업을 명시적인 코드로 작성
  • 함수 조합을 통한 편리한 구성, 추상화에 유리
  • 테스트 작성의 편리

단점

  • 함수형 스타일의 코드 작성이 편하지 않으면 코드 작성과 이해가 모두 어려움

MVC Web Flux

기존과 같지만 Output이 다름

  • Output : Mono or Flux

RequestBody

  • 바인딩 (JSON, XML)
  • Mono 컨테이너 방식이 허용

Flux는 스트림을 받을 수 있음.

ResponseBody 리턴 타입

  • T
  • Mono
  • Flux

Web Flux + Reactive

  • Web Flux만으로는 성능이 좋아지지 않는다.

개선할 블록킹 IO

  • 데이터 액세스 리포지토리

    • 현재는 답이 없다.

    • JDK 10에서 Async JDBC가 등장할 수도 있음..

    • 대안

      • JPA에서 @Async + CompletableFuture
      • Mono로 리턴(fromCompletionStage)
    • MongoDB, Cassandra, Redis 는 Non-Blocking을 지원

  • HTTP API 호출

    • WebClient 지원
      • AsyncRestTemplate의 리액티브 버전

Session 4. Spring Cloud Data Flow

  • 필요할 때마다 배포하는 것이 모아서 한번에 배포하는 것보다 위험성이 작다.

데이터 플로우가 하나로 묶여있다면?

  • 업그레이드
  • 확장
  • 재배포
  • 업데이트
  • 마이그레이션
  • 분산 처리

많은 영역에서 문제가 발생

spring cloud stream

스프링 부트 어플리케이션을 통해 data flow를 지원하는 도구

  • spring boot starter pack 제공

  • RabbitMQ, kafka, Redis 등 연동을 위한 클래스를 제공

  • pipeline을 제공

  • deploy 제공

  • ui 제공