studybook
  • Introduction
  • 실무 하며 깨닫는 부분 정리
    • 옵션에 대해서
    • 코드 작성의 순서
    • 자바 프로그램에 문제가 생겼다면
    • 장애 대처법
  • Logstash, Beats 정리
  • Zookeeper 정리
  • Message Queue 정리
    • RabbitMQ 삽질
  • Java 관련 정리
    • Java Primitive Wrapper class
    • Java NIO
    • Java8 Double colon operator
    • Effective Java
      • 4장
      • 5장
      • 6장 - Enum, Annotation
      • 7장 - Method
      • 8장 - 프로그래밍 일반
      • 9장 - Exception
    • Java8 Lambda expression
    • JDBC
    • Linux에서 WatchService 이상동작
  • Spring 관련 정리
    • Spring Bean init, destroy 순서
    • Spring Async Controller
    • Spring Executable jar 웹 개발 및 배포
    • Spring Boot Font 배포 에러
    • Spring AOP
      • Spring AOP로 모든 Request 로그 남기기
    • Spring Cache
    • Spring Cloud
      • Consul로 spring 설정 관리하기
    • Spring Test
      • Spring Test DirtiesContext
      • Spring Test MockBean, SpyBean
      • Spring Test Dynamic @Scheduled
    • Spring JDBC
    • Spring Validation
    • Spring Transaction Management
      • Spring with JTA 삽질
    • Spring에서 효율적으로 Static resource 관리하기
    • Zuul을 사용해서 Spring Reverse proxy 만들기
    • Spring Security
    • 스프링 어노테이션이 안 먹힐 때 의심해볼만한 것
    • Spring Data
    • Spring Webflux
      • Tobi 강연
  • 코드 리팩토링
    • 한번에 하나씩
  • 지속적 통합 (CI)
    • Jenkins pipeline 삽질기
  • Log Aggregator 정리
    • Flume 테스트
    • Fluentd 테스트
  • Web Socket 정리
  • Akka
    • Actor 모델
    • Supervision
  • IE 8 대응 정리
  • 함수형 프로그래밍
    • 모나드
  • Netty
    • Netty 기본 예제
    • Netty 주요 특징
    • Netty 부트스트랩
    • Netty 채널 파이프라인, 코덱
    • Netty 이벤트 모델
    • Netty 바이트 버퍼
  • 스칼라 관련 정리
    • Maven으로 컴파일하기
    • Scala def 괄호 여부의 차이
    • 스칼라 function, method 차이점
    • ScalaTest와 Spring 연동하기
    • Programming in Scala
  • J2S 컨퍼런스
  • Android
    • 테스트
    • NDK
  • DDOS
  • HTTP
  • HttpClient
  • Container
    • Image 개요
    • cri-o
    • kata containers
    • Open Container Initiative Image
    • Buildkit
  • Github pages
  • Static Website
  • Webhook
  • Service Discovery Tools
    • Etcd
    • Eureka
    • Consul
      • ACL
    • 비교
  • React
    • JSX
    • React Element
    • Components, Props
    • State, Lifecycle
    • Handling Event
    • Flux
  • Vagrant
    • SSH 접속
  • Linux
    • Systemd
    • Alternatives
  • Messaging protocols
    • XMPP
    • AMQP
  • Windows
    • Windows10 내장 우분투에 ssh 클라이언트로 접속하기
    • Windows10 Hyper-V와 Virtual Box가 충돌을 일으켰을 때
    • Hyper-V 기반 docker에서 Shared Drives 설정 실패할 때
    • 윈도우 개발환경 설정
    • Docker desktop 없이 docker 환경 세팅하기
    • UWP 앱을 항상 관리자권한으로 실행하는 바로가기 만들기
  • Spring camp 2017
    • Project Reactive
    • 이벤트 소싱
    • CQRS
  • Spring webflux
  • 리액티브 프로그래밍
  • Linux Settings
    • 홈서버 백업 및 복구기
    • 홈서버 트러블슈팅
  • Kubernetes
    • k3s 설치 및 삽질
    • pod resources
    • Argo workflow
    • 트러블 슈팅
      • Kubernetes namespace의 phase가 Terminating에서 멈춰있을 때
    • 쿠버네티스 마스터
    • Knative
    • Knative Pipeline
    • Aggrerated API server
    • Accessing the API
      • Authenticating
  • Sonarqube
  • HTTP/2
  • Go
    • Go Module
    • Go dependency injection
    • Go Error handling
    • Go in Action
      • 3장 패키지
      • 4장 배열, 슬라이스, 맵
      • 5장 GO의 타입 시스템
      • 6장 동시성
      • 7장 동시성 패턴
      • 8장 표준 라이브러리
      • 9장 테스트와 벤치마킹
    • Go Channel 사용법
  • Cloud Native
Powered by GitBook
On this page
  • Callable
  • 예제
  • 내부 동작
  • 유의점
  • DeferredResult
  • 예제
  • WebAsyncTask
  • Exceptions
  • Interceptor
  1. Spring 관련 정리

Spring Async Controller

Spring으로 들어오는 Request를 비동기로 처리하여 돌려주는 방법

Spring MVC 3.2부터 추가됨

Callable

예제

@RestController
public class AsyncController {
  @Autowired
  AsyncService asyncService;

  @RequestMapping(method=RequestMethod.GET, path="/tests")
  public Callable<List<String>> readTests() {
    return asyncService::getTests;
  }
}
  1. Callable을 return

  2. Callable 작업이 모두 처리되면 결과값이 Response로 돌려줌

내부 동작

유의점

  • Callable은 기본적으로 SimpleAsyncTaskExecutor에서 실행됨

    • Production에선 환경에 알맞게 AsyncTaskExecutor을 세팅할 필요성이 있음

    • Callable을 사용하면서 AsyncTaskExecutor을 바꾸기 위해선 RequestMappingHandlerAdapter을 직접 바꾸는 방법밖에 없음

DeferredResult

예제

@RestController
public class AsyncController {
  @Autowired
  AsyncService asyncService;

  @RequestMapping(method=RequestMethod.GET, path="/tests")
  public DeferredResult<List<String>> readTests() {
    final DeferredResult<List<String>> result = new DeferredResult<>();
    asyncService.getTestsEventually(result);

    return result;
  }
}
@Service
public class AsyncService {
  private static Logger logger = LoggerFactory.getLogger(AsyncService.class);
  private static final String TEST_STRING = "test";
  private List<String> testRepository;

  public AsyncService() {
    testRepository = new ArrayList<>();
    for (int i = 0; i < 5; i++) {
      testRepository.add(TEST_STRING + i);
    }
  }

  @Async
  public void getTestsEventually(final DeferredResult<List<String>> deferredResult) {
    if (logger.isDebugEnabled()) {
      logger.debug("return test list");
    }

    deferredResult.setResult(testRepository);
  }
}
  1. DeferredResult를 만들어서 return

  2. 비동기 작업을 처리하고나서 직접 DeferredResult 객체에 DeferredResult.setResult()로 결과값을 넘겨주면 Response로 돌려줌

WebAsyncTask

@RestController
public class AsyncController {
  @Autowired
  AsyncService asyncService;

  @RequestMapping(method=RequestMethod.GET, path="/tests")
  public WebAsyncTask<List<String>> readTestList() {
    return new WebAsyncTask<>(null, "asyncTaskExecutor", asyncService::getTests);
  }
}
  • Callable을 돌려줄 때와 사용법 및 내부 동작은 동일. Callable을 WebAsyncTask로 한번 더 감싸주기만 하면 됨.

  • Callable에 비해서 Timeout, Task Executor 설정이 쉬운게 차별점

Exceptions

  • Callable 내부에서 발생한 Exception도 HandlerExceptionResolver에 의해서 처리가 되므로 똑같이 @ExceptionHandler을 사용하면 됨

Interceptor

  • HandlerInterceptor의 postHandle, afterCompletion은 비동기 작업이 모두 끝나고 호출됨. 대신에 AsyncHandlerInterceptor 인터페이스의 afterConcurrentHandlingStarted 메소드를 구현하여 사용할 수 있음

PreviousSpring Bean init, destroy 순서NextSpring Executable jar 웹 개발 및 배포

Last updated 7 years ago

1. Request가 들어옴 2. DispatcherServlet가 해당 path에 알맞는 Controller method를 찾아 요청하고, Callable을 돌려받음 3. DispatcherServlet은 Callable을 비동기 처리하도록 WebAsyncManager에 요청함 4. WebAsyncManager는 Callable을 특정 TaskExecutor에 할당하여 비동기 처리 5. Callable의 작업이 완료되면 WebAsyncManager로 결과값을 돌려줌 6. WebAsyncManager는 DispathcerServlet에게 dispatch 요청 7. DispatcherServlet은 WebAsyncManager에게서 결과값을 받은 다음 적절하게 처리하여 Response를 돌려줌