You are using an outdated browser. Please upgrade your browser to improve your experience.

12/10 스프링

pom.xml : maven빌드 도구에 들어있는 설정파일

build.xml : gradle 빌드 도구에 들어있는 설정파일

현재 프로젝트의 문제점

try~catch의 예외코드가 중복되고 jsp로 위임하는 코드가 지속적으로 중복되고있다. 이 문제를 해결하고싶어함.

-> 전 세계 개발자들이 구조개선 시도

서블릿을 실행하기 전에 모든 요청을 먼저 받는 FrontController를 두고 이 컨트롤러가 어떤 jsp와 Exception을 날릴지 결정한다.

스프링 컨셉

스프링 흉내내기

DispatcherServlet

  @Override
  protected void service(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {
    // 예) 요청 URL => /app/board/list
    //String servletPath = request.getServletPath(); // => /app
    String controllerPath = request.getPathInfo(); // => /board/list

    // 페이지 컨트롤러에게 위임한다.
    RequestDispatcher rd = request.getRequestDispatcher(controllerPath);
    rd.include(request, response);

    Exception exception = (Exception) request.getAttribute("exception");
    if(exception != null) {
      request.getRequestDispatcher("/error.jsp").forward(request, response);
      return;
    }
    String viewName = (String) request.getAttribute("viewName");
    if(viewName != null) {
      request.getRequestDispatcher(viewName).forward(request, response);
      return;
    }

    String redirect = (String) request.getAttribute("redirect");
    if(redirect != null) {
      response.sendRedirect(redirect);
    }
  }

dispatcher가 쓰는 경로는 상대경로이다.

/board/list의 jsp를 실행하는 코드를 수정한다.

  // 프론트 컨트롤러에게 어떤 JSP를 실행해야 하는지 알려준다.
  // UI 출력을 JSP에게 맡긴다.
  request.setAttribute("viewName", "/board/list.jsp");

/board/add의 jsp실행하는 코드 바꾸기

  @Override
  protected void doPost(HttpServletRequest request, HttpServletResponse response)
      throws ServletException, IOException {

    ServletContext ctx = request.getServletContext();
    BoardService boardService =
        (BoardService) ctx.getAttribute("boardService");

    Board board = new Board();
    board.setTitle(request.getParameter("title"));
    board.setContent(request.getParameter("content"));

    try {
      Member loginUser = (Member) request.getSession().getAttribute("loginUser");
      board.setWriter(loginUser);
      boardService.add(board);
      response.sendRedirect("list");

    } catch (Exception e) {
      request.setAttribute("exception", e);
      request.getRequestDispatcher("/error.jsp").forward(request, response);
    }
  }
  

forwarding한 다음엔 다시 되돌아갈 수 없다!!!!!


Controller인터페이스 생성

Controller인터페이스를 구현하여 Servlet들을 모두 Controller를 구현한 Concreate 클래스로 만든다.

기존 DataHandlerListener는 이제 Service객체를 준비하는 것 뿐 아니라 Controller도 준비하기 때문에 이름을 ContextLoderListener로 바꾼다.

컨텍스트에 필요한 것들을 실어준다는 의미에서 Loder라고 이름을 짓는다.

와 진짜 뭐라는지ㅋㅋㅋ

스프링의 심장 : web.xml에 등록되있는 <load-on-startup> </load-on-startup>


서블릿 컨테이너의 메모리관리

요청이 들어올때만 객체를 생성한다.


컴퓨터는 애플이 만들고 웹 어플은 내가만든다

이와 같은 원리로 dispatcherServlet과 contextLoader가 하는일이 다르다.

controller를 만드는애와 service, dao를 만드는 애를 분리했음.

dispacher : controller준비

contextloader : service객체 준비

value속성 외 다른속성도 같이 적으려면 value속성을 생략할 수 없다.

Dispacher서블릿같이 제일 먼저 실행해야하는 서블릿의 경우 loadOnstartup속성을 꼭 넣어줘야 한다. 그래야 에러메시지를 확인할 수 있다.

http세션은 클라이언트당 하나. 서블릿 컨텍스트는 한 웹 어플당 하나!

pojo로 만들면 좋은 점 : 객체 생성과 소멸을 우리가 직접 관리할 수 있다. 그래서 생성자에 의존객체 주입할수도 있음.

그 전에는 서블릿 생성과 소멸을 톰캣에서 관리했음.