Servlet의 등장배경
초창기 web은 정적 데이터만 전달하는 Web Server였음.
사용자의 요청에 따른 다양한 처리(동적인)가 불가능했다. 예를 들면 로그인 시 맞춤 팝업이 뜨거나 UI가 변경되거나.
그래서 등장한 것이 CGI(Common Gateway Interface)
CGI
CGI는 동적 데이터를 처리하는 Web Server와 프로그램 사이의 인터페이스(규약)
*인터페이스 : 상호 간의 소통을 위해 만들어진 물리적 매개체나 프로토콜
CGI는 Web Server의 요청을 받아 클라이언트에게 동적 컨텐츠를 전달한다.
클라이언트의 요청에 따라 Web Server에서 다른 프로그램을 요청하고, 해당 요청 결과를 클라이언트에게 보내는 방법(규약)을 정한 것이 CGI.
하지만 CGI는 문제가 있었다.
- Request가 있을 때마다 프로세스를 만들기 때문에 메모리 사용량이 높다. 사용자 수백명이 일시적으로 같은 요청을 하게 되면 해당 사용자 숫자만큼의 프로세스가 만들어지고, 이는 과부하 문제를 일으킨다.
- 같은 결과값을 전달하더라도 요청된 프로세스가 다르다면 같은 것을 여러개 만들어야만 한다.
이를 보완한 결과는 다음과 같다.
- Request가 있을 때 프로세스 대신 쓰레드를 만든다.
- 동일한 요청이 있을 시 최초 생성된 객체를 계속 사용하는 싱글턴 패턴(Singleton Pattern)을 사용한다.
상기 보완점을 적용하여 등장한 것이 Servlet.
Servlet
Servlet은 웹 프로그래밍에서 클라이언트의 요청을 동적으로 처리하기 위한 자바 기반의 서버 사이드 인터페이스.
Web Container
- 요청이 발생하면 쓰레드를 생성하고 Servlet을 실행시킨다. Servlet 인터페이스에 따라 Servlet을 관리한다.
- Servlet 인터페이스에는 메서드가 정의되어 있는데, 필요에 따라 호출한다.
- 각 메서드는 Container가 호출해준다.
메서드 종류
- init() : Servlet 인스턴스 생성(initialize)
- service() : 실제 기능이 수행되는 곳. Servlet 인터페이스를 구현한 것이 HttpServlet인데, HTTP Method(GET, POST, PUT, DELETE)에 따라 doGet(), doPost()와 메서드를 호출한다.
- destroy() : Servlet 인스턴스가 소멸. 일반적으로 container가 종료되는 시점에 destroy() 호출됨. 특정 Servlet 로드/언로드 시에도 사용된다.
코드로 살펴보자.
web.xml
- Web Container가 가지는 설정파일.
- WAS에게 Servlet 객체-URL 매핑 정보를 알려준다.
<web-app>
<!-- aliases 설정 -->
<servlet>
<servlet-name>welcome</servlet-name>
<servlet-class>servlets.WelcomeServlet</servlet-class>
</servlet>
<!-- 매핑 -->
<servlet-mapping>
<servlet-name>welcome</servlet-name>
<url-pattern>/welcome</url-pattern>
</servlet-mapping>
*서블릿의 이름을 welcome으로 하고,
"/welcome" URL로 요청이 들어왔을 때 servlets.WelcomeServlet을 실행하라는 내용.
</web-app>
Servlet 메서드
- web.xml에서 정의된 Servlet 메서드를 구현한다.
public class WelcomeServlet extends HttpServlet {
protected void doPost(HttpServletRequest req,
HttpServletResponse res) throws ServletException, IOException{
// Request의 파라미터를 받는다.(form field를 읽는다)
String userid = req.getParameter("userid");
String password = req.getParameter("password");
// Business Logic 처리.
String result = doSomething(userid, password);
// 결과값을 담은 View 생성.
String htmlResponse = "<html>";
htmlResponse += "<h2>Your userid is: " + username + "<br/>";
htmlResponse += "Your password is: " + password + "</h2>";
htmlResponse += "</html>";
// 클라이언트에게 결과값 전송.
PrintWriter writer = res.getWriter();
writer.println(htmlResponse);
}
}
사용자가 URL을 통해 요청했을 때 Servlet으로 어떻게 처리되는지 코드를 통해 알아보았다.
요청 URL마다 Servlet이 생성되고 생성된 Servlet을 Web Container가 인식할 수 있도록 web.xml에 URL과 Servlet을 매핑시켜준다.
참고
https://mangkyu.tistory.com/14
https://velog.io/@turtle601/Servlet%EC%9D%B4%EB%9E%80
https://gmlwjd9405.github.io/2018/10/29/web-application-structure.html
'Programming > 기초지식' 카테고리의 다른 글
[Gradle] Could not find method compile() arguments~ (0) | 2021.08.17 |
---|---|
클래스 vs 객체(오브젝트) vs 인스턴스 각각의 차이점 (0) | 2021.08.12 |
웹 서버 vs 웹 애플리케이션 서버 / Web Server vs WAS (0) | 2021.08.11 |
REST에 대한 정리 (0) | 2021.08.03 |
프로세스(Process)와 스레드(Thread)의 차이점 (0) | 2021.07.28 |