ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [스프링MVC - 1편] HttpServletRequest
    스프링&스프링부트 2025. 1. 2. 19:33
    HttpServletRequest 역할

    HTTP 요청 메시지를 개발자가 직접 파싱해서 사용해도 되지만, 매우 불편하다

    서블릿은 개발자가 HTTP 요청 메시지를 편리하게 사용할  있도록 개발자 대신에 HTTP 요청 메시지를 파싱한다

    그리고  결과를 HttpServletRequest 객체에 담아서 제공한다

     

     

    ...
    POST /save HTTP/1.1                               (START LINE)
    Host: localhost:8080                              (헤더)
    Content-Type: application/x-www-form-urlencoded   (헤더)
    
    username=kim&age=20                               (바디)
    ...

    HttpServletRequest를 사용하면 위와 같은 HTTP 요청 메시지를 편리하게 조회할  있다

    • START LINE
      • HTTP 메소드
      • URL쿼리 스트링
      • 스키마, 프로토콜
    • 헤더
      • 헤더 조회
    • 바디
      • form 파라미터 형식 조회
      • message body 데이터 직접 조회

     

    HttpServletRequest 객체는 추가로 여러가지 부가기능도 함께 제공한다.

     

    - 임시 저장소 기능

    해당 HTTP 요청이 시작부터 끝날 때 까지 유지되는 임시 저장소 기능

    저장: request.setAttribute(name, value)

    조회: request.getAttribute(name)

    - 세션 관리 기능

    request.getSession(create: true)

     

    * HttpServletRequest, HttpServletResponse 사용할 가장 중요한 점은 객체들이 HTTP 요청 메시지,

    HTTP 응답 메시지를 편리하게 사용하도록 도와주는 객체라는 이다. 따라서 기능에 대해서 깊이있는 이해를

    하려면 HTTP 스펙이 제공하는 요청, 응답 메시지 자체를 이해해야 한다

     

     

    HttpServletRequest - 기본 사용법
    @WebServlet(name="requestHeaderServlet", urlPatterns="/request-header")
    public class RequestHeaderServlet extends HttpServlet {
        @Override
        protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
            // 1. printStartLine(request);
            // 2. printHeaders(request);
            // 3. printHeaderUtils(request);
            // 4. printEtc(request);
            response.getWriter().write("ok");
        }
    }

     

     

    1. start line 정보 - printStartLine(request)

    //start line 정보
    private void printStartLine(HttpServletRequest request) {
        System.out.println("--- REQUEST-LINE - start ---");
        System.out.println("request.getMethod() = " + request.getMethod()); //GET
        System.out.println("request.getProtocol() = " + request.getProtocol()); //HTTP/1.1
        System.out.println("request.getScheme() = " + request.getScheme()); //http
        // http://localhost:8080/request-header
        System.out.println("request.getRequestURL() = " + request.getRequestURL());
        // /request-header
        System.out.println("request.getRequestURI() = " + request.getRequestURI());
        // username=hi
        System.out.println("request.getQueryString() = " + request.getQueryString());
        System.out.println("request.isSecure() = " + request.isSecure()); //https 사용유무
        System.out.println("--- REQUEST-LINE - end ---");
        System.out.println();
    
            /*
            * --- REQUEST-LINE - start ---
            * request.getMethod() = GET
            * request.getProtocol() = HTTP/1.1
            * request.getScheme() = http
            * request.getRequestURL() = http://localhost:8080/request-header
            * request.getRequestURI() = /request-header
            * request.getQueryString() = null
            * request.isSecure() = false
            * --- REQUEST-LINE - end ---
            * */
    }

     

     

    2. Header의 모든 정보 - printHeaders(request)

    // Header 모든 정보
    private void printHeaders(HttpServletRequest request) {
        System.out.println("--- Headers - start ---");
    
        /*
        // Header 정보 가져오는 옛날 방법
        Enumeration<String> headerNames = request.getHeaderNames();
        while (headerNames.hasMoreElements()) {
            String headerName = headerNames.nextElement();
            System.out.println(headerName + ": " + request.getHeader(headerName));
        }
        */
    
        // Header 정보 가져오는 요즘 방법
        request.getHeaderNames().asIterator()
                .forEachRemaining(headerName -> System.out.println(headerName + ": "
                        + request.getHeader(headerName)));
        System.out.println("--- Headers - end ---");
        System.out.println();
        
            /*
            * --- Headers - start ---
            host: localhost:8080
            connection: keep-alive
            cache-control: max-age=0
            sec-ch-ua: "Google Chrome";v="131", "Chromium";v="131", "Not_A Brand";v="24"
            sec-ch-ua-mobile: ?0
            sec-ch-ua-platform: "macOS"
            upgrade-insecure-requests: 1
            user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36
            accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,;q=0.8,application/signed-exchange;v=b3;q=0.7
            sec-fetch-site: none
            sec-fetch-mode: navigate
            sec-fetch-user: ?1
            sec-fetch-dest: document
            accept-encoding: gzip, deflate, br, zstd
            accept-language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
            --- Headers - end ---
            * */
    }

     

     

    3. Header 편리한 조회 - printHeaderUtils

    // Header 편리한 조회
    private void printHeaderUtils(HttpServletRequest request) {
        System.out.println("--- Header 편의 조회 start ---");
        System.out.println("[Host 편의 조회]");
        System.out.println("request.getServerName() = " +
                request.getServerName()); //Host 헤더
        System.out.println("request.getServerPort() = " +
                request.getServerPort()); //Host 헤더
        System.out.println();
        System.out.println("[Accept-Language 편의 조회]");
        request.getLocales().asIterator()
                .forEachRemaining(locale -> System.out.println("locale = " +
                        locale));
        System.out.println("request.getLocale() = " + request.getLocale());
        System.out.println();
        System.out.println("[cookie 편의 조회]");
        if (request.getCookies() != null) {
            for (Cookie cookie : request.getCookies()) {
                System.out.println(cookie.getName() + ": " + cookie.getValue());
            }
        }
        System.out.println();
        System.out.println("[Content 편의 조회]");
        System.out.println("request.getContentType() = " + request.getContentType());
        System.out.println("request.getContentLength() = " + request.getContentLength());
        System.out.println("request.getCharacterEncoding() = " + request.getCharacterEncoding());
        System.out.println("--- Header 편의 조회 end ---");
        System.out.println();
    
            /*
            * --- Header 편의 조회 start ---
            [Host 편의 조회]
            request.getServerName() = localhost
            request.getServerPort() = 8080
    
            [Accept-Language 편의 조회]
            locale = ko_KR
            locale = ko
            locale = en_US
            locale = en
            request.getLocale() = ko_KR
    
            [cookie 편의 조회]
    
            [Content 편의 조회]
            request.getContentType() = null
            request.getContentLength() = -1
            request.getCharacterEncoding() = UTF-8
            --- Header 편의 조회 end ---
            * */
    }

    - 이경우 request.getContentType() = null 로 출력되고 있는데 postman을 사용하면 null이 아닌 값을 확인할 수 있다

     

     

    > post로 text를 보내게 되면 값이 제대로 넘어오는 것을 확인할 수 있다

     

     

    4. 기타 정보 - printEtc

    (기타 정보는 HTTP 메시지의 정보는 아니다)

    // 기타 정보
    private void printEtc(HttpServletRequest request) {
        System.out.println("--- 기타 조회 start ---");
        System.out.println("[Remote 정보]");
        System.out.println("request.getRemoteHost() = " + request.getRemoteHost()); //
        System.out.println("request.getRemoteAddr() = " + request.getRemoteAddr()); //
        System.out.println("request.getRemotePort() = " + request.getRemotePort()); //
        System.out.println();
        System.out.println("[Local 정보]");
        System.out.println("request.getLocalName() = " + request.getLocalName()); //
        System.out.println("request.getLocalAddr() = " + request.getLocalAddr()); //
        System.out.println("request.getLocalPort() = " + request.getLocalPort()); //
        System.out.println("--- 기타 조회 end ---");
        System.out.println();
        
           /*
            * --- 기타 조회 start ---
            * [Remote 정보]
            * request.getRemoteHost() = 0:0:0:0:0:0:0:1
            * request.getRemoteAddr() = 0:0:0:0:0:0:0:1
            * request.getRemotePort() = 64500
    
            * [Local 정보]
            * request.getLocalName() = localhost
            * request.getLocalAddr() = 0:0:0:0:0:0:0:1
            * request.getLocalPort() = 8080
            * --- 기타 조회 end ---
            * */
    }
    728x90
Designed by Tistory.