티스토리 뷰

발생일: 2009.05.26

문제:
웹어플리케이션 백그라운드에서 정기적으로 컨텍스트의 정보를 가져와 DB에 업데이트하는
Daemon Thread가 돌고 있다. (어플리케이션의 백그라운드에서 작동하는 Daemon Thread 참조)

헌데, 로컬에서 작업 중 동적으로 컴파일 하게 되면,
Daemon Thread에서 호출하는 매니저 클래스가 없다며 NoClassDefFoundError 가 발생한다.
classpath가 잘못된 건 아니고, 또한 분명히 class는 정의되어 있는데 말이다.

해결책:
클래스 로더가 해당 클래스를 로딩할 때에 class 파일을 찾을 수 없다는 예외다.
보통은 클래스 패스가 제대로 정의되어 있지 않을 때 발생한다.
(자바서비스넷의 ClassNotFoundException 과 NoClassDefFoundError의 차이점에 대한 글을 읽어보자)

하지만 이 상황에선 로컬에서 동적으로 컴파일 하게 되면
해당 리소스가 새로 컴파일 되는 중간에 백그라운드에서 작업을 시도하기 때문에
클래스 파일을 찾을 수 없어 NoClassDefFoundError가 발생한 것이다.

특히 지난 번 Daemon Thread를 작성할 때에
어플리케이션이 로드되기 전 작업이 시작되는 것을 막기 위해 Sleep을 먼저 시켰기 때문에,
클래스가 동적으로 수정되고 난 이후에 백그라운드 스레드가 변경되었음에도 불구하고 작업이 수행되었기 때문이다.

이 문제는 작업 수행 전 현재 스레드가 최신 스레드인지 여부를 재확인하는 로직을 추가하는 것으로 해결했다.

반응형
댓글
공지사항