해결된 질문
작성
·
461
·
수정됨
0
안녕하세여 초보적인 질문드려서 죄송합니다..
Configuration ProxyBeanMethods 값을 false 를 주면 호출 할때마다 새로운 객체를 생성하게 되는데.. 다시 말해 싱글톤임을 보장 받을수 없게 되는걸로 이해하였습니다. 아마 false주는 경우는 없을듯합니다만 혹시 사례가 있을까요?
'굳이' 라는 말을 강의에서 계속 하셔서 사례라고 하면 생각해봤을때 싱글톤의 단점인것을 보안하기 위해 사용되는건지? 아니면 성능적인것 때문에 그런지 궁금합니다.
마지막 내용에 spring 에 실제 사용된 내용으로 봤을떈, 단순한 Configuration 일땐 false를 주면 될듯한데. 디테일한 사례가 궁금합니다.
감사합니다.
답변 1
3
최근 추세는 proxyBeanMethods를 @Bean 메소드 직접 호출로 의존 오브젝트를 가져오는 방식을 쓰지 않는 경우라면 false로 세팅하는 겁니다. 대부분의 경우 빈 오브젝트를 생성하는 메소드 호출은 스프링 컨테이너가 담당하기 때문에 문제가 되지 않습니다.
팩토리 메소드 스타일로 빈을 생성하는 방식이 싱글톤을 보장하기 위해서 프록시 클래스를 만들어서 캐싱을 하게 해야하는데, 이런 클래스 프록시 생성은 동적으로 일어나기 때문에 스프링 6의 네이티브 컴파일 등을 적용할 때 문제가 됩니다. 물론 스프링은 이를 처리할 수 있는 방법을 만들기는 했지만, cglib 등의 사용은 점차 줄어드는 것이 자연스러운 결과라고 봅니다.
특히 자바 코드를 봤을 때 예상할 수 있는 동작과 실제 스프링 위에서 런타임에서 동작되는 방식에 차이가 생기는 것은 비직관적입니다. 스프링 컨테이너가 있고 없고에 따라서 평범한 코드가 다른 방식으로 동작하는 것은 좋은 설계라고 볼 수 없습니다. 나름 자바 코드를 이용한 빈 설정을 단순하게 만들기 위해서 등장한 방식이지만 프록시 클래스의 생성은 가능한 피하는 것이 좋다고 봅니다.
앞으로 스프링이 어떻게 이를 이용하는지 주목해볼만합니다. 프록시 팩토리 빈 설정을 false로 주었을 때 문제가 되는 경우가 어떤게 있는지 한번 확인해보세요. 메소드 직접 호출을 통해서 빈을 가져오는 게 아니라면 싱글톤으로 빈이 주입되는 것 자체에는 아무런 문제가 없습니다.