Spring Boot

서블릿 비교

해달's code 2024. 12. 1. 00:27

Servlet 인터페이스 사용시

@WebServlet("/calculate")
public class CalculatorServlet implements Servlet {
    private static final Logger log = LoggerFactory.getLogger(CalculatorServlet.class);
    private ServletConfig servletConfig;

    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        log.info("init");
        this.servletConfig = servletConfig;

    }

    @Override
    public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
        log.info("service");
        int operand1 = Integer.parseInt(request.getParameter("operand1"));
        String operator = request.getParameter("operator");
        int operand2 = Integer.parseInt(request.getParameter("operand2"));

        int result = Calculator.calculate(new PositiveNumber(operand1), operator, new PositiveNumber(operand2));

        PrintWriter writer = response.getWriter();
        writer.println(result);
    }

    @Override
    public ServletConfig getServletConfig() {
        return this.servletConfig;
    }

    @Override
    public String getServletInfo() {
        return "";
    }

    @Override
    public void destroy() {

    }
}

사용하지 않는 메서드도 구현을 필수적으로 해줘야하는게 단점이다.

 

GenericServlet 사용시

@WebServlet("/calculate")
public class CalculatorGenericServlet extends GenericServlet {
    private static final Logger log = LoggerFactory.getLogger(CalculatorGenericServlet.class);

    @Override
    public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException {
        log.info("service");
        int operand1 = Integer.parseInt(request.getParameter("operand1"));
        String operator = request.getParameter("operator");
        int operand2 = Integer.parseInt(request.getParameter("operand2"));

        int result = Calculator.calculate(new PositiveNumber(operand1), operator, new PositiveNumber(operand2));

        PrintWriter writer = response.getWriter();
        writer.println(result);
    }
}

service 메서드만 재정의 해줘도 사용이 가능하다.

 

HttpServlet 사용시

@WebServlet("/calculate")
public class CalculatorHttpServlet extends HttpServlet {
    private static final Logger log = LoggerFactory.getLogger(CalculatorHttpServlet.class);

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        log.info("service");
        int operand1 = Integer.parseInt(request.getParameter("operand1"));
        String operator = request.getParameter("operator");
        int operand2 = Integer.parseInt(request.getParameter("operand2"));

        int result = Calculator.calculate(new PositiveNumber(operand1), operator, new PositiveNumber(operand2));

        PrintWriter writer = response.getWriter();
        writer.println(result);
    }

}

doGet, doPost, doPut, doDelete과 같이 각 해당하는 요청을 재정의 해서 사용할수 있다.

 

각 서블릿은 해당 요청

GET http://localhost:8080/calculate?operand1=20&operator=%2b&operand2=10

요청시 주의 할 점 

예약어나 아스키코드에 포함되지 않는 문자(한글)은 URL인코딩 하여 사용해야함

-, *, /는 상관없으나 + 사용시 예약어이기 때문에 500에러 발생

+를 %2b로 바꾸어서 사용

한글은 %16진수2자리%16진수2자리%16진수2자리 방식

%EC%A0%95