서블릿에 대해서 개념에 대해서 인지를 잘 못하고 있었고, 이를 바로잡기 위해서 글을 통해서 개념을 확고히 하고자 해당 글을 작성한다.
클라이언트 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술이다.
서블릿은 클라이언트의 요청에 동적으로 응답하여 서버 측에서 데이터를 가공하고 결과를 생성하는 데 사용되기 때문!
Java 코드 내에서 HTML을 생성하여 클라이언트에게 동적인 웹 페이지를 제공
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
request.setCharacterEncoding("utf-8");
response.setContentType("text/html; charset=utf-8");
PrintWriter out = response.getWriter();
out.println("<html>");
out.println("<head><title>인사</title></head>");
out.println("<body>");
out.println("안녕하세요, ");
out.println(request.getParameter("name"));
out.println("님");
out.println("</body></html>");
}
각 클라이언트 요청에 대해 새로운 스레드를 생성하여 병렬처리를 지원한다.
서블릿은 MVC (Model-View-Controller) 패턴에서 Controller 역할을 수행합니다. 클라이언트의 요청을 받아 비즈니스 로직을 처리하고 결과를 View에 전달합니다.
@WebServlet(urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
....
}
HttpServlet 클래스를 상속받아서 HTTP 프로토콜을 기반으로 클라이언트와 통신하는 서블릿을 개발합니다.
서블릿은 Java 코드로 작성되기 때문에 HTML이나 프론트엔드 부분을 변경할 때마다 서블릿 코드를 수정하고 재컴파일해야 하는 번거로움이 있습니다.
서블릿은 TCP 기반의 HTTP 프로토콜을 사용하며, 이는 신뢰성과 안정성을 제공하나 처리 속도는 UDP보다 느릴 수 있습니다.
1.사용자(클라이언트)가 URL을 입력하면 HTTP Request가 Servlet Container로 전송합니다.
2. 요청을 전송받은 Servlet Container는 HttpServletRequest, HttpServletResponse 객체를 생성합니다.
3. web.xml을 기반으로 사용자가 요청한 URL이 어느 서블릿에 대한 요청인지 찾습니다.
위 해당 예시처럼 찾은 다음 아래와 같은 Servlet을 찾아냄
4. 해당 서블릿에서 service메소드를 호출한 후 클리아언트의 GET, POST여부에 따라 doGet() 또는 doPost()를 호출합니다.
5. doGet() or doPost() 메소드는 동적 페이지를 생성한 후 HttpServletResponse객체에 응답을 보냅니다.
6. 응답이 끝나면 HttpServletRequest, HttpServletResponse 두 객체를 소멸시킵니다.
위와 같은 과정을 쉽게 도와주기 위해서는 서블릿 컨테이너가 필요한데 이러한 서블릿 컨테이너는 Servlet 클래스의 규칙에 맞게 서블릿을 관리해주고 container에서 HttpServletRequest, HttpServletResponse두 객체를 생성하며 Get, Post여부에 따른 동적인 페이지를 생성하여 응답을 보낸다.
즉, 서블릿 컨테이너의 중요한 역할 중 하나는 서블릿 클래스의 인스턴스 생성
, 요청 URL과 서블릿 인스턴스 매핑
, 클라이언트 요청에 해당하는 서블릿을 찾은 후 서블릿에 작업을 위임
하는 역할을 한다.
웹서버와 통신 지원
서블릿 컨테이너는 서블릿과 웹서버가 손쉽게 통신할 수 있게 해줍니다. 소켓을 만들고 listen, accept 등을 API로 제공하여 복잡한 과정을 생략할 수 있게 해준다.
서블릿 생명주기 관리
서블릿 컨테이너는 서블릿의 탄생과 죽음을 관리합니다.
1. 서블릿 클래스를 로딩하여 인스턴스화
2. 초기화 메서드를 호출
3. 요청이 들어오면 적절한 서블릿 메소드를 호출
4. 서블릿 소멸 시 Garbage Collection을 진행
멀티쓰레드 지원 및 관리
원래는 쓰레드를 관리해야 하지만 서버가 다중 쓰레드를 생성 및 운영해주니 쓰레드의 안정성에 대해서 걱정하지 않아도 됩니다.
선언적 보안 관리
일반적으로 보안관리는 XML 배포 서술자에 다가 기록하므로, 보안에 대해 수정할 일이 생겨도 자바 소스 코드를 수정하여 다시 컴파일 하지 않아도 보안관리가 가능합니다.
📌 Servlet : HttpServlet을 상속하고, doGet 메소드와 doPost 메소드를 오버라이딩하여 웹을 다룰 수 있도록 하는 자바 클래스
📌 Servlet Container : 서블릿의 생명주기를 관리하며 웹 환경에서 서블릿이 구동될 수 있도록 해주는 프로그램
Servlet을 공부하면서 웹 백엔드의 기초가 되는 지식들을 기반한 개발이구나 라는 생각이 많이 들었다. 또한 이러한 기술들을 우리는 무의식속에 사용을 해왔고 이렇게 지속적으로 발전했다라는 사항을 알 수 있었다
출처
https://mangkyu.tistory.com/14
https://velog.io/@betterfuture4/Spring-Dispatcher-Servlet-%EC%A0%95%EB%A6%AC
https://www.nowwatersblog.com/backend/directory/servlet#%EC%84%9C%EB%B8%94%EB%A6%BF%EC%9D%98%EC%83%9D%EB%AA%85%EC%A3%BC%EA%B8%B0
https://velog.io/@yoho98/%EC%84%9C%EB%B8%94%EB%A6%BFServlet%EA%B3%BC-%EC%84%9C%EB%B8%94%EB%A6%BF-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88Servlet-Container-y88kny7g