서블릿

2 minute read

서블릿에 대하여

  • 서블릿은 JVM 기반에서 웹 개발을 하기위한 명세이자 API이다.
  • 서블릿 객체는 자바 코드안에 HTML을 포함할 수 있다.
  • 서블릿의 생명주기는 초기화, 서비스, 소멸으로 구성되어 있다.

    서블릿 객체 사용하기

  • 서블릿 생성과 초기화
    • HttpServlet 객체를 상속받아 서블릿 객체를 구현한다.
    • @WebServlet 어노테이션을 사용하여 서블랫 이름과 호출 URL을 지정한다.
    • init() 메소드는 서블릿 객체가 생성될 시 단 한번만 호출된다.
      @WebServlet(urlPatterns = {"/hello"})
      public class HelloServlet extends HttpServlet {
        @Override
        public void init(ServletConfig servletConfig) {}
      }
      
  • 서블릿의 get 요청 처리
    • doGet() 메소드 사용
    • doGet() 메소드는 HttpServletRequest와 HttpServletResponse 객체를 매개변수로 전달 받음
    • HttpServlerResponse 객체의 PrintWriter 인스턴스 변수를 사용하여 HTML을 생성
      @WebServlet(urlPatterns = {"/hello"})
      public class HelloServlet extends HttpServlet {
        @Override
        protected void doGet(HttpServletRequest req, HttpServletResponse resp) {}
      }
      
  • 서블릿의 post 요청 처리
    • doPost() 메소드 사용
    • doPost() 메소드는 HttpServletRequest와 HttpServletResponse 객체를 매개변수로 전달 받음
    • HttpServlerResponse 객체의 PrintWriter 인스턴스 변수를 사용하여 HTML을 생성
    • req.getParameter() 메소드로 POST 요청 데이터를 읽어 들임
      @WebServlet(urlPatterns = {"/hello"})
      public class HelloServlet extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) {}
      }
      
  • 서블릿의 멀티파일 요청 처리
    • doPost() 메소드 사용
    • @MultipartConfig 어노테이션을 사용하여 파일의 저장위치, 파일의 최대 크기, 요청의 최대 크기, 임시 디렉토리에 저장될 파일의 크기(Default 0)을 지정
    • HttpServletRequest을 통해 요청 스트림을 받고 이를 파일로 저장함
      @WebServlet(urlPatterns = "/upload", name = "uploadServlet")
      @MultipartConfig(
        fileSizeThreshold = 1024 * 1024 * 2, // 2mb
        maxFileSize = 1024 * 1024 * 10, // 10mb
        maxRequestSize = 1024 * 1024 * 50, //50mb
        location = "/Users/hsj/Desktop/myPicture" //파일저장위치
      )
      public class UploadServlet extends HttpServlet {
        @Override
        protected void doPost(HttpServletRequest req, HttpServletResponse resp) throwsServletException, IOException {
        final Part filePart = req.getPart("file");
        InputStream inputStream = filePart.getInputStream();
        }
      }
      

      서블릿 관련 객체

      필터

  • 클라이언트 요청에 대해 전/후 처리를 할 수 있다.
  • 필터는 생명주기를 위한 init()과 destroy()메서드를 가지고 필터 기능 사용을 위한 doFilter() 메서드가있다.
    @WebFilter("*.jsp")
    public class ServletFilter implements Filter {
      @Override
      public void init(FilterConfig filterConfig) { }
    
      @Override
      public void doFilter(ServletRequest servletRequest, ServletResponseservletResponse, FilterChain filterChain) throws IOException, ServletException {
          PrintWriter printWriter = servletResponse.getWriter();
          printWriter.println("필터 동작 전");
          filterChain.doFilter(servletRequest, servletResponse);
          printWriter.println("필터 동작 후");
      }
        
      @Override
      public void destroy() { }
    }
    

    쿠키

  • 사이트를 방문했을때, 사용자의 로컬에 저장되는 데이터
  • 쿠키의 구성 요소
    • 이름 : 각각의 쿠키의 값을 식별하기 위한 키
    • 값 : 특정 이름으로 쿠키에 지정된 값
    • 유효 시간 : 쿠키 유지 시간
    • 도메인 : 쿠키를 전송할 도메인
    • 경로 : 쿠키를 전송할 요청 경로
  • 쿠키의 생성
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throwsServletException, IOException {
      Cookie cookie = new Cookie("nickname", "firewood");
      resp.addCookie(cookie);
    }
    

    세션

  • 세션은 클라이언트와 웹 서버간의 네트워크 연결이 유지되고 있는 상태
  • 서버는 클라이언트를 세션ID로 식별
  • 세션 ID는 JSESSIONID라는 이름으로 쿠키에 저장되고, 클라이언트가 재접속할 때 해당 쿠키를 이용해 세션 ID값을 서버에 전달함
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) {
      HttpSession httpSession = req.getSession();
      httpSession.getId();
      httpSession.getCreationTime();
      httpSession.getLastAccessedTime();
    }
    

Java EE 패턴

  • Java EE 패턴은 자바 기반의 앤터프라이즈 웹 애플리케이션 개발을 위한 패턴
  • Java EE 패턴 목록
패턴이름 개요
Intercepting Filter 요청에 대한 전처리 및 후처리
Front Controller 요청에 대한 처리를 관리하는 중앙 컨트롤러
View Helper 뷰의 표현을 위해 비즈니스 로직을 가지고 있는 개념상의 Helper
Composite View 레고 블럭 같은 작은 뷰를 조합해서 만드는 전체의 뷰
Service to work 뷰에 대한 처리 이전에 동작하는 기법
Dispatcher View Service to work와 동일하며 차이점은 뷰에 대한 처리중에 수행

Sample code: GitHub

참고도서
제목: 스프링 부트로 배우는 자바 웹 개발
지은이: 윤석진
펴낸곳: 제이펍

참고 문서
임베디드 톰캣 사용하기