< 2024.10.23 업로드 >
안녕하세요! SSAFYcial 12기 기자단 안수진입니다.
최근 저는 Backend 커리큘럼을 통해 Spring을 학습하고 있습니다.
이전에도 Spring Boot를 사용하여 서비스를 개발한 경험이 있지만,
그때는 깊이 있는 이해 없이 개발을 진행한 것 같다... 아직 많이 부족하다는 것을 많이 느끼는 요즘이에요...🤣
이번 기회에 Servlet의 동작 원리부터 Spring으로 발전하는 과정을 차근차근 살펴보며, 함께 지식을 쌓아가 봅시다!
💡 Servlet의 탄생
📌 초기 웹 서비스
웹 서비스가 처음 등장했을 때, 제공되는 페이지는 주로 정적 콘텐츠로 구성되었습니다.
HTML 파일을 단순히 클라이언트에게 제공하는 방식이었죠. 이 방식은 데이터가 변하지 않는 상황에서는 괜찮았지만, 사용자 요청에 따라 동적 콘텐츠를 제공할 필요성이 생기기 시작했습니다.
🔖 정적 페이지
- 웹 서버에 이미 저장된 파일(HTML, CSS, 이미지 등)을 클라이언트에게 전송하는 웹 페이지
- 사용자는 서버에 저장된 데이터가 변경되지 않는 한 고정된 웹 페이지를 계속 보게 된다.
- 즉, 모든 사용자는 같은 결과의 웹 페이지를 서버에 요청하고 응답 받게 된다.
📌 WAS (Web Application Server)
로직을 수행해서 동적 컨텐츠 생성
이러한 요구를 충족하기 위해 WAS가 등장했습니다.
WAS는 클라이언트의 요청을 받아서 서버에서 비즈니스 로직을 수행한 뒤
그 결과를 사용자에게 반환하는 역할을 합니다. 이를 통해 동적 페이지가 가능해졌습니다.
🔖 동적 페이지
- 서버에 저장된 HTML 파일이 그대로 브라우저에 나오는 것이 아니라 동적으로 만들어지는 웹 페이지
- 정적 웹 페이지와 달리 서버 측에서 데이터를 처리하여 동적으로 HTML 파일을 만들기 때문에 로딩 속도가 느리다.
💡 Servlet 이란?
Servlet은 자바 기반의 웹 애플리케이션 프로그래밍 기술로, 클라이언트 요청에 따라
동적 컨텐츠를 생성하는 데 사용됩니다. Servlet은 Java 객체로, 요청을 받아서
서버 측에서 로직을 처리한 후 그 결과를 클라이언트에게 전달하는 역할을 합니다.
📌 Servlet과 JSP, 다른걸까?
Serlvet과 JSP는 모두 서버 측에서 동적인 웹 페이지를 생성하는데 사용하지만,
그 접근 방식과 용도가 다릅니다!!
🔖 Servlet
- 자바 코드 기반으로 동적인 HTML을 생성
- 주로 비즈니스 로직을 처리하는 데 사용되며, 복잡한 데이터 처리에 유리
- 자바 코드 안에서 HTML 태그를 작성하기 때문에, 가독성이 떨어질 수 있지만, 로직 처리에 강점
🔖 JSP (Jakarta Server Pages)
- HTML 코드 안에 자바 코드를 삽입하여 동적인 페이지를 쉽게 작성할 수 있는 기술
- JSP는 주로 뷰(HTML 렌더링)에 사용되며, 복잡한 비즈니스 로직은 최소화하는 것이 일반적
- JSP는 HTML에 특화되어 있어 프론트엔드 개발자가 쉽게 사용할 수 있다.
📌 Servlet은 어떻게 동적인 컨텐츠를 만들까?
Servlet은 요청이 들어오면 service() 메서드를 통해 ServletRequest 객체로 받은 요청을
비즈니스 로직으로 처리한 후, 그 결과를 ServletResponse 객체로 응답합니다.
이 과정에서 요청에 맞는 동적인 컨텐츠가 생성됩니다.
♼ Servlet의 라이프 사이클
생성자 → init → service → destroy
1. 생성자 호출 (생성 단계)
public LifeServlet2() {
System.out.println("생성자");
}
서블릿이 처음 요청을 받을 때 서블릿 인스턴스가 생성되며, 생성자가 호출됩니다.
2. init() 메서드 호출 (초기화 단계)
@Override
public void init() {
System.out.println("초기화");
}
서블릿이 생성된 후, init() 메서드가 한 번 호출되어 초기화 작업을 수행합니다.
3. service() 메서드 호출 (서비스 단계)
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) {
System.out.println("service");
}
클라이언트의 요청이 들어오면 service() 메서드가 호출되어, 요청에 맞는 doGet() 또는 doPost() 메서드를 실행합니다.
4. destroy() 메서드 호출 (소멸 단계)
@Override
public void destroy() {
System.out.println("소멸자");
}
서블릿이 더 이상 필요 없을 때 destroy() 메서드가 호출되어 자원을 정리합니다.
이렇게 서블릿은 생성부터 소멸까지 생명주기(Lifecycle)를 가집니다.
💡 Servlet을 직접 구현해서 알아보자!
Servlet을 구현할 때 자주 사용되는 클래스는 HttpServlet입니다.
HttpServlet은 doGet(), doPost(), doPut()과 같은 메서드를 가지고 있어
HTTP 요청 방식에 따라 다르게 응답을 처리할 수 있습니다.
📌 Servlet 등록
Servlet을 사용하기 위해서는 Servlet을 등록해야 합니다. 등록 방법은 크게 두 가지로 나뉩니다.
1. web.xml 파일을 이용한 등록
<servlet>
<servlet-name>paramServlet</servlet-name>
<servlet-class>com.ssafy.test.ParamServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>paramServlet</servlet-name>
<url-pattern>/param</url-pattern>
</servlet-mapping>
2. @WebServlet 어노테이션을 이용한 등록
@WebServlet("/param")
public class ParamServlet extends HttpServlet {
// Servlet 구현
}
📌 Servlet을 이용한 웹 요청과 응답 과정
- 클라이언트가 웹 브라우저에서 특정 URL로 요청을 보냅니다.
- 이 요청은 WAS에 도달하고, WAS는 해당 URL과 매핑된 Servlet을 호출합니다.
- Servlet은 요청을 받아 비즈니스 로직을 처리한 후, 그 결과를 응답으로 돌려줍니다.
- 클라이언트는 그 결과를 웹 브라우저에서 확인할 수 있습니다.
ParamServlet.java
package com.ssafy.test;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
@WebServlet("/param")
public class ParamServlet extends HttpServlet {
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=utf-8");
PrintWriter out = response.getWriter();
String age = request.getParameter("age"); // getParameter는 String으로 반환한다.
out.print("<html>");
out.print("<h3> 안수진(SSAFY)님 안녕하세요!! </h3>");
out.print("나이는 "+ age + "세 입니다.");
out.print("</html>");
}
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
doGet(request, response);
}
}
위 서블릿을 실행시키면 아래와 같은 화면을 확인할 수 있다.
하지만 모든 WAS가 Servlet 기술을 지원하는 것은 아니다
모든 WAS가 Servlet을 기본적으로 지원하는 것은 아닙니다. Servlet은 자바 기반의 웹 애플리케이션 기술이기 때문에, 자바를 지원하지 않는 WAS에서는 사용할 수 없습니다. 예를 들어, 자바 기반의 WAS인 Tomcat이나 Jetty는 Servlet을 지원하지만, 그렇지 않은 서버에서는 다른 기술을 사용해야 할 수도 있습니다.
💡 Servlet의 한계
Servlet은 자바 기반의 웹 애플리케이션에서 매우 유용한 기술이지만
복잡한 웹 애플리케이션에서는 몇 가지 한계가 있습니다.
예를 들어, 요청마다 별도의 Servlet을 작성해야 하며,
비즈니스 로직과 뷰가 혼재되어 유지보수와 확장성이 어려울 수 있습니다.
이러한 문제를 해결하기 위해 Spring MVC와 DispatcherServlet이 등장했습니다.
다음 편에서는 Spring MVC와 이를 기반으로 요청을 처리하는 DispatcherServlet에 대해 자세히 알아보겠습니다!!! 😆
🗂️ References
[Web] Web Server와 WAS의 차이와 웹 서비스 구조
👀 SSAFY의 다양한 소식과 이야기를 더 알고 싶다면
📌 SSAFYcial 인스타그램
📌 SSAFY 홈페이지
'SSAFY' 카테고리의 다른 글
[싸피셜이 알려드림: SSAFY편] SSAFY 12기 1학기 최종 관통 프로젝트 회고 (1) | 2024.12.21 |
---|---|
[싸피셜이 알려드림: SSAFY편] SSAFY 1학기 후기 (1) | 2024.12.21 |
[싸피셜이 알려드림: SSAFY편] 벌써 13기 모집? 알려줄게 SSAFY의 모든 것!! (0) | 2024.12.16 |
[싸피셜이 알려드림: 기술편] Socket 통신이 뭘까? (1) | 2024.12.16 |
[싸피셜이 알려드림: SSAFY편] SSAFY 12기 싸피셜이 알려주는 SSAFY 지원 꿀팁! (2) | 2024.12.16 |