서블릿의 개념을 이해했다면, 이제 실제로 서블릿을 구현하여 클라이언트의 요청을 처리하고 응답을 반환하는 과정을 살펴볼 차례입니다.
이번 포스트에서는 서블릿을 통해 웹 브라우저의 요청을 받아들이고, 파라미터 및 헤더 정보를 처리한 후, 클라이언트에게 응답을 반환하는 방법을 실습해보겠습니다.
다음과 같은 순서로 포스트를 할 예정입니다!
클라이언트가 URL에 포함한 쿼리 파라미터를 처리하는 방법을 살펴보겠습니다.
예제: 요청 파라미터 처리 (getParameter)
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;
@WebServlet(name = "paramServlet", urlPatterns = "/param")
public class ParamServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 단일 파라미터 조회
String username = request.getParameter("username");
String age = request.getParameter("age");
response.setContentType("text/plain");
response.getWriter().write("Username: " + username + "\n");
response.getWriter().write("Age: " + age + "\n");
// 복수 파라미터 조회
String[] hobbies = request.getParameterValues("hobby");
for (String hobby : hobbies) {
response.getWriter().write("Hobby: " + hobby + "\n");
}
}
}
요청예시 :
http://localhost:8080/param?username=John&age=25&hobby=reading&hobby=cycling
응답예시 :
Username: John
Age: 25
Hobby: reading
Hobby: cycling
클라이언트가 전송한 요청 헤더를 조회하고, 필요한 정보를 추출하는 방법을 살펴보겠습니다.
예제: 요청 헤더 조회 (getHeader)
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.util.Enumeration;
@WebServlet(name = "headerServlet", urlPatterns = "/headers")
public class HeaderServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/plain");
// 모든 헤더 출력
Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
response.getWriter().write(headerName + ": " + request.getHeader(headerName) + "\n");
}
// 특정 헤더 조회
String userAgent = request.getHeader("User-Agent");
response.getWriter().write("User-Agent: " + userAgent + "\n");
}
}
요청 예시 :
브라우저에서 http://localhost:8080/headers 요청 시
응답 예시 :
host: localhost:8080
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64)
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64)
서블릿에서 클라이언트의 요청 메서드(GET,POST)에 따라 다르게 처리하는 방법을 살펴보겠습니다.
예제: GET 및 POST 요청 처리
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;
@WebServlet(name = "methodServlet", urlPatterns = "/method")
public class MethodServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html");
response.getWriter().write("<h1>GET 요청을 처리합니다.</h1>");
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setContentType("text/html");
String name = request.getParameter("name");
response.getWriter().write("<h1>POST 요청: Hello, " + name + "!</h1>");
}
}
요청 예시 :
http://localhost:8080/method<form action="http://localhost:8080/method" method="POST">
<input type="text" name="name">
<button type="submit">Submit</button>
</form>
응답 예시 :
<h1>GET 요청을 처리합니다.</h1>
<h1>POST 요청: Hello, John!</h1>
클라이언트에게 텍스트, JSON, HTML 등의 다양한 응답을 반환하는 방법을 살펴보겠습니다. 클라이언트에게 응답하는 건 요청보다 더 간단합니다. ㅎㅎ
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;
@WebServlet(name = "responseServlet", urlPatterns = "/response")
public class ResponseServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
// 텍스트 응답
response.setContentType("text/plain");
response.getWriter().write("Hello, plain text response!");
// JSON 응답
response.setContentType("application/json");
response.getWriter().write("{\"message\": \"Hello, JSON!\"}");
// HTML 응답
response.setContentType("text/html");
response.getWriter().write("<h1>Hello, HTML Response!</h1>");
}
}
요청 예시 :
http://localhost:8080/response
응답 예시 :
클라이언트가 브라우저에서 요청 시 다양한 포맷을 받아볼 수 있습니다.
Hello, plain text response!
{"message": "Hello, JSON!"}
<h1>Hello, HTML Response!</h1>
서블릿에서 요청을 받고 응답을 처리하는 다양한 방법을 예제를 통해 살펴보았습니다. 서블릿은 웹 애플리케이션의 기본 동작 원리를 이해하는데 중요한 기술입니다. 특히, 스프링 부트의 내부 동작에 대해서 알기 위해서 서블릿이라는 개념은 꼭 알아야합니다.
저 또한, 서블릿에 대한 개념을 모르고 스프링부트로 바로 프로젝트를 진행했던 저는 이러한 의문을 가졌습니다.
'스프링부트로 다 되는거 아닌가?'
저 역시 처음에는 스프링 부트로 프로젝트를 진행하면서 서블릿을 몰라도 충분하다고 생각했습니다. 하지만 스프링부트에 대해서 공부를 하며, 스프링 부트가 자동으로 해주는 부분들을 제대로 이해하지 못한다면, 문제가 발생했을 때 원인을 찾기가 어렵고, 해결 과정도 더딜 수 있다는 것을 깨달았습니다.
결국, 스프링 부트는 서블릿을 자동으로 설정하고 관리해주는 프레임워크라고 보면 됩니다.
스프링 부트는 서블릿의 복잡한 설정을 자동화하여 개발자가 더욱 효율적으로 웹 애플리케이션을 개발할 수 있도록 돕지만, 서블릿의 동작 원리를 알고 나면 스프링 부트가 어떤 방식으로 요청을 처리하고 응답을 생성하는지 더 잘 이해할 수 있습니다.
서블릿을 배우고 나서야 비로소 스프링 부트가 웹 애플리케이션을 얼마나 간편하게 만들어주는지 실감할 수 있었습니다.
다음 포스트에서는 스프링 부트가 서블릿을 자동으로 설정하는 과정과 스프링 MVC의 동작 원리를 통해 두 개념을 어떻게 연결할 수 있는지 알아보겠습니다.
다음 포스트에서 뵈어요 !!!!!!