티스토리 뷰
이제 어떤 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가 동적으로 페이지를 생성해 낼 준비는 모두 마쳤습니다. 다음주에는 스레드 풀을 구현해서 컨테이너가 요청을 받을 때 마다 스레드를 가져와서 처리할 수 있도로 하는 작업을 해 보도록 하겠습니다.
'language > Servlet&JSP' 카테고리의 다른 글
[WAS] Web Application Server 구현하기 - 6. 스레드 구현 (0) | 2019.06.08 |
---|---|
[WAS] Web Application Server 구현하기 - 4. 배포서술자 읽고 서블릿 매핑하기 (0) | 2019.05.19 |
[WAS] Web Application Server 구현하기 - 3. 정적파일 전송하기 (0) | 2019.05.01 |
[WAS] Web Application Server 구현하기 - 2. HTTP Request 받기 (0) | 2019.04.28 |
[WAS] Web Application Server 구현하기 - 1. 구현 기능 (0) | 2019.04.24 |
- Total
- Today
- Yesterday
- 디자인패턴
- REST API
- 전략패턴
- 로그
- Spring in Action
- Warning
- DP
- 자바스크립트 개론
- 마르코프 연쇄
- 문장 생성기
- 크롬
- Count
- was
- CONVENTIONS
- 코딩의 기술
- RESTful
- 자바스크립트개론
- html
- java
- 동적계획법
- markov chain
- GROUP BY
- 경고
- 몰라서망신
- restful api
- 유지보수
- 야근
- 클린코드
- 마르코프
- Markov
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |