스프링의 @Async 어노테이션: ThreadPool 설정과 Private 메소드에서의 동작 이해하기

이강용·2024년 1월 16일
0

CS

목록 보기
27/109

@Async 어노테이션과 ThreadPool 설정

가정 : 비동기로 처리할 수 있는 작업은 5개이고, 총 8개의 작업이 요청됨

  • ThreadPool 관련 주요 설정 설명:
    • Core Pool Size(기본 스레드 수) : 이 값은 ThreadPool이 초기에 생성하는 스레드의 수, 예를들어 Core Pool Size가 5라면, 처음에 5개의 스레드가 생성됨
    • Max Pool Size(최대 스레드 수) : 이 값은 ThreadPool이 생성할 수 있는 최대 스레드 수를정의함. 만약 Core Pool Size를 초과하는 작업이 들어오면, ThreadPool은 이 값까지 추가 스레드를 생성할 수 있음
    • Queue Capacity(작업 대기열 크기) : Core Pool Size가 가득 찬 경우, 추가 작업은 이 대기열에 저장됨. 대기열의 크기가 최가될 때까지 새로운 작업은 여기에 들어감
    • Keep-Alive Time(유휴 스레드 유지 시간) : Core Pool Size를 초과하는 스레드는 이 시간만큼 유휴 상태로 남아 있을 수 있음, 설정된 시간 동안 작업이 없으면 해당 스레드는 종료
    • Thread Name Prefix(스레드 이름 접두어) : ThreadPool에서 생성되는 스레드에 부여되는 이름의 접두어, 이를 통해 로그에서 스레드를 구분하는 데 도움이 됨

@Async와 Private 메소드

@Async 어노테이션이 Private 메소드에서 동작하지 않는 이유

  • Spring의 AOP(Aspect-Oriented Programming) 프록시 기반 메커니즘 때문
    • Spring AOP는 프록시 객체를 생성하여 원본 객체의 메소드 호출을 감싸는 방식으로 작동함. 이 프록시는 public 메소드 호출에 대해서만 감지할 수 있으며, private 메소드는 프록시를 통해 접근할 수 없음. 따라서, private 메소드에 @Async를 사용하더라도, AOP 프록시가 이를 인식하지 못해 비동기적으로 실행되지 않음.

스프링의 프록시 기반 AOP와 메소드 접근성의 관계

  • Spring의 AOP는 대부분 프록시 기반으로 구현돰. 이 프록시는 원본 객체를 감싸고, 메소드 호출을 가로채 관심사(aspect)를 주입. 하지만 이 프록시 메커니즘은 public 메소드에만 적용.
    • Public 메소드: 프록시는 public 메소드 호출을 가로채고, 추가적인 처리(예: 로깅, 트랜잭션 관리)를 수행할 수 있음.
    • Private/Protected 메소드: 이들 메소드는 클래스 내부에서만 호출되며, 프록시를 통한 외부 접근이 불가능함. 따라서 AOP 관련 처리가 적용되지 않음.

비동기 처리를 위한 올바른 메소드 설계 방향 제시

  • 비동기 처리를 위한 올바른 메소드 설계 방향은 다음과 같습니다.
    • Public 메소드 사용: @Async를 적용하려면 public 메소드를 사용해야 함. 이렇게 하면 Spring AOP 프록시가 해당 메소드를 감지하고 비동기 처리를 적용할 수 있음.
    • 인터페이스 기반 프록시 활용: 인터페이스를 정의하고, 이 인터페이스를 구현하는 클래스에 @Async를 적용하는 방식으로 설계할 수 있음. 인터페이스 기반 프록시는 클래스 기반 프록시보다 유연성이 높으며, 다형성을 활용한 설계가 가능
profile
HW + SW = 1

0개의 댓글