스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 4

Spring 정리 2021. 8. 30. 19:27

인프런 강의 22일차.

 - 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 1 (김영한 강사님)

 

1. HttpServletRequest의 역할

 - HTTP 요청 메시지를 개발자가 직접 파싱해서 사용해도 되지만, 매우 불편할 것이다. 서블릿은 개발자가 HTTP 요청 메시지를 편리하게 사용할 수 있도록 개발자 대신에 HTTP 요청 메시지를 파싱한다. 그리고 그 결과를 HttpServeltRequest 객체에 담아서 제공한다.

 - HttpServletRequest를 사용하면 다음과 같은 HTTP 요청 메시지를 편리하게 조회할 수 있다.

 - HTTP 요청 메시지 

    > POST /save HTTP/1.1

    > Host : localhost:8080

    > Content-type : application/www- x-form-urlencoded

    > username&age=40

 - START LINE

    > HTTP 메소드

    > URL

    > 쿼리 스트링

    > 스키마, 프로토콜

 - Header

    > Header 조회

 - Body

    > form 파라미터 형식 조회

    > message body 데이터 직접 조회

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

 - 임시 저장소 기능

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

    > 저장 : request.setAttribute(name, value)

    > 조회 : request.getAttribute(name)

 - 세션 관리 기능

    > request.getSession(create:true);

 - 중요 : HttpServletRequest, HttpServletResponse를 사용할 때 주의할 점은 이 객체들이 HTTP 요청 메시지, HTTP 응답 메시지를 편리하게 사용할 수 있도록 도와주는 객체라는 점이다. (따라서 이 기능에 대해 깊이있는 이해를 소장하려면 'HTTP 스펙이 제공하는 요청&응답 메시지 차를 이해애야 한다.

 

2. HttpServletRequest 기본 사용법

 - printStartLine(request) : header의 기본 정보들 표시

private void printStartLine(HttpServletRequest request) {
        System.out.println("--- REQUEST-LINE - start ---");
        System.out.println("request.getMethod() = " + request.getMethod()); //GET
        System.out.println("request.getProtocal() = " + 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-test
        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();
    }

 - printHeader(reqeust) : header의 모든 내용 표시

//Header 모든 정보
    private void printHeader(HttpServletRequest request){
        System.out.println("--- Headers - Start ---");

        Enumeration<String> headerNames = request.getHeaderNames();
        while(headerNames.hasMoreElements()){
            String headerName = headerNames.nextElement();
            System.out.println(headerName + " : " + headerName);
        }

        System.out.println("--- Headers - End ---");
    }

 - printHeaderUtils(request) : header의 정보를 간추려서 표시

//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();
    }

- printEtc(request) : header의 기타 정보 표시

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();
    }