티스토리 뷰

Server

MVC Redirect 에서 OOM 방지하기

니용 2021. 7. 1. 16:40
반응형

최근에 트래픽이 특정 시점에 몰리는 경우 발생한 문제에 대해 찾아보다가 의외로 단순한 문제로 해결되는 방법을 찾게 되었습니다. 이전 글에서도 작성하였다시피 Controller 에서 아래와 같은 방식과 같이 개발을 하는 경우가 많습니다.

@GetMapping("/test")
public String test() {
    return "redirect:/url/" + UUID.randomUUID();
}

몇 건의 경우 문제가 없겠지만 한 번에 다량의 Request가 들어오게 된다면 스프링에서 제공해주는 동시성 유틸리티에 과부하가 되어 Out of memory, 즉, 힙 영역에 과다한 부하가 들어오게 되어 FullGC가 발생하게 됩니다. 

이런 방식을 개선하기 위해 RedirectView 또는 ModelAndView 클래스를 사용하도록 권장되어 있습니다. 위와 같은 @RequestMapping을 사용하지 말라는 방법이 아닙니다.

특정적으로 난수를 많이 생성하고 (UUID Class, Math.random() Method 등) 그거에 맞춰서 리다이렉션을 진행하는 클래스를 아래처럼 변경해줍니다.

@GetMapping("random")
public ModelAndView random() {
   ModelAndView mav = new ModelAndView();
   RedirectView rv = new RedirectView();
   rv.setUrl("result/" + UUID.randomUUID());
   mav.setView(rv);
   return mav;
}

자세한 내용은 아래 문서에 있어서 참고를 많이 하였습니다 :)

https://taetaetae.github.io/2019/01/10/spring-redirect-oom/

 

Spring MVC Redirect 처리중에 발생한 Out Of Memory 원인 분석하기

초창기 신입시절에 배우거나 사용했던 기술적인 방법들이 있다. 시간이 지날수록 왠만해선 다른방법은 사용하지 않으려 하고 습관처럼 기존에 사용했던 방법을 고수하는 버릇이 있다. 그 이유

taetaetae.github.io


https://github.com/spring-projects/spring-framework/issues/14698

 

AbstractCachingViewResolver - caching redirect views leads to memory leak [SPR-10065] · Issue #14698 · spring-projects/spring

Michał Jaśtak opened SPR-10065 and commented When user uses URL prefixed with "redirect:" as the method invocation result in Controller, it is cached as the whole (with provided parameter...

github.com

 

반응형
댓글
공지사항