Free Lines Arrow
본문 바로가기
Spring/spring framework 구현 스터디

[Spring] Servlet 다루기 1: Servlet, HttpServletRequest

by skahn1215 2021. 10. 9.
728x90
반응형

Servlet 을 직접 다뤄보자

  • @ServletComponentScan:
     - 스프링 부트는 서블릿을 직접 등록해서 사용할 수 있도록 @ServletComponentScan 을 지원한다.
     - 서블릿 관련 어노테이션을 보고 알아서 등록해준다.
@ServletComponentScan // 서블릿 자동 등록
@SpringBootApplication
public class ServletApplication {
	public static void main(String[] args) {
		SpringApplication.run(ServletApplication.class, args);
	}
}

 

 

HttpServlet 등록

  • HttpServlet 을 상속받아 새로운 서블릿 클래스를 작성해준다.
  • @WebServlet:
     - name: 서블릿의 이름
     - urlPatterns: 요청한 url에 해당하는 주소를 입력한다.
  • req.getParameter:
     - 해당 함수로 쿼리에 대한 내용을 가져온다.
  • resp.setContentType:
     - 데이터 타입을 정해준다.
  • resp.setCharacterEncoding:
     - 인코딩 방식을 지정한다. 요즘은 전부 utf-8을 사용한다.
  • resp.getWriter().write(""):
     - body 에 데이터를 넣는다.
// HTTPSetvlet 을 먼저 상속 받아야한다.
//name : 서블릿 이름
// urlpatterns url
@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("HelloServlet.service");
        System.out.println("req = " + req);
        System.out.println("resp = " + resp);

        String username = req.getParameter("username");
        System.out.println("username = " + username);

        resp.setContentType("text/plain");
        resp.setCharacterEncoding("utf-8");
        resp.getWriter().write("hello"+username); // body 에 데이터를 넣는다.
                                                  // 바디에 text를 담아 보낸다.
    }
}

 

 

서블릿 컨테이너의 동작방식

요청을 보내면 다음과 같은 응답을 받는다고 생각하자.

 

요청

GET /hello?username=tom HTTP/1.1
Host: localhost:8080

 

응답

HTTP/1.1 200 OK
Content-Type: text/plain;charset=utf-8
Content-Length:11

hello world

 

 

동작과정

  • 요청이 오면 웹서버에서 request, response 객체를 만든다.
  • 서블릿을 찾고 request 와 response 를 파라미터로 넘겨 실행한다.
  • 실행후 response 를 브라우저에게 보낸다.

 

 

 

HttpServletRequest 의 역할

  • HttpServletRequest 를 파라미터로 받아 서블릿이 수행된다.
     - 그렇다면 역할은 무엇인가?
  • HTTP 요청 메시지를 우리가 직접 파싱해도 되지만 불편하다.
  • 서블릿이 파싱을 수행해준다.
  • 그리고 결과를 HttpServletRequest 객체에 담아서 제공해준다.
  • HttpServletRequest, HttpServletResponse 두개의 역할은 HTTP 요청 메시지, HTTP 응답 메시지를 편리하게 사용하도록 도와주는 객체이다.

 

 

필요이유?

편리함이다.

 

HTTP 요청 메시지

START LINE:

 - HTTP 메소드

 - URL

 - 쿼리 스트링
 - 스키마, 프로토콜

 

HEADER:

 - 헤더조회

 

바디:

 - form 파라미터 형식 조회

 - message body 데이터 직접조회

 

 

임시저장소 기능

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

 - 저장: request.setAttrbute(name, value)

 - 조회: request.getAttribute(name)

 

 

세션관리기능

request.getSession

 

 

 

HttpServletRequest 사용법

request 에서 우리는 start-line,  header, body 등 데이터를 조회 할 수 있다.

다음 예제를 보자

 

 

startLine 조회

    private void printStartLine(HttpServletRequest request) {
        String method = request.getMethod();
        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
        
        System.out.println("request.getRequestURL() = " + request.getRequestURL());
       
        System.out.println("request.getRequestURI() = " + request.getRequestURI());
    
        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 조회

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

        // 요즘방식
        request.getHeaderNames().asIterator().forEachRemaining(headerName -> System.out.println(headerName + ":" + headerName));

        // 특정 정보를 가져올수 있다.
        request.getHeader("host");

        System.out.println("---- Headers - end ----");
        System.out.println();
    }
   //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();

        // getLocales 는 locale 정보를 다 꺼낼수 있다.
        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());

        // get 방식일 경우 content를 보내지 않아서 null 이다.
        System.out.println("request.getContentLength() = " +
                request.getContentLength());
        System.out.println("request.getCharacterEncoding() = " +
                request.getCharacterEncoding());
        System.out.println("--- Header 편의 조회 end ---");
        System.out.println();
    }

 

 

 

기타 정보조회

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

 

 

 

 

 

참고:

https://www.inflearn.com/course/%EC%8A%A4%ED%94%84%EB%A7%81-mvc-1/lecture/71169?mm=close&tab=curriculum 

 

스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술 - 인프런 | 학습 페이지

지식을 나누면 반드시 나에게 돌아옵니다. 인프런을 통해 나의 지식에 가치를 부여하세요....

www.inflearn.com

 

728x90
반응형

댓글