InitializingBean implements afterPropertiesSet() 호출되지 않는 문제.

2015-12-30 01:47

A 에 의존성을 가지는 B라는 클래스가 있습니다.

B라는 클래스는 InitializingBean 을 상속하고 afterPropertiesSet을 구현하고 있습니다. 서버가 가동되면서 bean들이 초기화되는 시점에 B라는 클래스의 afterPropertiesSet 메소드는

A라는 클래스의 특정 메소드인 afunc()를 호출하고 있습니다.

호출되는 A 클래스의 특정 메소드 afunc() 는 A 클래스의 인스턴스 변수로 있는 자료구조 acollection 을 참조합니다. A클래스 역시 InitializingBean 을 상속하고 afterPropertiesSet을 구현하여 acollection 을 초기화 하고 있습니다.

늘 정상으로 작동하던 코드들이었구요, 오늘 다른 작업자분께서 커밋한 코드 받으니 갑자기 제목처럼 afterPropertiesSet 이 실행되지 않아 bean들이 초기화되는데 실패하는 문제가 발생하였습니다.

A클래스의 acollection 이 초기화되질 않아 afunc() 메소드에서 에러를 발생시켰고 B 클래스가 생성되지 않으면서 서버 전체적으로 각기 의존을 가지는 bean들이 모두 생성되지 않는 문제가 발생하였습니다.

우선 급한대로 A클래스의 afunc 내에서 acoolection 이 초기화되지 않은 상태라면 초기화를 우선 하라는 코드를 집어넣어 해결했는데, 이런 문제가 발생하는 경우가 어떤 경우가 있을지 몰라 질문을 남겨봅니다.

A, B 모두 같은 프로젝트에서 같은 component scan 대상에 위치해있습니다.

혹시 같은 경우를 경험하신 분이 계시거나, 해결방안을, 혹은 제가 놓치고 있는 부분이 있다면 지적을 부탁드립니다.

4개의 의견 from SLiPP

2016-01-12 14:06

@자바지기 환형참조 문제 입니다. ㅎㅎ;; 환형참조로 인해 핵심 리소스를 가진 객체가 핵심 리소스를 로드하여 초기화하기도 전에 다른 객체가 해당 핵심리소스에 접근하였다가 null exception 이 발생한 경우인데 이를 억지로 순서로 정의할 수 없을까 했는데. 애초에 설계 자체가 잘못된걸 피하려는 꼼수를 생각했던 질문이었네요... ^^;;

2016-03-27 21:38

혹시, 순환참조 문제가 아닌지 확인해 보셔야 할 것 같습니다. 가능하면 순환참조 상황을 제거해야 하고(의존관계는 인터페이스 기반으로..) 빈설정에서 depends-on 설정을 사용해서 빈들이 생성될 때 의존관계에 맞게 생성하도록 하는 것도 검토해 보심이 어떨는지요?

2017-06-09 12:25

@Yonghee Lee 정말 늦게 답변을 확인했습니다, 말씀처럼 순환참조 문제였던 것으로 기억이 나구요 ㅎㅎ;;; 제가 작업한 부분이 아니다보니 최대한 기존 코드들을 살리려고 애를 썼던 흔적이 보이네요...;; 말씀해주신 부분은 적용해보지 않았으나, 다음 프로젝트에선 적용을 고려해보겠습니다 ^^;

의견 추가하기