TIL

23.02.23 TIL 서블릿 스코프, DispatcherServlet

YunH2 2023. 2. 23. 22:38

Today

  • 백준 3문제 풀기
  • Spring 강의 듣기 (servlet, mvc패턴)

I Learn

  • 서블릿 스코프 

    Servlet에서 임의의 데이터를 저장, 사용 할 수 있는 4가지 저장소

    이러한 저장소가 없으면 클라이언트가 서버로 요청을 하고, 응답 받은 뒤 재요청을 하게 되면

    서버는 stateless(무상태 서버)이기 때문에 클라이언트를 기억하지 못한다.

    이를 기억하기 위해 저장공간을 필요로 한다.

 

  1.  Page 스코프
  • 한개의 jsp 페이지 내에서만 데이터를 저장, 공유한다.
pageContext.setAttribute("키", "값");

   2. Request 스코프

  • HttpServletRequest API를 사용한다.
  • Request(요청)시 생성되고 Responce(응답)시 해당 스코프는 사라진다
request.setAttribute("키", "값");

   3. Session 스코프

  • 클라이언트의 브라우저가 종료시, 
  • 세션에 설정된 시간안에 재요청 하지 않을시,
  • 세션값을 강제로 삭제시 사라진다
  • 부담이 크기 때문에 필요한 것만 저장 후 사용해야 한다.
session.setAttribute("키", "값");

   4. Application

  • 해당 어플리케이션이 종료되기 전까지 살아있다.
  • 해당 어플리케이션의 모든 jsp 페이지가 공유하여 사용할 수 있다.
application.setAttribute("키", "값");

  • FrontController ( Dispatcher Servlet )

    클라이언트에게 가장 먼저 요청을 받고, 컨트롤러를 찾아 정해주는 역할

    즉, 라우터의 역할을 한다.

 

   jsp 페이지에 직접적인 요청을 보안 폴더에 넣어 줌으로써 해결하고,

  DispatcherSevlet에 접근해 어떠한 요청을 하면 DispatcherSevlet에서 내부적으로 jsp파일을

  클라이언트가 볼 수 있도록 전달해준다.

 

@WebServlet("*.so")
public class FrontController extends HttpServlet {

    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String httpMethod = req.getMethod();
        if(httpMethod.equals("POST")){
            resp.setContentType("text/html; charset=utf-8");
            PrintWriter pw = resp.getWriter();
            pw.println("잘못된 요청입니다");
            return;
        }

        String action = req.getRequestURI();
        System.out.println("uri : "+action);

        if(action.equals("/board.so")){
            Board b1 = new FakeDao().boardData();
            req.setAttribute("board", b1);
            req.getRequestDispatcher("/WEB-INF/views/board.jsp").forward(req, resp);
//            resp.sendRedirect("/WEB-INF/views/board.jsp");
        }else if(action.equals("/user.so")){
            User u1 = new FakeDao().userData();
            req.setAttribute("user", u1);
            //내부적 요청을 하기 때문에, web.xml에 필터링이 안되고, request가 두번 만들어지지 않음
            req.getRequestDispatcher("/WEB-INF/views/user.jsp").forward(req, resp);
//            resp.sendRedirect("/WEB-INF/views/user.jsp");
        }else{
            resp.setContentType("text/html; charset=utf-8");
            PrintWriter pw = resp.getWriter();
            pw.println("잘못된 요청입니다");
        }
    }
}

 

 

출처: https://www.youtube.com/@metacoding

 

메타코딩

문의사항 : getinthere@naver.com 인스타그램 : https://www.instagram.com/meta4pm 깃헙 : https://github.com/codingspecialist 유료강좌 : https://www.easyupclass.com

www.youtube.com


 Tomorrow

  • 백준 3문제 풀기
  • spring 온라인 강의 듣기