[Spring StackOverflow Error] Spring xml방식 객체 주입시 스택 오버플로우 에러

2021. 10. 21. 10:30Error

에러메시지 : javax.servlet.ServletException: java.lang.StackOverflowError

 

스프링에서 Scope를 Requst로 설정해둔 빈객체를 xml방식으로 주입 받아서 사용할 경우 발생했던 에러이다.

위의 사진은 root-context.xml로 빈객체를 등록해서 사용하는 역할을 한다. DataBean1과 DataBean2 두 빈객체를 등록해두고 Scope는 request로 설정해 두었다. DataBean2의 경우에는 id 값을 지정해주었는데 xml 방식에서는 특이하게 root-context.xml에서 빈객체를 id값을 설정해서 등록해 두면 request 영역에 자동으로 저장된다.

 

컨트롤러에 @Resource 어노테이션을 통해 id로 지정한 name 값으로 객체를 주입 받는다. Scope를 requst로 할 경우 request 요청이 들어 올 때 객체가 자동주입되는 속성을 갖는데 xml에서는 Scope가 request일 경우 @Lazy 어노테이션을 붙이지 않으면 주입된 객체를 사용할 수 없다. (@Lazy 어노테이션은 코드가 정상적으로 다 실행한 뒤에 나중에 실행 될 수 있게 하는 어노테이션이다.)

 

객체를 자동주입 받았다고 해서 리퀘스트 영역에 까지 데이터가 저장되는 것은 아니기 때문에 Model객체를 통해 리퀘스트 영역에 데이터를 저장해줘야한다. (약간 다른 예로 @ModelAttribute를 통해 클라이언트가 요청한 파라미터를 받아올 경우엔 리퀘스트 영역에도 저장 된다.) 

 

하지만 xml방식에서는 root-context.xml에 id를 지정해준 상태로 빈객체를 등록할 경우에 리퀘스트 영역에 저장이 되므로 컨트롤러에서 Model를 통해서 리퀘스트 영역에 다시 저장할 경우 스택오버플로우 에러가 발생했다. 스택오버플로우 에러가 발생하는 대표적인 이유가 재귀호출 때문인데 해당 위의 코드가 재귀호출이 발생한건지는 좀 더 알아봐야 할 거 같다.