웹 - 서블릿 (Servelt)

컴업·2021년 11월 4일
0
post-thumbnail

WAS는 개발자가 처리해야하는 많은 작업들을 대신 해줍니다.

위 그림은 만약 WAS가 없었다면 개발자가 직접 코딩해야 하는 작업들을 나타냅니다. 이를 통해 개발자는 중요한 비즈니스 로직에 좀 더 집중할 수 있는 것 이지요.

WAS는 그럼 어떤식으로 비즈니스 로직을 수행할까요?

바로 그 유명한 서블릿을 사용합니다.



서블릿이란?

자바 서블릿은 자바를 사용하여 웹페이지를 동적으로 생성하는 서버측 프로그램 혹은 그 사양을 말하며, 흔히 "서블릿"이라 불린다. 자바 서블릿은 웹 서버의 성능을 향상하기 위해 사용되는 자바 클래스의 일종이다. <위키피디아>

위키에서 서블릿을 검색해보면 뭐 어쩌구 저쩌구 해서 "웹페이지를 동적으로 생성하는 자바 클래스의 일종"이라고 설명하고 있습니다.

다시 말하자면 WAS가 웹 페이지를 동적으로 만들 때, 그 로직을 담을 수 있는 클래스입니다.

아래 그림처럼 먼저 WAS는 Http 요청 메세지를 파싱하여 Requset, Response 객체를 만들고, 같은 url에 매핑되는 서블릿을 호출합니다.

그럼 서블릿은 넘겨받은 Request 객체를 사용하여 개발자가 코딩해 놓은 비즈니스 로직을 수행해, 그 결과를 Response 객체에 담습니다.

Was는 이렇게 만들어진 Response 객체를 Http 응답 메세지로 변환시켜 클라이언트에게 전달해 줍니다.




서블릿의 사용

서블릿은 아래 코드처럼 HttpServlet을 상속받음으로서 사용할 수 있습니다.

@WebServlet(name = "helloServlet", urlPatterns = "/hello")
public class HelloServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response){
      //애플리케이션 로직
    }
}
  • 위에 보이는 name은 서블릿 이름이고, urlPatterns에 매핑될 url 주소를 지정합니다.
  • 실제 비즈니스 로직은 HttlServlet의 service 메서드를 오버라이딩 하여 코딩합니다.

    1. Http 시작 줄 (Start Line)

    Http method 정보 (GET, POST ...)

    String method = request.getMethod();

    Protocol

    String protocol = request.getProtocol();

    URL

    StringBuffer requestURL = request.getRequestURL();

    URI

    String requestURI = request.getRequestURI();

    Https 인지 Http인지

    boolean secure = request.isSecure();

    2. 헤더 (Header)

    Header key 조회

    Enumeration<String> headerNames = request.getHeaderNames();
    while(headerNames.hasMoreElements()){
                String headerName = headerNames.nextElement();
                System.out.println(headerName );
    }
    // 결과
    host
    connection
    cache-control
    sec-ch-ua
    sec-ch-ua-mobile
    sec-ch-ua-platform
    upgrade-insecure-requests
    user-agent
    accept
    sec-fetch-site
    sec-fetch-mode
    sec-fetch-user
    sec-fetch-dest
    accept-encoding
    accept-language
    

    Header 값 조회

     var result = request.getHeader("헤더 키 값");
    

    또 다른 Header 조회 방법

    Host

      String serverName = request.getServerName(); // localhost
      
      int serverPort = request.getServerPort(); // 8080
      

    Locale

    Locale locale = request.getLocale(); // ko

    쿠키

    if (request.getCookies() != null) {
              for (Cookie cookie : request.getCookies()) {
                  System.out.println(cookie.getName() + ": " + cookie.getValue());
              }
          }  
    
    

    ContentType

    String contentType = request.getContentType();

    ContentLength

    int contentLength = request.getContentLength();

    CharacterEncoding

    String characterEncoding = equest.getCharacterEncoding();

    3. 요청 데이터 (Body)

    Http 요청 개요

    Http 요청 데이터는 대부분 3가지 방식을 사용합니다.

    GET - 쿼리 파라미터

    • /url?username=hello&age=20
    • 메세지 바디 없이, URL을 통해 데이터 전달

    POST - HTML Form

    • content-type: application/x-www-form-urlencoded
    • 메세지 바디에 쿼리 파라미터 형식으로 전달 username=hello&age=20

    HTTP message body

    • JSON, XML, TEXT 등등


    GET - 쿼리 파라미터,   POST - HTML Form

    쿼리 파라미터와 Form데이터는 동일한 메서드로 조회가능합니다.

    모든 파라미터 key 조회.

    Enumeration<String> parameterNames = request.getParameterNames();
    

    단일 파라미터 조회

    String userName = request.getParameter("username");
    String age = request.getParameter("age");
    

    이름이 같은 복수 파라미터 조회

    String[] usernames = request.getParameterValues("username");

    HTTP message body

    메세지 바디에 담긴 데이터를 String 타입으로 받아볼 수 있다.

    ServletInputStream inputStream = request.getInputStream();
    String messageBody = StreamUtils.copyToString(inputStream, StandardCharsets.UTF_8);

    참고: JSON 데이터일 경우 ObjectMapper를 이용해 객체에 바로 매핑이 가능하다.



    <출처>

    Inflearn 김영한 선생님, 스프링 MVC1편 - 백엔드 웹 개발 핵심 기술.

  • profile
    좋은 사람, 좋은 개발자 (되는중.. :D)

    0개의 댓글