반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- 스프링핵심원리
- 스프링
- 카카오 면접
- 알고리즘
- 스프링부트
- 카카오
- 오블완
- 자바
- 스프링 핵심원리
- 예제로 배우는 스프링 입문
- java
- Effective Java
- k8s
- JavaScript
- kubernetes
- ElasticSearch
- 이차전지관련주
- Effective Java 3
- Sort
- 이펙티브자바
- Spring
- 코딩테스트
- 자바스크립트
- 엘라스틱서치
- effectivejava
- 김영한
- 이펙티브 자바
- 티스토리챌린지
- 클린아키텍처
- 알고리즘정렬
Archives
- Today
- Total
Kim-Baek 개발자 이야기
CompletableFuture 란 무엇일까 본문
CompletableFuture는 Java에서 비동기 프로그래밍을 지원하기 위해 제공되는 클래스로, 주로 멀티스레드 환경에서 비동기 작업을 더 쉽게 관리하고 체이닝(연쇄 호출)과 조합을 가능하게 합니다. 이는 Future 인터페이스의 한계를 극복하기 위해 Java 8에서 도입되었습니다.
1. CompletableFuture란 무엇인가요?
CompletableFuture는 비동기적으로 작업을 수행하고, 결과가 준비되면 콜백을 호출하거나 다른 작업을 이어서 처리할 수 있도록 설계된 클래스입니다.
- 비동기: 작업이 완료될 때까지 기다릴 필요 없이 바로 다음 코드를 실행할 수 있음.
- 완료 가능: 개발자가 작업 결과를 직접 설정하거나, 실패를 명시적으로 알릴 수 있음.
- 체이닝 가능: 여러 작업을 순차적으로 연결해서 처리 가능.
2. 왜 CompletableFuture를 사용할까요?
기존의 Future 인터페이스는 다음과 같은 제한이 있습니다:
- 작업 완료를 기다리려면 get() 메서드를 호출해야 하는데, 이는 블로킹(대기) 방식임.
- 완료 후 추가 작업(콜백)을 설정할 수 없음.
- 여러 Future 작업을 쉽게 조합(combine)하기 어려움.
CompletableFuture는 이러한 제한을 해결하며 다음과 같은 장점을 제공합니다:
- 비동기 작업 실행 및 결과 처리.
- 비블로킹 방식으로 작업 상태 확인 및 처리.
- 여러 작업을 조합하여 더 복잡한 로직 구현 가능.
3. 주요 기능과 사용법
(1) 비동기 작업 시작
CompletableFuture<Void> future = CompletableFuture.runAsync(() -> {
System.out.println("비동기 작업 실행 중...");
});
(2) 결과 반환 작업
CompletableFuture<String> future = CompletableFuture.supplyAsync(() -> {
return "Hello, CompletableFuture!";
});
future.thenAccept(result -> System.out.println("결과: " + result));
(3) 작업 체이닝
비동기 작업이 완료된 후 추가 작업을 연결:
CompletableFuture.supplyAsync(() -> {
return "첫 번째 작업";
}).thenApply(result -> {
return result + " -> 두 번째 작업";
}).thenAccept(finalResult -> {
System.out.println(finalResult); // 출력: 첫 번째 작업 -> 두 번째 작업
});
(4) 여러 작업 조합
CompletableFuture<String> future1 = CompletableFuture.supplyAsync(() -> "Hello");
CompletableFuture<String> future2 = CompletableFuture.supplyAsync(() -> "World");
future1.thenCombine(future2, (result1, result2) -> result1 + " " + result2)
.thenAccept(System.out::println); // 출력: Hello World
(5) 예외 처리
예외가 발생했을 때 대처:
CompletableFuture.supplyAsync(() -> {
if (true) throw new RuntimeException("에러 발생!");
return "정상 완료";
}).exceptionally(ex -> {
System.out.println("예외 처리: " + ex.getMessage());
return "기본값";
}).thenAccept(System.out::println);
4. 언제 사용하면 좋을까요?
- 비동기 작업이 필요할 때 (예: 네트워크 요청, 파일 I/O, 데이터베이스 작업).
- 작업 완료 후 추가 작업이 필요할 때.
- 여러 비동기 작업을 동시에 수행하고 그 결과를 결합할 때.
5. 장점과 단점
장점
- 간단하고 직관적인 비동기 프로그래밍 지원.
- 콜백 지옥(callback hell) 방지.
- 다중 작업 처리 및 예외 처리 용이.
단점
- 코드가 복잡해질 수 있음 (특히 많은 체이닝이나 조합이 있을 때).
- 디버깅이 어려울 수 있음 (비동기 작업은 호출 순서가 명확하지 않기 때문).
6. 결론
CompletableFuture는 Java에서 비동기 작업을 효율적으로 처리하기 위한 매우 강력한 도구입니다. 특히 멀티스레딩이나 병렬 처리가 필요한 경우, 더 간단하고 우아하게 코드를 작성할 수 있도록 도와줍니다. 익숙해지면 동기 코드처럼 읽히는 비동기 코드를 작성할 수 있게 됩니다!
반응형
'개발 > java basic' 카테고리의 다른 글
자바 리플렉션이란 (0) | 2024.11.24 |
---|---|
리액티브 프로그래밍이란 (0) | 2024.11.17 |
제네릭 타입 소거 (컴파일/런타임) (0) | 2024.11.16 |
일급 컬렉션이란? (0) | 2024.11.13 |
제네릭이란 무엇일까 (0) | 2024.11.12 |
Comments