본문 바로가기

개발

proxyBeanMethods=false를 써야 하는지

문제 제기

WebClient를 적용하는 과정에서 WebClient 객체를 Spring에서 관리하도록 하고 싶었다.

여러 서버와 통신하기 때문에 각 서버별로 WebClient 객체를 만들어야 해서 Config 클래스에서 Bean 어노테이션을 사용했다.

다른 사람들과 공식 문서에선 어떻게 사용했는지 찾아본 결과 proxyBeanMethodsfalse로 주는 케이스들이 보여 어떤 차이가 있는지 알아보게 됐다.

이 기준으로 정리함

내용이 너무 방대해서 정리하는 기준점이 필요했다. 지엽적인 부분으로 자주 빠지게 됐고 모두 정리해 봤자 나중 가면 기억도 안 나고, 틀린 내용이나 단편적인 케이스를 일반화할 것 같아서 이렇구나~라고 보고 넘겼다. 본 것 들은 Reference 항목에 적어놨다.

  1. true/false 차이가 운영환경에 유의미한 영향을 주는지
  2. 다른 프로젝트 코드의 Config 파일 모두 false로 바꿔야 하는지

그래서 영향이 있나?

true/false 차이를 그림으로 표현하면 다음과 같다.

우리 팀 기준에선 안 하는 게 나았다.

문제가 된 깃헙 이슈 확인 결과 false를 하면 초기 구동 시간이 줄어드는 장점이 있지만, 어디까지나 초기 구동에서 끝났다.

우리의 주 관심사인 응답 속도와는 무관했다.

 

또한, 기존 코드들이 객체를 하나로 관리하려 만든 거라 false를 하면 오히려 문제가 됐다. 호출할 때마다 객체를 새로 생성하기 때문에 기능은 동작해도 객체를 계속 생성해 메모리 부담이 생겼다. 특별한 이유 없이 Bean으로 선언한 오브젝트가 새로 생성된단 것은 Bean이 만들어진 이유와 맞지 않다고 생각했다.

 

무엇보다도 응답 시간도 아닌 시작 비용 0.x 초 줄이려고 이걸 적용하기엔 굳이?였다. 시작 조금 빨리하자고 파급력이 높은 설정 파일을 바꾸는 것은 너무 무모하다.

흥미로운 점

proxyBeanMethods 이 작동하는 데 cglib을 사용하는데 깃헙을 보면 유지 관리 이슈로 java 17 이상으론 호환성 보장을 안 한다.

뇌피셜이지만 현재 스프링 부트 3.x는 자바 17을 필수로 하는데 이렇다는 점은 cglib이 오래됐고, 자바 언어 자체도 계속 변화하기 때문에 레거시 문제로 걷어내려는 건가? 란 망상을 해본다.

 

이러면 동적 생성 방식에서 네이티브 생성으로 넘어가거나 다른 스택을 사용할 것 같은데.. 버전 업데이트될 때마다 이런 부분에 변동이 있는지 확인해야겠다.

Reference

https://github.com/spring-projects/spring-boot/issues/9068

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/Configuration.html

https://github.com/cglib/cglib

https://www.baeldung.com/cglib

https://docs.spring.io/spring-framework/reference/core/aop/proxying.html

https://www.inflearn.com/questions/1084896/proxybeanmethods-false-와-관련해서-질문이-있습니다