티스토리 뷰

개발-탐구

Java의 Structured Concurrency

ohksj77 2025. 11. 1. 15:06

해결하고자 하는 기존 멀티스레드 방식의 문제점

  1. 하나의 작업이 실패할 경우 자동으로 일괄 취소할 수 없음(각 수동 예외처리 필요)
  2. 여러 작업 간의 명확한 관계가 표현되지 않음

어디로 튈지 모르며 일괄 취소가 어려운 기존의 멀티스레드 프로그래밍 방식

 

Java Structured Concurrency 소개

  • 동시성 작업을 부모-자식 관계로 구조화하여 작업 그룹을 하나의 단위로 관리하는 프로그래밍 패러다임
    • 오류 처리, 리소스 관리, 취소 기능을 단순화하여 안정적이고 예측 가능한 동시성 코드 작성을 목표로 함
  • 여러 스레드 작업들이 작업 완료 시 모두 동일한 위치로 돌아온다는 특징
  • Jdk25 기준으로 5th Preview 상태

 

장점

  1. 명확성: 일관된 패턴으로 멀티 스레드 코드 작성 가능
  2. 예외 처리: 하나의 작업 실패로 다른 작업 취소 용이
  3. 취소 전파: 상위 작업의 취소로 모든 하위 작업 취소 가능
  4. 오류 원인 추론: 스레드 덤프에 더욱 명확히 작업의 계층구조 표시

 

전체 구조

Java25 기준 예제

  • scope 을 열어 내부에서 동시성 작업 수행
  • scope.fork() 를 통해 비동기 작업 실행
  • scope.join() 을 통해 원하는 방법으로 비동기 작업 일괄 처리
    • 활용한 Joiner에 따라 달라지는 부분
  • 이후 작업 결과 처리 수행

 

도식화한다면, 다음 그림과 같이 진행된다.

 

Joiner 종류와 그에 따른 처리

StructuredTaskScope.open() 의 인자로 원하는 Joiner를 넘겨줌

  • scope 내의 작업 처리 방식과 scope.join() 반환 타입을 정함
  • 안넘겨주면 기본 값(awaitAlSuccessfulOrThrow)이 활용됨

 

몇가지 Joiner 예시

  • awaitAlSuccessfulOrThrow: 모든 scope 내의 작업이 성공하면 return, 작업 실패 시 나머지 작업 취소

  • alSuccessfulOrThrow: awaitAlSuccessfulOrThrow 와 동일하게 처리하지만 return 타입이 존재

  • anySuccessfulResultOrThrow: 하나의 scope 내의 작업이 성공하면 즉시 반환(나머지 작업 취소)

  • awaitAll: 성공/실패에 관계없이 모든 작업이 완료한 이후 반환

 

Structured Concurrency 활용 방안

  • 부모 scope 내에서 fork(생성) 한 작업 내에서 자식 scope를 생성하는 중첩된 구조일 때 다음 유즈케이스에 유용
    • 부모가 실패 시 자식의 작업까지 모두 중단
    • 자식의 작업 하나 실패 시 부모의 작업 모두 중단
    • 위 두 유즈케이스를 CompletableFuture로 처리하기는 꽤나 복잡할 것
  • 하나의 작업이 실패하면 다른 작업을 멈추어 리소스 낭비를 쉽게 방지
    • 특히 비동기 작업이 무거운 작업이라 중간에 일괄로 멈추면 도움이 되는 케이스에 유용
  • 여러 곳에서 데이터를 가져와야 하며 성능이 중요해 처음 가져온 데이터를 활용하는 케이스에 유용
    • 위 Joiner 중 anySuccessfulResultOrThrow 활용
  • 복잡한 try-catch 문을 단순화하여 유지보수성을 높이고 싶은 경우에 유용
    • 코드가 간결해지며 여러 Joiner 처리 방식에도 일관된 스타일로 활용 가능

 

활용 시 유의할 점

  • 작업 취소 란 실행 중인 작업이 멈추는 것일 뿐, 이미 반영된 작업이 롤백되지는 않는다.
    • 타 작업 실패로 작업 취소 시 Thread.inturrupt() 로 신호를 주기 때문에 Spring Data 의 트랜잭션 기본 설정으로는 자동 롤백이 되지 않을 것이다.
    • 트랜잭션이 아니더라도 heap 메모리에 어떤 값을 바꾼다고 하면 이미 처리된 작업이 롤백되지는 않는다.

 

참고한 레퍼런스, 이미지 출처

https://belief-driven-design.com/looking-at-java-21-structured-concurrency-39a81/

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2026/03   »
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
글 보관함