TIL 2021.04.25 [Java/Servlet]

Kyu·2021년 4월 25일
0

TIL

목록 보기
105/322

오늘은 서블릿에 대해서 배워봄.

서블릿이란 웹이라는 환경을 통해서 실행되어지는 웹 서버 어플리케이션을 이루는 작은 하나의 단위라고 할 수 있다.

그러니까 그 작은 단위들이 모여서 하나의 웹 서버 어플리케이션을 이루는 것이다.

예를 들어서 사용자가 웹에서 http://kyu.com/home 이라는 URL로 REQUEST 했을 때, home이라는 URL을 매핑해서 특정 서블릿이 나오도록 할 수 있다.


서블릿을 이해하기위해 오늘은 WAS의 한 종류인 톰캣을 설치해서 다음 순서로 서블릿을 실행해봤다.

  1. 톰캣깔기
  2. 서비스 메서드를 통해서 서블릿 생성
  3. 만든 서블릿.java 컴파일해서 WEB-INF/classes 폴더에 넣기
  4. web.xml에 서블릿에 매핑을 위한 url 정보 추가하기

IDE없이 이 과정을 해보면, 일단 톰캣을 아무데나 압축을 풀어서 ./webapps/ROOT/WEB-INF/classes 경로로 들어가서 클래래스 파일을 넣어주면 된다. 그리고 WEB-INF에 있는 web.xml 파일에 추가한 서블릿의 매핑정보를 적어주면 된다.

좀더 자세히해보자면

import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;

public class Kyu extends HttpServlet {

	public void service(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {

		OutputStream os = response.getOutputStream();
		PrintStream out = new PrintStream(os, true);
		out.println("Hello World!");
	}
}

이런식으로 HttpServlet을 extend 하고 service()를 오버라이딩한다. 파라미터로 Request, response를 넣어주고,
적절한 구현코드를 넣는다.

이걸 컴파일해서 WEB-INF/classes 에 넣고, web.xml은 다음과 같이 서블릿정보를 추가해준다.

<servlet>
	<servlet-name>kyu</servlet-name>
	<servlet-class>Kyu</servlet-class>
</servlet>

<servlet-mapping>
	<servlet-name>kyu</servlet-name>
	<url-pattern>/hello</url-pattern>
</servlet-mapping>

web.xml에 서블릿정보를 추가안해주면, 정적페이지와 달리 작성한 클래스의 결과물에 접근을 할수없다.
톰캣 내에 WEB-INF는 외부에서 접속이 애초에 차단이 되어있다고 한다. 그래서 web.xml에 저런식으로 추가해줘야한다.

그러면 대충 짐작가듯이 url-pattern 대로 넣어주면 servlet-name과 일치하는 servlet을 찾아서 servlet-class에 명시된 클래스파일을 response하게 된다.

IDE 없이 걍 톰캣을 실행하려면 start.sh로 웹서버를 실행시켜서 확인하면 된다.


읽을거리:
Web Server VS Web Application Server

WAS의 특징에 대해 잘 나와있는거 같음. 서블릿에 대해서 이렇게 실습해보고 읽어보면 웹어플리케이션에 대해 좀더 이해가 가능할것같다.

profile
TIL 남기는 공간입니다

5개의 댓글

comment-user-thumbnail
2021년 4월 25일

정말 멋있습니다.

2개의 답글
comment-user-thumbnail
2021년 4월 25일

읽을거리를 읽어보면 WAS를 서블릿 컨네이너라고도 하는데, 이를 통해서 서블릿이 뭔지 더 명확하게 이해할 수 있다.

답글 달기
comment-user-thumbnail
2021년 4월 25일

내가 했던 것 좀 더 구체적인 과정

  1. Web Server는 웹 브라우저 클라이언트로부터 HTTP 요청을 받는다.
  2. Web Server는 클라이언트의 요청(Request)을 WAS에 보낸다.
  3. WAS는 관련된 Servlet을 메모리에 올린다.
  4. WAS는 web.xml을 참조하여 해당 Servlet에 대한 Thread를 생성한다. (Thread Pool 이용)
  5. HttpServletRequest와 HttpServletResponse 객체를 생성하여 Servlet에 전달한다.
    5-1. Thread는 Servlet의 service() 메서드를 호출한다.
    5-2. service() 메서드는 요청에 맞게 doGet() 또는 doPost() 메서드를 호출한다.
    5-3. protected doGet(HttpServletRequest request, HttpServletResponse response)
  6. doGet() 또는 doPost() 메서드는 인자에 맞게 생성된 적절한 동적 페이지를 Response 객체에 담아 WAS에 전달한다.
  7. WAS는 Response 객체를 HttpResponse 형태로 바꾸어 Web Server에 전달한다.
  8. 생성된 Thread를 종료하고, HttpServletRequest와 HttpServletResponse 객체를 제거한다.

출처: https://gmlwjd9405.github.io/2018/10/27/webserver-vs-was.html

답글 달기