ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [SpringBoot - Step 2] 클래스로더 & Web appliation
    Java/SpringBoot 2.0 2019. 1. 12. 23:12

    Class Loader

    "한번 작성하면 플랫폼에 상관없이 쓸수있다(Write once run anywhere)" 이특징을 실행 할 수 있는 기술이 클래스로드(Class Loader)이다.

    자바 코드를 작성한 후 컴파일하면 해당 코드는 JVM(Java Virtual Machine)에서 실행 가능한 상태가 된다. 이때 JVM이 클래스를 실행하기 위해서 클래스를 로딩하는 과정이 필요한데 클로스로더가 그역할을 수행한다. (JVM은 이전 Step에서 정리 했으니 참고할것 [링크])


    Class Loader의 특징

    1. 구조가 계층적 구조를 갖으며 상위 클래스로더에서 하위 클래스로더를 갖는 방식이다.
    2. 클래스 로딩을 위임할 수 있다.
    3. 클래스로더는 클래스를 로딩할 때 가능한 범위를 갖는다. 자식클래스로더는 부모 클래스로더로부터 위임받아 부모 클래스로더가 로드한 클래스를 찾을 수 있지만 부모 클래스 로더는 자식 클래스로더의 클래스를 찾을 수 없다.
    4. 한번 로더한 클래스는 언로딩 할 수 없다. 가비지 컬렉터가 동작하거나 WAS가 재시작할 때 초기화 된다.


    Class Loading 방법

    Dynamic Loading : 모든 Class는 참조되는 순간 동적으로 Load 및 Link를 한다.

    - Load Time Dynamic Loading : Class 하나를 Loading할 때 이와 관련된 Class를 한꺼번에 Loading하는 것을 말한다.

    - Runtime Dynamic Loading : 소스코드에서 객체를 참조하는 순가에 동적으로 Loading하는 방식 Reflection과 같이 동적으로 Loading할 인자를 받아 Class을 생성할때 많이 사용된다.



    Namespace

    클래스로더는 JVM에 클래스가 로드가 되었는지 확인을 먼저하는떼 이때 Namespace - Full Qualified Name + Class Loader의 이름도 포함한다.
    다시말하면 JVM 클래스 로드 유무는 Class Loader Name + Package Name + Class Name을 확인하고 없을경우 이정보를 저장한다.
    또한 자바는 자신이 참조하는 Class를 Load할때 반드시 참조하는 Class가 동일한 Class Loader을 사용해야 한다.


    Class Loader의 유형

    Bootstrap Class Loader

    JVM 런타임 실행을 위해 기반이 되는 파일을 로드하며, rt.jar와 연관이 있다.

    # rt.jar(Runtime Environment jar) : rt.jar에는 기본 Java Runtime 환경용으로 컴파일 된 모든 클래스 파일을 포함한다.

    $JAVA_HOME/jre/lib/rt.jar


    Extension Class Loader

    Extension Class Loader가 자바 최상위 객체 Object를 포함한 자바 API를 로드한다.

    자바 홈 폴더 ext폴더 하위에 있는 JAR파일과 연관된다.

    $JAVA_HOME/jre/lib/ext/*.jar


    System Class Loader

    System Class Loader가 클래스패스에 포함된 클래스들을 로드한다.
    $CLASSPATH


    User-Defined Class Loader

    개발자가 만든 사용자 클래스 로더


    Bootstrap class loader, extension class loader을 보통 JVM을 위한 Class loader이고 System Class Loader하위에 User defined class loader를 만들어 WAS나 Framwork내에서 사용된다.





    Class Loader Work

    "파일로 존재하는 Class을 Runtime Memory에 타입으로 만드는 작업을 Class Loader Work라한다.

    Loading

    binary 형태의 Type을 JVM 메모리에 올리는 과정


    Linking

    Loading된 Class를 Runtime 상태의 Binary type data로 구성하는 과정

    Vertification : JVM에서 사용가능한가?

    Preparation : Type이 필요로 하는 Memory를 할당해 주는 작업

    Resolution : 실제 메모리 주소값으로 변경


    Initialization

    초기화 작업




    웹 애플리케이션 컨테이너

    웹 애플리케이션 컨테이너란? 웹 애플리케이션이 배포되는 공간을 뜻하며 정적인 파일들을 전달해 주는 역할을 하는 서버를 웹서버라 하고 PHPM JSP, ASP와 같은 언어들을 사용해서 동적인 데이터를 전달하는것을 웹어플리에키션 Web Application 또는 WAS, 웹 어플리케이션 컨테이너라고 말한다,

    하지만 요즘엔 대부분 동적인 데이터를 다루기 때문에 크게 웹서버, WAS을 구분하지는 않는것 같다.



    War

    WAR는 Web Application Archive / Resource을 축약해서 말한다.
    war파일을 압출을 풀면 WEB-INF파일이 있고, 웹 애플리케이션 컨테이너는 war파일의 WEB-INF 폴더를 기준으로 클래스 파일들을 로드 한다.


    디렉토리구조

    - web archive

        - content directory : html, js, css

            - WEB-INF : web.xml
                - classes : .class(자바 파일)
                - libs : 라이브러리 jar



    서블릿 컨테이너와 클래스 로더

    웹 애플리케이션 클래스 로더는 사용자가 정의한 클래스로더에 해당된다.

    웹 애플리케이션 컨테이너는 웹 애플리케이션 자체 API를 제공하기 위해 컨테이너를 로드하는 클래스로더가 필요하고 

    사용자가 추가한 JSP, WAR파일들을 다루기 위한 ServerletContext Loader을 사용


    [Next Servlet]

    댓글

Designed by Tistory.