가정 : 비동기로 처리할 수 있는 작업은 5개이고, 총 8개의 작업이 요청됨
@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를 적용하는 방식으로 설계할 수 있음. 인터페이스 기반 프록시는 클래스 기반 프록시보다 유연성이 높으며, 다형성을 활용한 설계가 가능