개발자가 직접 작성한 코드를 포함하여 JDK
, Thrid-party 라이브러리에 사용된 블로킹 메소드 호출을 모두 찾아내서 알려주는 자바 에이전트이다. 리액터 개발팀에 소속된 세르게이 에고로프
가 개발하였다.
build.gradle
내 의존성 추가위 사진과 같이 의존성을 추가하기 위하여 아래 구문을 추가한다.
implementation 'io.projectreactor.tools:blockhound:1.0.6.RELEASE'
MVNRepository
활용MVNRepository
에서 BlockHound Java Agent
를 검색하여 Gradle
탭 내 구문을 추가해도 된다.
🔔 잠깐, 여기에서 프로젝트에 따라 확인이 필요한 부분이 있다!
필자의 경우 테스트 코드 뿐만 아니라 전반적인 애플리케이션 코드 내 블로킹 메소드 호출을 찾을 것이기 때문에
Test Scope
에 한하여 적용되지 않도록 하였다.
(테스트 코드에 한하여 적용하고자 할 경우testImplementation
를, 아닐 경우implementation
를 사용한다.)
BlockHound.install()
메소드는 스프링 부트 애플리케이션을 시작할 때 SpringApplication.run
메소드보다 먼저 호출하여 BlockHound
가 바이트 코드를 조작할 수 있게 한다.
@SpringBootApplication
public class SpringBootApplicationBlockHound {
public static void main(String[] args) {
BlockHound.install();
SpringApplication.run(SpringBootApplicationBlockHound.class, args);
}
}
Application을 시작하여 BlockHound
를 통하여 블로킹 메소드가 발견될 경우 아래와 같이 오류가 발생함을 확인할 수 있다.
완벽한 비동기 프로그램을 구현하기 위해서는 BlockHound
가 발견한 내용을 모두 처리하는 게 좋다. 하지만, 실제로 처리해야 할 비즈니스 로직의 블로킹 메소드 여부에 따라 반드시 비동기로 바꿀 필요 없이, 블로킹을 허용할 클래스와 메소드를 지정할 수도 있다.
builder.allowBlockingCallsInside(
"ch.qos.logback.classic.Logger",
"callAppenders"
);
이외의 더 많은 커스터마이징 옵션은 아래 공식 페이지를 참고하자.