public interface Job : CoroutineContext.Element { // ...}Job은 CoroutineContext의 Element를 확장한 객체이다.Job은 백그라운드에서 동작하고 개념적으로 완료 시 종료되는 라이프사이클을 가진 취소 가능한 것이다. 계층 구조의 JobJob은 부모-자식 계층 구조로 배열할 수 있다.이때 부모가 취소되면 모든 자식이 재귀적으로 즉시 취소된다. 그리고 취소 예외(CancellationException)가 아닌 예외가 있는 자식이 실패하면 그 부모와 결과적으로 다른 모든 자식도 즉시 취소된다.이러한 예외의 전파는 SupervisoerJob을 사용하여 예외 전파를 막을 수 있다. Job의 생성Job 인터페이스의 가장 기본적인 인스턴스는 다음과 같..
전체 글
github: https://github.com/belljun3395 email: belljun3395@gmail.com
HandlerMethod 등록스프링에서 requestMappingHandlerMapping이 생성되며 선언한 컨트롤러의 메서드들이 요청처리를 위한 메타정보과 함께 HandlerMethod로 등록된다.public HandlerMethod( String beanName, BeanFactory beanFactory, @Nullable MessageSource messageSource, Method method) { super(method); Assert.hasText(beanName, "Bean name is required"); Assert.notNull(beanFactory, "BeanFactory is required"); this.bean..
SupervisorJob은 자식 Job으로부터 예외를 전파받지 않아 서로 독립적으로 실패할 수 있다.참고로 Supervisor의 뜻은 감독자다 자식 Job이 실패하거나 취소되어도 SupervisorJob이 실패하지 않고 다른 Job의 작업에 영향을 미치지 않는다.SupervisorJob은 자식 Job의 실패를 처리하기 위한 사용자 지정 정책을 구현할 수 있다.launch를 사용하여 생성된 자식 Job의 실패는 컨텍스트에서 CoroutineExceptionHandler를 통해 처리할 수 있다.async를 사용하여 만든 자식 Job의 실패는 결과 지연 값에 대한 Deferred.await을 통해 처리할 수 있다. 상황Job자식 코루틴끼리 운명을 같이 해야 하는 경우Job()자식 중 하나가 실패해도 다른 작업..
새 코루틴의 범위를 정의한다.코루틴을 생성하기 위한 명세서이다. 모든 코루틴 빌더(예: launch, async 등)는 코루틴 스코프의 확장이며, 코루틴 컨텍스트를 상속받아 모든 요소와 취소를 자동으로 전파한다.public fun CoroutineScope.launch( context: CoroutineContext = EmptyCoroutineContext, start: CoroutineStart = CoroutineStart.DEFAULT, block: suspend CoroutineScope.() -> Unit ): Job { // 기존의 컨텍스트와 합쳐진 새로운 컨텍스트 val newContext = newCoroutineContext(context) ..
기존 AbstractPlatformTransactionManager에서의 이벤트 발행AbstractPlatformTransactionManager를 사용하는 경우 commit을 수행하는 과정에서 TransactionSynchronizationUtils의 메서드를 활용하여 @TransactionalEventListener에게 이벤트를 전달합니다.조금 더 구체적으로는 TransactionSynchronizationManager.getSynchronizations()을 통해 해당 트랜잭션에서 등록된 synchronizations을 조회하고 synchronization에 등록된 콜백을 실행하는 방법으로 이벤트를 전달합니다. ReactiveTransactionManager에서의 이벤트 발행하지만 Webflux에서..

네임드 락을 활용한 동시성 제어동시성 문제 - 중복 저장@Componentclass SubscribeWorkbookUseCase( private val subscriptionDao: SubscriptionDao, private val applicationEventPublisher: ApplicationEventPublisher,) { @Transactional fun execute(useCaseIn: SubscribeWorkbookUseCaseIn) {belljundev.tistory.com 최근 AOP에 대해 다시 공부하며 AOP와 네임드 락을 활용하여 중복 구독 방지를 위해 구현하였던 LockAspect가 문제가 있지 않을까? 하는 생각을 하였습니다.AOP를 다시 공부하기 이전 제가 생각하였던 기존 ..