Thursday, July 02, 2009

J2EE 상의 클래스 로딩 구조

그래서 이번 기회에 한번 J2EE 상의 클래스 로딩 구조에 대해서 정리 해보겠습니다.



먼저 위의 그림이 J2EE 1.3 상의 클래스 로딩 구조 입니다. 예전 버전(1.2.2)에선 이부분이
명확하지가 않아서 밴더마다 조금씩 차이가 있었는데..1.3 오면서 위와 같이 표준이 정해졌습니다.

보실때 굵은선으로 구별되는 것 각각이 자기만의 클래스로더를 가지고 있다고 생각하시면 됩니다.
점선의 경우 클래스를 공유한다고 생각하시면 되고요.

즉 JVM은 기본 API에 대한 클래스를 로딩 하고
Application 서버(Weblogic, Websphere, 제우스등..)은 기본 JVM 위에서 자신만의 클래스를 로딩하고
그 다음에
개발자가 개발한 EJB, WAR, EAR들이 각자의 클래스 구조를 가지고 그 위에 올라가는 거죠.
(각각의 EJB,EJB,EJB들은 각각의 클래스 로더를 가짐)



자..그럼.. 그렇게 올라간 각 부분이 클래스를 접근하는 경로를 보겠습니다.
간단하게 그림에서 위에서 아래로는 접근할수 있고, 옆으로 분리된 상태는 안된다고 보시면 됩니다.

1. 해당 EJB의 경우 Application 서버가 구동시 잡은 Classpath상의 모든 클래스와
   JVM에 접근 할 수 있다. 다른 EJB 및 옆의 WAR/EAR 상의 클래스 접근 불가..

2. 해당 WAR의 경우 Application 서버가 구동시 잡은 Classpath상의 모든 클래스와
   JVM에 접근 할 수 있다. 다른 WAR 및 옆의 WAR/EAR 상의 클래스 접근 불가..

3. 해당 EAR의 경우 좀 다르게..해당 내부의 WAR(들) 및 EJB(들) 상의 클래스를 다 접근 할수 있다

4. 그리고 Application 서버가 구동시 잡은 Classpath상의 모든 클래스와
   JVM에 접근 할 수 있다. 다른 EAR 및 옆의 WAR/EJB 상의 클래스 접근 불가..



그럼 이렇게 접근하는 클래스가 중복되었을 경우 어떻게 되는가?
자바에서 클래서 로딩 규칙은
동일한 클래스가 클래스패스에 각가 잡혀 있을경우 먼저 올라간 놈이 장땡(?) 이다.
J2EE상의 클래스 로딩 우선 순위는 그림과 같이 밑으로 갈수록 높다.

1 순위 : 당연히 JVM 상의 기본 클래스들..(API)들이다.

2 순위 : Application 서버가 구동시 잡는 각종 클래스 패스상의 클래스들

동률 3 순위 : EJB, WAR, EAR은 같은 레벨의 클래스 우선순위를 가진다.
그래서 같은 이름(패키지가 같고, 클래스명이 동일한)의 클래스가
여러 컴포넌트(EJB, WAR, EAR...) 상에 올라 갈수 있다.
그리고 따로 따로 동작한다.

기타 EAR 상에서는 EJB가 우선이고 WAR 파일이 나중이다.


정리 하자면
com.tebss.test.AClass 라는 클래스가 있고
이 클래스가 그림에서 아랫부분(부모) 클래스로드에서 로딩되었다면.. 그다음에 오는
동일명 클래스(패키지가 같고, 클래스명이 동일한)는 절대 클래스가 올라갈 수 없습니다.

하지만 동일 레벨의 클래스로더들(EJB, WAR, EAR) 상에서는 동일명 클래스가
로딩될 수 있습니다.

그리고 EAR 상에서는 EJB 부분이 먼저고, WAR 부분이 나중입니다.

자..그럼 위의 클래스로더 구조를 가지고 위의 싱글턴 문제를 함 보겠습니다.



위의 그림 상태가  위에서 최초의 싱글턴 구현 방식이였습니다.
보시다 시피 EJB마다 동일한 싱글턴 클래스가 있기 때문에
각자 클래스로더 상에 올라갔고..따로따로..돌아 간거죠...
(물론 비지니스 로직에 의해서 위와 같이 싱글턴을 구현할 수 도 있음)



위의 그림이 시스템 패스상에 싱글턴 클래스를 걸어준 형태입니다.
이경우 설령 그림처럼..EJB, WAR,EAR 상에 동일한 싱글턴 클래스가 있더라도
실제 클래스로더상에 올라가는 놈은 D 번 한놈밖에 없죠.

그리고 각 컴포넌트 부분에서 접근할때도.. 그 한놈에게만 접근하게 되는거죠.
그래서 무사히 싱글턴하게 되는거죠...

No comments: