티스토리 뷰

donaricano-btn
반응형

이제 어떤 url에 어떤 클래스를 로드해야 하는지를 알게 되었습니다. 이 때 로드하는 클래스가 바로 동적으로 페이지를 만들어 내는 Servlet이 됩니다. 동적으로 페이지를 만드는 것은 제가 만드는 Web Application Server 에서 가장 중요한 역할이라고 할 수 있고 사실 이 프로젝트의 핵심입니다.

 

먼저 Servlet 클래스를 만들도록 하겠습니다. 이 Web Application Server 를 사용하는 사용자는 이 Servlet 클래스를 상속받아서 사용하게 됩니다.

 

public class Servlet {

    private static final String GET = "GET";
    private static final String POST = "POST";
    private static final String PUT = "PUT";
    private static final String DELETE = "DELETE";

    public void init() {

    }

    public void service(HTTPServletRequest request, HTTPServletResponse response) {
        String method = request.getMethod();
        switch (method) {
            case GET:
                doGet(request, response);
                break;
            case POST:
                doPost(request, response);
                break;
            case PUT:
                doPut(request, response);
                break;
            case DELETE:
                doDelete(request, response);
            default:
                break;
        }
    }

    public void doGet(HTTPServletRequest request, HTTPServletResponse response) {

    }

    public void doPost(HTTPServletRequest request, HTTPServletResponse response) {

    }

    public void doPut(HTTPServletRequest request, HTTPServletResponse response) {

    }

    public void doDelete(HTTPServletRequest request, HTTPServletResponse response) {

    }

    public void destroy() {

    }
}

Servlet 은 기본적으로 초기화를 담당하는 init() 메소드, 마지막에 호출되는 destroy() 메소드를 가지고 있습니다. 컨테이너는 Servlet instance를 생성한 후 init() 메소드를 호출하게 되고, instance가 소멸할 때 destroy() 메소드를 호출합니다.

 

중요한 것은 매핑된 url로 요청이 들어오면 service() 메소드가 실행된다는 것입니다. service() 메소드는 요청 메소드를 파악해서 해당하는 메소드(doGet, doPost 등)를 실행시킵니다. 

 

Servlet 클래스를 상속받은 하위 클래스에서 http 메소드에 해당하는 메소드를 override 하고 그 overide된 메소드가 실질적으로 작업을 수행하게 됩니다.

 

이제 이 Servlet을 상속받은 클래스를 로드하는 코드를 보도록 하겠습니다.

    public void loadClass(String urlPath) {
        if (hasInstance(urlPath)) {
            return;
        }
        try {
            File file = new File(APP_ROOT + servletMap.get(urlPath));
            URLClassLoader urlClassLoader = new URLClassLoader(new URL[]{file.getParentFile().toURI().toURL()});
            Class clazz = urlClassLoader
                    .loadClass(servletMap.get(urlPath).substring(servletMap.get(urlPath).lastIndexOf(File.separator)+1));
            Servlet instance = (Servlet) clazz.newInstance();
            instanceMap.put(urlPath, instance);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (MalformedURLException e) {
            e.printStackTrace();
        }
    }

우선 Servlet 객체를 저장하는 instance 맵에 요청받은 url에 해당하는 instance가 존재하는지를 확인합니다. 만약 존재한다면 클래스 로딩은 그냥 무시하도록 합니다.

 

만약 그런 객체가 존재하지 않는다면 매핑된 위치에 있는 클래스를 URLClassLoader를 이용해서 로드합니다. 그리고 그 서블릿의 객체를 생성하고 instanceMap에 저장합니다. 

 

이제 WAS가 동적으로 페이지를 생성해 낼 준비는 모두 마쳤습니다. 다음주에는 스레드 풀을 구현해서 컨테이너가 요청을 받을 때 마다 스레드를 가져와서 처리할 수 있도로 하는 작업을 해 보도록 하겠습니다.

반응형
donaricano-btn
댓글
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함