일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- #심플즈 크랙미
- #리버싱
- springframework
- #abex크랙미4번
- #파밍
- #크랙미 9번
- #크랙미4번
- #크랙미 5번
- Easy
- java
- #크랙미
- java8
- #크랙미 10번
- leetcode
- #심플즈
- GraphQL
- #크랙미2번
- #고클린
- Spring
- #보안이슈
- #abex크랙미
- #크랙미3번
- #abex
- 리버싱
- #보안뉴스
- Today
- Total
Halo World
JAVA 8 비동기 처리 (@Async) 본문
- 자바 비동기 처리의 방법 / 장점
- Async 처리시 주의사항, 고려사항, Pool 설정이유, 단점
- Async 예외처리
- Future와 CompletableFuture의 차이점
Java 비동기 처리 방법
1. @Async annotation 으로 간단하게 처리 가능. 클래스에 @EnableAsnyc를 추가하고, 비동기로 제공하고자 하는 메소드에 @Async 어노테이션을 추가하는 방식으로 가능함. @Async의 기본 설정은 SimpleAsyncTaskExecutor 이기 때문에 thread 관리를 위해서는 별도로 구성해주어야 함
2. Async thread pool 설정을 위한 별도의 @Configuration 클래스를 만들고, 해당 클래스에 @EnableAsync 어노테이션 추가. (기존 클래스에서는 제거). Config 클래스 내부에 ThreadPoolTaskExecutor를 반환하는 @Bean 메소드를 만들고, thread pool 설정을 해준다. Async 메소드를 제공하는 클래스에서는 해당 Bean의 이름을 통해 가져다 쓸 수 있다. (ex) @Async("beanName")
Java 비동기 처리 장점
@Async 사용을 통해 method 수정없이 처리 가능
Java @Async 사용시 고려사항 및 주의사항
- AOP의 특성 및 제약을 주의해서 사용해야 함 (비동기 메소드와 같은 클래스 내의 다른 메소드에서 비동기 메소드를 호출한다면, AOP proxy를 우회하기 때문에 비동기로 동작하지 않음)
Spring AOP의 두가지 모드 1. Proxy 모드 : Spring AOP의 기본 모드이며, 순수한 자바 코드로 AOP 구현한다. Aspect를 특정 method와 엮는 작업(Weaving)이 자바 코드가 실행되는 시점이 이뤄진다. RTW(Run Time Weaving)으로 처리된다고 표현하고, 특정 method가 호출되는 런타임 시기에 해당 method의 Aspect 처리 여부가 결정된다. 2. AspectJ 모드 : LTW(Load Time Weaving) - 클래스를 로드하는 과정에서 weaving, CTW(Compile Time Weaving) - compile 시에 weaving (ex) @EnableAsync(mode=AdviceMode.ASPECTJ) 와 같은 어노테이션으로 AspectJ 모드를 지정해주어 사용 가능 |
http://dveamer.github.io/java/SpringAsyncAspectJ.html
https://velog.io/@gwontaeyong/Spring-AOP%EC%97%90%EC%84%9C-Proxy%EB%9E%80 (Spring AOP 원리)
- public method에만 사용 가능 (메소드가 public 이어야 프록시가 될 수 있음)
- Thread가 분리되므로 HttpServletRequest, Session 접근 불가
ThreadPool 설정 이유, 단점
- 사용 이유 : 쓰레드 풀을 미리 생성해 둠으로써 프로그램 동작시 쓰레드를 생성하는데 별도의 딜레이가 필요하지 않고, 쓰레드를 재사용하여 시스템 자원을 줄일 수 있다. 다수의 사용자 요청을 빠르게 처리할 수 있다.
- 단점 : 쓰레드 갯수를 지나치게 많이 설정하는 경우 메모리 낭비가 발생할 수 있다.
Async 예외 처리
- CompletableFuture로 해당 요청이 성공한 경우 true를, 실패한 경우 또는 exception이 발생한 경우 false를 return 하고, Async 메소드를 호출하는 클라이언트 쪽에서 callback 함수를 통해 반환값에 따른 처리를 해줄 수 있다.
- CompletableFuture의 supplyAsync()를 통해 발생한 exception을 클라이언트 쪽으로 반환해 줄 수 있다.
(https://javachoi.tistory.com/169)
Future vs CompletableFuture
Future에서 반환값을 얻기 위해 사용하는 get() 메소드는 blocking 메소드이고, Future은 복잡한 연산을 하기 힘들다는 한계가 있음
CompletableFuture에서 제공하는 메소드가 많고, 비동기 처리 중 발생한 exception을 전달하는 것도 가능함
[참고]
http://dveamer.github.io/java/SpringAsync.html
https://jongmin92.github.io/2019/03/31/Java/java-async-1/
https://pjh3749.tistory.com/280
'개발자 인터뷰 준비' 카테고리의 다른 글
[JAVA] SOLID 원칙 (0) | 2021.06.19 |
---|---|
Twitter 시스템 설계 (0) | 2021.06.13 |
AWS SQS vs Kafka vs RabbitMQ (0) | 2021.06.09 |
Spring 버전별 차이 / 개선점 (0) | 2021.06.09 |
JAVA 버전별 개선점 (7, 8, 11) (0) | 2021.06.09 |