본문 바로가기

WINK-(Web & App)/Spring Boot 스터디

[2025 1학기 스프링 부트 스터디] 남윤찬 #6주차

반응형

서블릿부터 jsp, mvc, 그리고 mvc 프레임워크를 만들면서 역사를 돌아보는 과정을 거칠 예정입니다.

서블릿은 결국 http 요청을 개발자가 받아서 응답을 내보내는 것을 편하게 하도록 하는 것이라는 것을 알고 가자.

프로젝트 생성

프로젝트를 만들면서 한 가지 다른 프로젝트와 다른 점이 생겼다면, 프로젝트의 메타데이터를 설정하는 단계에서 packaging을 Jar가 아닌 War로 고른다. 이 강의에서는 JSP도 공부해야하기 위함이라고 하니 잘 선택하도록 한다.

Hello 서블릿

스프링은 서블릿을 등록해서 쓸 수 있도록 @ServletComponentScan을 지원해서 편리하게 서블릿을 등록해서 쓸 수 있다.

@ServletComponentScan // 서블릿 자동 등록
@SpringBootApplication
public class ServletApplication {}

그리고 서블릿 객체를 하나 생성한다.

@WebServlet(name = "helloServlet", urlPatterns = "/hello")
// name: 서블릿 이름, urlPatterns: url 매핑
public class HelloServlet extends HttpServlet {

    @Override
    protected void service(
            HttpServletRequest request, 
            HttpServletResponse response) throws ServletException, IOException {}
}

서블릿 객체를 생성하고 스프링을 실행시키면 다음과 같은 과정을 거쳐 실행이 된다. http 요청이 들어오면 request, response를 미리 생성하고, servlet 객체를 거쳐 response를 채워 반환하게 된다.

HTTP 요청

-개요

http로 요청을 처리하는 방법에 대한 개요에 대한 내용은 HttpServletRequset 객체가 가지는 여러 메서드와 그것들을 활용해 request의 내용(start-line, header 등)을 조회하는 방법을 알 수 있었다. 이것들은 전부 알아두기보다는 서블릿이 작동할 때 어떤 기능들을 사용할 수 있는지, 스펙을 보는 정도의 학습으로 괜찮을 것 같다. 강사님도 복붙을 하셨으니..

이 뒤로는 GET으로 쿼리 파라미터가 넘어올 때, POST를 form 형태로 전송할 때, body를 포함해 http를 전송할 때(POST, PUT 등) 총 세 가지 요청 방법에 대해 서블릿으로 처리하는 방법을 다루게 된다.

GET 쿼리 파라미터

HttpServletRequest 객체에는 파라미터를 조회하는 메서드가 있는데 이를 이용하여 조회할 수 있다.

@WebServlet(name = "requestParamServlet", urlPatterns = "/request-param")
public class RequestParamServlet extends HttpServlet {
    @Override
    protected void service(
        HttpServletRequest request,
        HttpServletResponse response) throws ServletException, IOException {

        System.out.println("[전체 파라미터 조회] - Start");
        request.getParameterNames().asIterator()
                .forEachRemaining(paramName ->
                        System.out.println(paramName + " = " + request.getParameter(paramName)));

        System.out.println("[전체 파라미터 조회] - End");
        System.out.println();

        System.out.println("[단일 파라미터 조회] - Start");
        String username = request.getParameter("username");
        String age = request.getParameter("age");

        System.out.println("username = " + username);
        System.out.println("age = " + age);
        System.out.println("[단일 파라미터 조회] - End");
        System.out.println();

        System.out.println("[이름이 같은 복수 파라미터 조회] - Start");
        String[] usernames = request.getParameterValues("username");
        for (String name : usernames) {
            System.out.println("username = " + name);
        }
        System.out.println("[이름이 같은 복수 파라미터 조회] - End");

        response.getWriter().write("ok");
    }
}

중복 파라미터가 날아왔을 때, 즉 같은 파라미터 이름에 여러 값이 전송됐을 때는 getParameter()를 사용하면 하나만 조회 되기 때문에 getParameter()가 아니라 getParameterValues()를 사용해야한다.

 

POST HTML form

form으로 전송 받으면 큰 특징은 두 가지이다.

  1. content-type: application/x-www-form-urlencoded
  2. 메시지 바디에 쿼리 파라미터 형식으로 데이터를 전달한다.

결과는 GET으로 쿼리 파라미터를 받았을 때와 같은 결과가 출력된다. 서버의 입장에서는 두 형식이 같으므로 request.getParameter()로 두 가지를 구분 없이 조회할 수 있다. 하지만 content-type이 get으로 쿼리 파라미터 형식으로 보냈을 때는 없고, post로 form 형식으로 보내면 위와 같아야만 한다.

 

다음 주차에 api를 전송할 때를 다루는 내용부터 다시 이어가겟습니다..

반응형