Skip to content

[Refactor] 가상 스레드 도입을 통한 비동기 처리 최적화#251

Merged
jihukimme merged 2 commits intodevelopfrom
feature/async-optimization
Feb 13, 2026
Merged

[Refactor] 가상 스레드 도입을 통한 비동기 처리 최적화#251
jihukimme merged 2 commits intodevelopfrom
feature/async-optimization

Conversation

@jihukimme
Copy link
Member

@jihukimme jihukimme commented Feb 12, 2026

📝 작업 내용

1. 배경 및 목적

  • 사용자 응답성 개선: 수십 초가 소요되는 장기 실행 워크플로우를 비동기로 전환하여 사용자 대기 시간 단축 및 Tomcat 스레드 점유 최소화.
  • I/O 효율 극대화: Java 21 Virtual Threads를 도입하여 I/O 블로킹 구간의 OS 스레드 낭비 제거.
  • 시스템 안정성 확보: 가상 스레드의 경량성을 활용하되, **세마포어(Semaphore)**를 통해 DB 커넥션 고갈 및 연쇄 장애 예방.

2. 주요 변경 사항

가상 스레드 기반 비동기 인프라 구축 (AsyncConfig)

  • SimpleAsyncTaskExecutor에 가상 스레드 설정을 적용하여 무거운 플랫폼 스레드 의존성 제거.
  • 고정된 스레드 풀(Pooling) 방식에서 벗어나, 필요 시마다 경량 스레드를 생성하는 가상 스레드 방식 도입.

세마포어 기반 유량 제어 (SemaphoreTaskDecorator)

  • DBCP 보호: DB 커넥션 풀 사이즈(maximum-pool-size)와 연동된 세마포어를 구현하여 비동기 작업의 최대 동시 실행 수 제한.

로그 컨텍스트 전파 및 데코레이터 체이닝

  • ContextPropagatingTaskDecoratorSemaphoreTaskDecorator를 결합.
  • MDC(로그 컨텍스트) 복사유량 제어를 동시에 수행하여 비동기 전 구간의 트레이싱 가시성 확보.

비동기 예외 핸들링 (AsyncUncaughtExceptionHandler)

  • 비동기 작업 중 발생하는 예외를 추적하기 위한 전역 핸들러 구현 (Silent Failure 방지).

3. 기대 효과

  • 처리량(Throughput) 향상: I/O 대기 시 OS 스레드를 즉시 반납함으로써 동일 자원 대비 대량의 요청 처리 가능.
  • DB 리소스 안정성: 비동기 스레드가 폭증하더라도 세마포어가 DB 커넥션 한도 내에서 유량을 조절하여 시스템 마비 방지.
  • 유지보수성: 리액티브 라이브러리(WebFlux 등) 도입 없이 익숙한 동기식 명령형 코드만으로 고성능 비동기 처리 달성.

🔗 관련 이슈

  • Closes #이슈번호
  • Related to #이슈번호

💬 추가 요청사항


✅ 체크리스트

코드 품질

  • 커밋 컨벤션 준수 (feat/fix/docs/refactor 등)
  • 불필요한 코드/주석 제거

테스트

  • 로컬 환경에서 동작 확인 완료
  • 기존 기능에 영향 없음 확인

배포 준비

  • 환경변수 추가/변경사항 문서화
  • DB 마이그레이션 필요 여부 확인
  • 배포 시 주의사항 없음

@jihukimme jihukimme self-assigned this Feb 12, 2026
@jihukimme jihukimme changed the title [Refactor] 가상 스레드(Virtual Thread) 도입을 통한 비동기 처리 최적화 [Refactor] 가상 스레드 도입을 통한 비동기 처리 최적화 Feb 13, 2026
@jihukimme jihukimme merged commit 63f11dc into develop Feb 13, 2026
6 checks passed
@jihukimme jihukimme deleted the feature/async-optimization branch February 13, 2026 09:36
@jihukimme jihukimme restored the feature/async-optimization branch February 14, 2026 04:06
@jihukimme jihukimme deleted the feature/async-optimization branch February 14, 2026 04:57
jihukimme added a commit that referenced this pull request Feb 14, 2026
* README.md 작성 및 DTO 네이밍 컨벤션에 맞게 리팩토링 (#239)

* docs: README.md 작성

* refactor: DTO 네이밍 컨벤션에 따라 리팩토링

* refactor: Code Formatting

* 다이어그램 파일명 수정 (#240)

* docs: README.md 작성

* refactor: DTO 네이밍 컨벤션에 따라 리팩토링

* refactor: Code Formatting

* fix: 다이어그램 파일명 수정

* Spring Quartz에 Cluster를 이용한 schedule, workflow 실시간 반영 (#238)

* feat: applcation-develop.yml에 quartz설정 추가

* feat: QuartzConfig

* feat: Quartz에 스케줄 동기화 추가

* feat: ScheduleController

* feat: Schedule 단건조회, 스케줄 활성상태 변경 추가

* feat: ScheduleService

* feat: ScheduleUpdateDto

* feat: workflowController delete,patch,활성화변경, 스케줄 삭제 추가

* feat: workflowMapper 워크플로우 활성화상태 변경 추가

* feat: Schedule Quartz 실시간 반영 관련 내용 추가

* feat: ScheduleManagementE2eTest 작성중

* chore: spotlessApply

* feat: schedule workflow_id unique 조건 제거

* fix: schedule 관련 파일들 schedule 폴더로 이동

* feat: scheduleE2eTest 수정

* fix: 중복 코드 삭제

* fix: 검증코드 workflowservice -> scheduleService로 이동

* fix: 오타 수정

* fix: 정적 메서드로 변경

* fix: 정적 메서드로 변경

* fix: 인증 중복 코드 제거

* fix: hasSchedules collection으로 변경

* chore: import 추가

* chore: spotlessApply

* refactor: DTO 네이밍 변경

---------

Co-authored-by: jihukimme <jihu0210@naver.com>

* docs: 다이어그램 및 시연 영상 업로드

* docs: 시연 영상 유튜브 링크 업로드

* docs: 시연영상 목차 추가

* 목차 및 각 콘텐츠 앵커 링크 도입 (#242)

* docs: ERD 추가 및 시퀀스 다이어그램 경로 수정 (#244)

* 서버 장애 발생으로 인해 중단된 워크플로우 자동 복구 및 이어하기(Resume) 기능 구현 (#246)

* Release v0.1.0-stable (#245)

* README.md 작성 및 DTO 네이밍 컨벤션에 맞게 리팩토링 (#239)

* docs: README.md 작성

* refactor: DTO 네이밍 컨벤션에 따라 리팩토링

* refactor: Code Formatting

* 다이어그램 파일명 수정 (#240)

* docs: README.md 작성

* refactor: DTO 네이밍 컨벤션에 따라 리팩토링

* refactor: Code Formatting

* fix: 다이어그램 파일명 수정

* Spring Quartz에 Cluster를 이용한 schedule, workflow 실시간 반영 (#238)

* feat: applcation-develop.yml에 quartz설정 추가

* feat: QuartzConfig

* feat: Quartz에 스케줄 동기화 추가

* feat: ScheduleController

* feat: Schedule 단건조회, 스케줄 활성상태 변경 추가

* feat: ScheduleService

* feat: ScheduleUpdateDto

* feat: workflowController delete,patch,활성화변경, 스케줄 삭제 추가

* feat: workflowMapper 워크플로우 활성화상태 변경 추가

* feat: Schedule Quartz 실시간 반영 관련 내용 추가

* feat: ScheduleManagementE2eTest 작성중

* chore: spotlessApply

* feat: schedule workflow_id unique 조건 제거

* fix: schedule 관련 파일들 schedule 폴더로 이동

* feat: scheduleE2eTest 수정

* fix: 중복 코드 삭제

* fix: 검증코드 workflowservice -> scheduleService로 이동

* fix: 오타 수정

* fix: 정적 메서드로 변경

* fix: 정적 메서드로 변경

* fix: 인증 중복 코드 제거

* fix: hasSchedules collection으로 변경

* chore: import 추가

* chore: spotlessApply

* refactor: DTO 네이밍 변경

---------

Co-authored-by: jihukimme <jihu0210@naver.com>

* docs: 다이어그램 및 시연 영상 업로드

* docs: 시연 영상 유튜브 링크 업로드

* docs: 시연영상 목차 추가

* 목차 및 각 콘텐츠 앵커 링크 도입 (#242)

* docs: ERD 추가 및 시퀀스 다이어그램 경로 수정 (#244)

---------

Co-authored-by: bwnfo3 <142577603+bwnfo3@users.noreply.github.com>
Co-authored-by: Yousung Jung <jys01012@gmail.com>

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* README.md 업데이트

* feat: 워크플로우 비정상 종료 복구 프로세스 추가 및 Mapper 메서드 확장

* feat: 성공한 Job 확인용 Mapper 메서드 추가 및 워크플로우 실행 로직 수정

* refactor: Code formatting and alignment adjustments across core classes

* refactor: Code formatting and alignment adjustments across core classes

---------

Co-authored-by: bwnfo3 <142577603+bwnfo3@users.noreply.github.com>
Co-authored-by: Yousung Jung <jys01012@gmail.com>

* refactor: 워크플로우 재개(Resume) 로직 개선 및 README 문서 보완 (#248)

* refactor: replace findSuccessfulJobByTraceId with findSuccessfulJobByWorkflowRunId

* refactor: update task output retrieval to use workflowRunId scope and refine query methods

* docs: update README with environment variables, setup, and deployment steps

* refactor: improve code formatting across Workflow services and mappers

* refactor: 통신 기술 스택 변경 (RestTemplate -> RestClient) 및 E2E 테스트 안정화 (#249)

* refactor: replace RestTemplate with RestClient across the codebase

* refactor: adjust JavaDoc formatting for consistency

* refactor: migrate E2E tests from RestTemplate to RestClient

* [Refactor] 가상 스레드 도입을 통한 비동기 처리 최적화 (#251)

* refactor: replace ThreadPoolTaskExecutor with SimpleAsyncTaskExecutor using virtual threads

* refactor: add SemaphoreTaskDecorator for controlling async task concurrency

* Feature/async optimization (#253)

* refactor: replace ThreadPoolTaskExecutor with SimpleAsyncTaskExecutor using virtual threads

* refactor: add SemaphoreTaskDecorator for controlling async task concurrency

* refactor: update MyBatis type-aliases-package to use domain instead of dto

* chore: 장기실행작업(워크플로우)에 대해서만 가상스레드 설정

* chore: increase HikariCP pool size and refine semaphore initialization logic

---------

Co-authored-by: bwnfo3 <142577603+bwnfo3@users.noreply.github.com>
Co-authored-by: Yousung Jung <jys01012@gmail.com>
jihukimme added a commit that referenced this pull request Feb 15, 2026
* refactor: rename asnyc to async in user-service

* test: fix testcontainers connectivity for latest docker version in CI

* refactor: rename asnyc to async and restore CI config to main

* ci: add --no-daemon flag to Gradle commands in CI workflow

* ci: add Docker environment checks and update Gradle e2eTest logging in CI workflow

* ci: add Docker environment checks and update Gradle e2eTest logging in CI workflow

* refactor: simplify E2eTestConfiguration and enhance CI Docker setup

* refactor: enhance E2eTestConfiguration with MariaDB and HikariCP configuration, simplify CI workflow

* [Refactor] 가상 스레드 도입을 통한 비동기 처리 최적화 (#260)

* README.md 작성 및 DTO 네이밍 컨벤션에 맞게 리팩토링 (#239)

* docs: README.md 작성

* refactor: DTO 네이밍 컨벤션에 따라 리팩토링

* refactor: Code Formatting

* 다이어그램 파일명 수정 (#240)

* docs: README.md 작성

* refactor: DTO 네이밍 컨벤션에 따라 리팩토링

* refactor: Code Formatting

* fix: 다이어그램 파일명 수정

* Spring Quartz에 Cluster를 이용한 schedule, workflow 실시간 반영 (#238)

* feat: applcation-develop.yml에 quartz설정 추가

* feat: QuartzConfig

* feat: Quartz에 스케줄 동기화 추가

* feat: ScheduleController

* feat: Schedule 단건조회, 스케줄 활성상태 변경 추가

* feat: ScheduleService

* feat: ScheduleUpdateDto

* feat: workflowController delete,patch,활성화변경, 스케줄 삭제 추가

* feat: workflowMapper 워크플로우 활성화상태 변경 추가

* feat: Schedule Quartz 실시간 반영 관련 내용 추가

* feat: ScheduleManagementE2eTest 작성중

* chore: spotlessApply

* feat: schedule workflow_id unique 조건 제거

* fix: schedule 관련 파일들 schedule 폴더로 이동

* feat: scheduleE2eTest 수정

* fix: 중복 코드 삭제

* fix: 검증코드 workflowservice -> scheduleService로 이동

* fix: 오타 수정

* fix: 정적 메서드로 변경

* fix: 정적 메서드로 변경

* fix: 인증 중복 코드 제거

* fix: hasSchedules collection으로 변경

* chore: import 추가

* chore: spotlessApply

* refactor: DTO 네이밍 변경

---------

Co-authored-by: jihukimme <jihu0210@naver.com>

* docs: 다이어그램 및 시연 영상 업로드

* docs: 시연 영상 유튜브 링크 업로드

* docs: 시연영상 목차 추가

* 목차 및 각 콘텐츠 앵커 링크 도입 (#242)

* docs: ERD 추가 및 시퀀스 다이어그램 경로 수정 (#244)

* 서버 장애 발생으로 인해 중단된 워크플로우 자동 복구 및 이어하기(Resume) 기능 구현 (#246)

* Release v0.1.0-stable (#245)

* README.md 작성 및 DTO 네이밍 컨벤션에 맞게 리팩토링 (#239)

* docs: README.md 작성

* refactor: DTO 네이밍 컨벤션에 따라 리팩토링

* refactor: Code Formatting

* 다이어그램 파일명 수정 (#240)

* docs: README.md 작성

* refactor: DTO 네이밍 컨벤션에 따라 리팩토링

* refactor: Code Formatting

* fix: 다이어그램 파일명 수정

* Spring Quartz에 Cluster를 이용한 schedule, workflow 실시간 반영 (#238)

* feat: applcation-develop.yml에 quartz설정 추가

* feat: QuartzConfig

* feat: Quartz에 스케줄 동기화 추가

* feat: ScheduleController

* feat: Schedule 단건조회, 스케줄 활성상태 변경 추가

* feat: ScheduleService

* feat: ScheduleUpdateDto

* feat: workflowController delete,patch,활성화변경, 스케줄 삭제 추가

* feat: workflowMapper 워크플로우 활성화상태 변경 추가

* feat: Schedule Quartz 실시간 반영 관련 내용 추가

* feat: ScheduleManagementE2eTest 작성중

* chore: spotlessApply

* feat: schedule workflow_id unique 조건 제거

* fix: schedule 관련 파일들 schedule 폴더로 이동

* feat: scheduleE2eTest 수정

* fix: 중복 코드 삭제

* fix: 검증코드 workflowservice -> scheduleService로 이동

* fix: 오타 수정

* fix: 정적 메서드로 변경

* fix: 정적 메서드로 변경

* fix: 인증 중복 코드 제거

* fix: hasSchedules collection으로 변경

* chore: import 추가

* chore: spotlessApply

* refactor: DTO 네이밍 변경

---------

Co-authored-by: jihukimme <jihu0210@naver.com>

* docs: 다이어그램 및 시연 영상 업로드

* docs: 시연 영상 유튜브 링크 업로드

* docs: 시연영상 목차 추가

* 목차 및 각 콘텐츠 앵커 링크 도입 (#242)

* docs: ERD 추가 및 시퀀스 다이어그램 경로 수정 (#244)

---------

Co-authored-by: bwnfo3 <142577603+bwnfo3@users.noreply.github.com>
Co-authored-by: Yousung Jung <jys01012@gmail.com>

* Update README.md

* Update README.md

* Update README.md

* Update README.md

* README.md 업데이트

* feat: 워크플로우 비정상 종료 복구 프로세스 추가 및 Mapper 메서드 확장

* feat: 성공한 Job 확인용 Mapper 메서드 추가 및 워크플로우 실행 로직 수정

* refactor: Code formatting and alignment adjustments across core classes

* refactor: Code formatting and alignment adjustments across core classes

---------

Co-authored-by: bwnfo3 <142577603+bwnfo3@users.noreply.github.com>
Co-authored-by: Yousung Jung <jys01012@gmail.com>

* refactor: 워크플로우 재개(Resume) 로직 개선 및 README 문서 보완 (#248)

* refactor: replace findSuccessfulJobByTraceId with findSuccessfulJobByWorkflowRunId

* refactor: update task output retrieval to use workflowRunId scope and refine query methods

* docs: update README with environment variables, setup, and deployment steps

* refactor: improve code formatting across Workflow services and mappers

* refactor: 통신 기술 스택 변경 (RestTemplate -> RestClient) 및 E2E 테스트 안정화 (#249)

* refactor: replace RestTemplate with RestClient across the codebase

* refactor: adjust JavaDoc formatting for consistency

* refactor: migrate E2E tests from RestTemplate to RestClient

* [Refactor] 가상 스레드 도입을 통한 비동기 처리 최적화 (#251)

* refactor: replace ThreadPoolTaskExecutor with SimpleAsyncTaskExecutor using virtual threads

* refactor: add SemaphoreTaskDecorator for controlling async task concurrency

* Feature/async optimization (#253)

* refactor: replace ThreadPoolTaskExecutor with SimpleAsyncTaskExecutor using virtual threads

* refactor: add SemaphoreTaskDecorator for controlling async task concurrency

* refactor: update MyBatis type-aliases-package to use domain instead of dto

* chore: 장기실행작업(워크플로우)에 대해서만 가상스레드 설정

* chore: increase HikariCP pool size and refine semaphore initialization logic

---------

Co-authored-by: bwnfo3 <142577603+bwnfo3@users.noreply.github.com>
Co-authored-by: Yousung Jung <jys01012@gmail.com>

* refactor: streamline E2eTestConfiguration with static containers and enhanced property configuration

* refactor: enhance E2eTestConfiguration with improved container setup, CI environment stability, and dynamic property configuration

* refactor: reformat E2eTestConfiguration for better readability and code style alignment

* refactor: simplify E2eTestConfiguration with bean-based container initialization and dynamic property injection

* refactor: streamline E2eTestConfiguration with bean-based container definitions and cleanup static initializers

* refactor: replace `restClient` with `restTemplate` across E2E tests for consistency and simplicity in API interaction

* build: add `testcontainers.version` property to Gradle build configuration

* chore: fix indentation in Gradle build file

* ci: set Docker environment variables for Testcontainers in CI workflow

* build: update Spring Boot to 3.5.8 and remove unused Testcontainers configurations

* refactor: replace `restTemplate` with `restClient` in E2E tests for improved reactive API interaction and streamlined error handling

---------

Co-authored-by: bwnfo3 <142577603+bwnfo3@users.noreply.github.com>
Co-authored-by: Yousung Jung <jys01012@gmail.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant