서블릿(Servlet) 요청과 응답 : 코드로 배우기!!

Federico-15·2025년 1월 20일

스프링 공부

목록 보기
6/8

서블릿의 개념을 이해했다면, 이제 실제로 서블릿을 구현하여 클라이언트의 요청을 처리하고 응답을 반환하는 과정을 살펴볼 차례입니다.

이번 포스트에서는 서블릿을 통해 웹 브라우저의 요청을 받아들이고, 파라미터 및 헤더 정보를 처리한 후, 클라이언트에게 응답을 반환하는 방법을 실습해보겠습니다.

다음과 같은 순서로 포스트를 할 예정입니다!

  • HTTP 요청 파라미터 처리 방법
  • HTTP 요청 헤더 조회 및 활용
  • GET 및 POST 요청 처리 방식
  • 클라이언트에게 적절한 응답을 반환하는 방법

1. HTTP 요청 파라미터 처리 방법

클라이언트가 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

2. HTTP 요청 헤더 조회 및 활용

클라이언트가 전송한 요청 헤더를 조회하고, 필요한 정보를 추출하는 방법을 살펴보겠습니다.

예제: 요청 헤더 조회 (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)


3. GET 및 POST 요청 처리 방식

서블릿에서 클라이언트의 요청 메서드(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>");
    }
}

요청 예시 :

  • GET 요청 : http://localhost:8080/method
  • POST 요청(폼 데이터 전송):
<form action="http://localhost:8080/method" method="POST">
    <input type="text" name="name">
    <button type="submit">Submit</button>
</form>

응답 예시 :

  • GET 요청 응답:
<h1>GET 요청을 처리합니다.</h1>
  • POST 요청 응답(name=John):
<h1>POST 요청: Hello, John!</h1>

4. 클라이언트에게 적절한 응답을 반환하는 방법

클라이언트에게 텍스트, 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>

5. 결론

서블릿에서 요청을 받고 응답을 처리하는 다양한 방법을 예제를 통해 살펴보았습니다. 서블릿은 웹 애플리케이션의 기본 동작 원리를 이해하는데 중요한 기술입니다. 특히, 스프링 부트의 내부 동작에 대해서 알기 위해서 서블릿이라는 개념은 꼭 알아야합니다.

저 또한, 서블릿에 대한 개념을 모르고 스프링부트로 바로 프로젝트를 진행했던 저는 이러한 의문을 가졌습니다.

'스프링부트로 다 되는거 아닌가?'

저 역시 처음에는 스프링 부트로 프로젝트를 진행하면서 서블릿을 몰라도 충분하다고 생각했습니다. 하지만 스프링부트에 대해서 공부를 하며, 스프링 부트가 자동으로 해주는 부분들을 제대로 이해하지 못한다면, 문제가 발생했을 때 원인을 찾기가 어렵고, 해결 과정도 더딜 수 있다는 것을 깨달았습니다.

결국, 스프링 부트는 서블릿을 자동으로 설정하고 관리해주는 프레임워크라고 보면 됩니다.

스프링 부트는 서블릿의 복잡한 설정을 자동화하여 개발자가 더욱 효율적으로 웹 애플리케이션을 개발할 수 있도록 돕지만, 서블릿의 동작 원리를 알고 나면 스프링 부트가 어떤 방식으로 요청을 처리하고 응답을 생성하는지 더 잘 이해할 수 있습니다.

서블릿을 배우고 나서야 비로소 스프링 부트가 웹 애플리케이션을 얼마나 간편하게 만들어주는지 실감할 수 있었습니다.

다음 포스트에서는 스프링 부트가 서블릿을 자동으로 설정하는 과정스프링 MVC의 동작 원리를 통해 두 개념을 어떻게 연결할 수 있는지 알아보겠습니다.

다음 포스트에서 뵈어요 !!!!!!

profile
한 방 있는, 묵직한 개발자

0개의 댓글