솔솔

[Tomcat] 클라이언트 GET 요청 시 서블릿까지 동작 원리 본문

나의보물들/Tomcat

[Tomcat] 클라이언트 GET 요청 시 서블릿까지 동작 원리

솔솔하네 2024. 8. 8. 00:00

🍀 클라이언트 GET 요청 시 서블릿 컨테이너 동작 원리


1. 클라이언트가 특정 URL로 GET 요청을 보냄

 - 이 요청은 URL, URL 파라미터(쿼리 스트링), 헤더 정보를 포함

<a href="board?command=list">

 

2. 요청이 웹 서버(Apache, Nginx 등)에 도착

 

3. 웹 서버는 이 요청을 적절한 서블릿 컨테이너(Tomcat, Jetty 등)에 전달

 

4. 서블릿 컨테이너가 요청을 처리

 - 서블릿 컨테이너는 HTTP 요청을 받아 HttpServletRequest 객체로 변환

 

5. 서블릿이 요청을 처리

 - 서블릿 컨테이너는 요청 URL에 매핑된 서블릿을 찾음.

 - 해당 서블릿의 doGet 메소드가 호출됨.

 - 서블릿은 HttpServletRequest 객체를 통해 요청 정보를 접근하고, HttpServletResponse 객체를 통해 응답을 생성함.

 

6. 요청 처리가 끝나면 HttpServletRequest, HttpServletResponse 객체 소멸

제가 이해한대로 시스템 다이어그램을 그려봤는데 이상한 부분있으면 피드백 꼭 부탁드리겠습니다.

 

🍀 HttpServletRequest 객체의 주요 메소드


  • getParameter(String name): 쿼리 스트링에 있는 특정 파라미터의 값을 반환
  • getParameterMap(): 모든 파라미터의 맵을 반환
  • getHeader(String name): 요청 헤더의 값을 반환
  • getCookies(): 요청에 포함된 쿠키 배열을 반환
  • getMethod(): 요청 메소드를 반환(예: "GET")
  • getRequestDispatcher(): 현재 요청을 지정된 리소스로 포워딩. 클라이언트의 브라우저에는 아무런 변화가 없으며, 서버 측에서 요청을 처리하는 리소스만 변경(예: request.getRequestDispatcher("리소스").forward(request, response))

 

🍀 HttpServletResponse 객체의 주요 메소드


  • getWriter():  응답의 바디를 작성할 수 있는 PrintWriter 객체를 반환. 문자열 데이터를 전송할 때 사용
  • setContentType(): 답의 MIME 타입을 설정
  • setCharacterEncoding(): 응답의 문자 인코딩을 설정
  • sendRedirect(): 클라이언트를 다른 URL로 리다이렉트. 클라이언트는 지정된 URL로 새 요청을 보냄

 

🍀 서블릿 파일 생성


import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/board")
public class BoardController extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 요청 파라미터 받기
		String command = request.getParameter("command");
		if(command == null) {
			command = "list";   
		}

        // 응답 설정
        response.setContentType("text/html");
        response.setCharacterEncoding("UTF-8");

        // 응답 바디 작성
        response.getWriter().write("<html><body>");
        response.getWriter().write("<h1>Hello, " + name + "!</h1>");
        response.getWriter().write("</body></html>");
    }
}

 

 

 

 

 

 

☁️ 마이 띵킹 ☁️

오늘 서블릿 공부를 하면서 재미있는 경험을 했다. 어느 정도 사이클을 이해하고 있다고 생각했는데 짝꿍이 클라이언트의 요청 시 서블릿까지의 동작 원리에 대해 궁금해 했다. 그 모습을 보니 내가 어느 정도 알고 있다고 생각한 부분도 다시 한번 점검할 필요가 있겠다는 생각이 들었다. 짝꿍이 이해하지 못하는 부분을 물어보면서 서블릿 사이클의 동작 원리에 대해 좀 더 깊이 찾아보았다. 자료를 찾아보면서 기본적인 사이클을 다시 정리하고 동작 원리를 명확하게 이해하기 위해 시스템 다이어그램을 그려봤다.
직접 다이어그램을 그려보니 머리로만 생각하는 것보다 훨씬 더 이해가 잘 되는것 같았다. 시각적으로 표현하니까 동작 흐름이 더 명확하게 보이고 기억에도 오래 남을 것 같다.