IT/Java

[Spring boot]컨테이너, 클래스로더가 뭘까? (feat. ClassNotFoundException를 곁들인)

U.N.nwonk 2022. 5. 10. 13:27

웹 어플리케이션 컨테이너는 뭘까?

== 웹 어플리케이션이 배포되는 공간

정적 파일과 동적 파일이 있다면?

정적 파일 전달 => 웹서버

동적 파일 전달 => 웹 어플리케이션 서버 or 웹어플리케이션 컨테이너(Java에서)

웹 어플리케이션 컨테이너 == WAS

 

그럼 WAS는 어떻게 웹어플리케이션을 인식하고 동작시킬까?

이걸 알려면 Java의 특징을 알아야한다.

Java의 특징중 대표적인 것은 Write once, run anywhere. 즉, 한 번 작성하면 플랫폼 상관없이 쓸 수 있다는 점이다.

이 특징을 실행할 수 있게 하는 기술 == 클래스 로더(class loader)

 

그럼 클래스 로더는 뭔데?

자바 코드를 작성한 후 컴파일하면 해당 코드는 JVM에서 실행 가능한 상태가 된다.

그럼 실행하면 되잖아?

JVM이 클래스를 실행하기 위해서는 클래스 로딩하는 과정이 필요하다.

그 과정을 수행하는 역할이 클래스로더(class loader)다.

 

//여담//-------------------------------------------------------------

예외(Exception)중에서 ClassNotFoundException과 같은 에러가 있는데, 이 예외가 발생하는 이유는 클래스 로더가 추가된 라이브러리/클래스를 인식하지 못해서 생기는 오류다.

이런 에러는 클래스패스(classpath)에 해당 모듈/라이브러리를 추가하면 해결된다.

-----------------------------------------------------------------------

 

그럼 클래스로더의 특징이 뭐야?

1. 구조가 계층적이다.

상위 클래스 로더에서 하위클래스 로더를 가지는 방식이다.(최상위 클래스로더는 부트스트랩 클래스 로더)

2. 클래스 로딩을 위임할 수 있다.

3. 가시적인 규약이 있다.

가시적인 규약인 뭔데?

클래스를 로딩할 때 가능한 범위가 있는 것이다.

자식 클래스 로더는 클래스 로딩 요청 위임을 통해서 부모 클래스 로더가 로딩한 클래스를 찾을 수 있지만,

부모클래스 로더는 자식 클래스 로더가 로딩한 클래스를 알 수 없다.

4. 클래스 언로딩 불가능

클래스로더로 로딩한 클래스들을 언로딩할 수가 없다.

그럼 초기화는 어떻게해?

가비지 컬렉터가 동작하거나, WAS를 재시작할 때 초기화된다.

 

클래스로더에는 어떤 유형이 있어?

1. 부트스트랩 클래스 로더(bootstrap class loader)

부트스트랩 클래스 로더는 JVM 런타임 실행을 위해 기반이 되는 파일들을 로드한다.(rt.jar파일이랑 연관있음)

2. 확장 클래스 로더(extension class loader)

부트스트랩로더 로딩이 끝나면 이친구가 Java 최상위 객체인 Object포함한 Java API를 로드한다.

3. 시스템 클래스 로더(system class loader)

확장 클래스 로더 로딩이 끝나면 시스템 클래스 로더가 클래스패스에 포함된 클래스들을 로드한다.

4. 사용자 정의 클래스 로더(user-defined class loader)

// 아, 참고로 사용자는 3,4번 밖에 접근이 안돼. 클래스패스쪽이랑 사용자 정의쪽만 접근 가능한거야.

// 이러한 구조때문에 대부분 톰캣 웹서버 설치 위치를 CATALINA_HOME으로 지정하는 이유기도 해(WAS에서 생성한 클래스 로더를 기준으로 동작하기 위해서)

 

이게 뭔데?

위에서 말했듯이 그냥 클래스 로더의 유형이다.

부트 스트랩이 최상위 계층이고, 그 아래로 확장클래스 로더, 시스템클래스 로더, 그리고 제일 아래에는 사용자 정의 클래스 로더가 있다.

반응형

'IT > Java' 카테고리의 다른 글

[Java] main() 메소드는 뭘까?  (0) 2022.05.10
[Java]레퍼런스 변수란?  (0) 2022.05.09