'type safety'에 해당되는 글 1건

  1. 2008/03/09 잘못된 spring configuration문제로 StackOverflowException 황당한 예외 (6)

난 spring을 사용하는 프로젝트에서 개발을 하고 있다.

개발을 완료하고 application startup까지 이상이 없이 진행이 되었다.

특정기능을 integration test를 진행을 했는데, 별이유없이 StackOverflowException이 발생을 한다.

도대체 왜? 어떤 스택이 overflow가 발생을 했다는 것일까?

내가 생각한 예상치는 이렇다. 내가 진행을 하고 있는 프로젝트는 여러개의 이클립스 프로젝트(서브프로젝트라고 하겠다)를 가지고 있고, 서브 프로젝트간에 dependency 가 존재를 한다.

특정 어플리케이션은 API형태로 사내에 다른 서비스와 많은 연동을 하기때문에 서브 프로젝트 2개이상을 dependency를 가지고 있다. 대략그림을 그리면 이렇다.

User inserted image
dependency1 application과 dependency2 application에 각자의 applicationColntext.xml이 존재를 하고, 그 applicationContext.xml을 현재 개발하고 있는 어플리케이션에서 import를 사용을 해서 dependency를 가지고 있는 API들을 사용한다. 그림만 보면 cyclic도 존재하지 않고, 큰 문제는 없어보인다.

하지만, 문제는 전혀 예상치 못했던 곳에서 발생을 했다. 같은 이름이 bean id가 다른 applicationContext파일에 존재를 해서 application start time에는 이상이 없었으나, 런타임시에 상호참조에 의해서 예외가 발생을 한것이다.

dependency1의 spring configuration xml파일에 정의된 bean id의 이름과 dependency2에 있는 bean id의 이름이 같은 것이 존재를 한것이다. import를 한 경우에 startup시 같은 이름과 타입의 spring bean id를 overriding을 하게 설계가 되어 있는거 같다.

문제는 type이 다른데, bean id가 같은 경우이다. 이경우는 정상적으로 spring의 context는 올라가지만 런타임시에 StackOverflowException가 발생을 하였고, 디버깅시에 원인을 파악을 하기 어려운 부분이었다.
 
같은 이름의 bean id를 하나씩 고쳐봤지만, 해결이 쉽지 않았고, 결국 사용하는 bean들만 다른 applicationContext에 정의를 했고, 사용하는 녀석들만 import를 해서 해결을 하였다.

하지만, 앞으로 또 생길수 있는 문제로 근본적인 해결이 필요하다. 개발자에게 bean id 를 만들때 prefix를 주어서 만들어도 되겠지만, 우연히 bean id가 같을 확률은 높을 것이다.

이것을 해결하자면,

build time에 integration unit test를 통해서 Application Startup Time이후 오류가 발생할 부분을 runtime에서 unit test time으로 땡겨올 필요가 있다.

build time에 체크를 하려면 CI툴은 반드시 필요한 존재일 것이다.

Posted by ologist
이전버튼 1 이전버튼

블로그 이미지
ologist

공지사항

Yesterday171
Today52
Total34,795

달력

 « |  » 2012.02
      1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29      

최근에 받은 트랙백

글 보관함