[Spring Webflux] BlockHound 적용하기

MEUN·2021년 12월 29일
5

1. 개요

개발자가 직접 작성한 코드를 포함하여 JDK, Thrid-party 라이브러리에 사용된 블로킹 메소드 호출을 모두 찾아내서 알려주는 자바 에이전트이다. 리액터 개발팀에 소속된 세르게이 에고로프가 개발하였다.


2. 적용 방법

1) build.gradle 내 의존성 추가

(1) 의존성 직접 추가

위 사진과 같이 의존성을 추가하기 위하여 아래 구문을 추가한다.

implementation 'io.projectreactor.tools:blockhound:1.0.6.RELEASE'

(2) MVNRepository 활용

MVNRepository에서 BlockHound Java Agent를 검색하여 Gradle 탭 내 구문을 추가해도 된다.

🔔 잠깐, 여기에서 프로젝트에 따라 확인이 필요한 부분이 있다!

필자의 경우 테스트 코드 뿐만 아니라 전반적인 애플리케이션 코드 내 블로킹 메소드 호출을 찾을 것이기 때문에 Test Scope에 한하여 적용되지 않도록 하였다.
(테스트 코드에 한하여 적용하고자 할 경우 testImplementation를, 아닐 경우 implementation를 사용한다.)


2) 스프링부트 시작 수명주기에 등록

BlockHound.install() 메소드는 스프링 부트 애플리케이션을 시작할 때 SpringApplication.run 메소드보다 먼저 호출하여 BlockHound가 바이트 코드를 조작할 수 있게 한다.

@SpringBootApplication
public class SpringBootApplicationBlockHound {
    public static void main(String[] args) {
        BlockHound.install();

        SpringApplication.run(SpringBootApplicationBlockHound.class, args);
    }
}

3) 애플리케이션 시작하여 적용 결과 확인

Application을 시작하여 BlockHound를 통하여 블로킹 메소드가 발견될 경우 아래와 같이 오류가 발생함을 확인할 수 있다.

블로킹 메소드 발견 시 오류 화면

완벽한 비동기 프로그램을 구현하기 위해서는 BlockHound가 발견한 내용을 모두 처리하는 게 좋다. 하지만, 실제로 처리해야 할 비즈니스 로직의 블로킹 메소드 여부에 따라 반드시 비동기로 바꿀 필요 없이, 블로킹을 허용할 클래스와 메소드를 지정할 수도 있다.

builder.allowBlockingCallsInside(
    "ch.qos.logback.classic.Logger",
    "callAppenders"
);

이외의 더 많은 커스터마이징 옵션은 아래 공식 페이지를 참고하자.

0개의 댓글