TIL

TIL 2024-02-01 통합 테스트 HttpRequest No thread-bound request found 오류

wonow_ 2024. 2. 1. 23:29

문제정의

사실 수집

통합 테스트 돌릴 시 No thread-bound request found 오류 발생

원인 추론

 

로깅 AOP 28번째 줄 HttpRequest 받아오는 부분에서 문제가 난 것으로 추정

 

조치 방안 검토

  • ObjectProvider
    • getObject() 하는 시점까지 RequestScope Bean 생성을 지연할 수 있다.
    • 그 후 HTTP 요청이 일어나서 Logger 가 필요하게 되면 getObject() 를 통해서 빈이 생성 처리 된다.
      •  통합 테스트 환경에선 HTTP 요청이 일어나지 않으니 이 방법이 아님
  • 실질적인 Request 가 없는 곳이거나 Static 메서드에 HttpRequest를 받았을 때 문제가 생긴다.
    • HttpRequest Logging AOP 분리
      • 현재 @SwapLog는 서비스 레이어단의 로깅을 위해서 만든 어노테이션이지만 통합 테스트에서 서비스 레이어를 테스트하고 있고, HttpRequest를 실질적으로 받는 환경이 아니기 때문에 분리해야할 필요를 느꼈다.

조치 방안 구현

@Before("@annotation(piglin.swapswap.global.annotation.SwapLog)") // 서비스 레이어
    public void swapLog(JoinPoint joinPoint) {

        log.info("\nMethod - {} | Method Argument - {}",joinPoint.getSignature().getName(), joinPoint.getArgs());
    }

    @Before("@annotation(piglin.swapswap.global.annotation.HttpRequestLog)") // 컨트롤러 레이어
    public void httpRequestLog(JoinPoint joinPoint) {

        MDC.put("traceId", UUID.randomUUID().toString());

        HttpServletRequest req = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();

        log.info("\nIP - {} | Browser - {}\n▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ Cookie ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼ ▼\n{} \n▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲ ▲", getRemoteAddr(req), getBrowser(req), getCookie(req));
    }