Backend

서블릿, JSP, MVC패턴

연_우리 2021. 11. 25. 23:53
반응형

목차

     

    서블릿 VS JSP

    서블릿의 불편함 : HTML 코드를 작성하려면 w.write("<html>")...처럼 메서드 안에 일일이 문자로 작성해주어야한다.

    JSP의 불편함 : JSP파일 하나에 비즈니스로직, 화면표현 등의 너무 많은 역할이 주어진다. -> 나중에 유지보수가 어려워진다.

     

    비즈니스 로직은 서블릿 처럼 다른곳에서 처리하고,
    JSP는 목적에 맞게 HTML로 화면(View)을 그리는 일에 집중하도록 하자.
    => MVC 패턴 출현

     

    MVC 패턴

    이전의 문제점들

    1. 1개의 JSP파일에 비즈니스로직, View 표현, DB연결.. 등 너무 많은 역할이 존재했다.

    2. UI와 비즈니스로직의 연관성이 있을까?? 대부분의 경우는 서로 연관성도 없고

       UI가 변경된다해서 비즈니스로직에 영향을 주는 경우도 없다. => 둘 사이에 변경 라이프 사이클이 다르다.

       연관성이 없는 파트를 한 파일에서 관리해야하는 이유가 없다

     

    Model View Controller (+Service)

    위 문제점들을 해결하는 패턴이다. 

    Model 뷰에 출력할 데이터를 담는다.
    뷰가 데이터를 모두 모델에 담아 전달하기때문에 
    뷰는 비즈니스로직이나 데이터 접근방식을 몰라도된다. 화면 렌더링에 집중할 수 있다.
    View 모델에 담겨있는 데이터를 사용해서 화면을 렌더링한다.
    Controller HTTP 요청을 받아 비즈니스 로직이 있는 서비스를 호출한다.
    뷰에 전달할 결과데이터를 모델에 담는다.
    +Service 비즈니스로직이 담겨있다. 

     

    MVC 패턴에서는 항상 Controller로 요청이 들어온 다음 뷰를 호출해야한다.

     

    Dispatcher : 컨트롤러에서 뷰로 이동할 때 사용한다.

    String viewPath = "/WEB-INF/views/save-result.jsp";
    RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
    dispatcher.forward(request, response);

    forward 메서드는 다른 서블릿이나 jsp로 이동할 수 있으며, 서버 내부에서 다시 호출이 발생한다.

     

    (⚠ redirect는 클라이언트가 서버로 요청하면 서버가 클라이언트에게 응답해주고, 클라이언트는 서버로 다시 요청하된다. 총 2번 요청이 이루어진다.)

     

     

    WEB-INF 폴더

    WAS서버들의 규칙이다.

    WEB-INF 폴더 안에 JSP가 있으면 외부에서 직접 JSP를 호출할 수 없다.

    = 무조건 controller를 거쳐서 요청이 들어와야만 WEB-INF 폴더 안의 JSP를 호출할 수 있다.

     

    WEB-INF 폴더 밖의 JSP파일들은 주소창에 입력하면 바로 접속 가능하다.

     

     

    request.setAttribute("키", 값), request.getAttribute("키");

    Controller와 View는 데이터를 Mode로 전달한다.

    Request객체는 내부에 데이터 저장소를 가지고 있는데 이것을 Model로 사용한다.

    request.setAttribute("member", member)
    //데이터 보관
    
    request.getAttribute("member")
    //데이터 조회 (object형식으로 반환한다)

     

    JSP에서 getAttribute()메서드를 실행할때는 Object형식으로 반환하기때문에 형변환해주어야 한다.

    너무 번거로우니 JSP의 ${ } 문법을 사용하자.

    id = <% ((Member)request.getAttribute("member")).getId() %>
    
    id = ${member.id}

     

     

     

    MVC 패턴의 한계

    1. 분홍색부분의 주소맵핑 코드 중복

    "/servlet-mvc/members"

     

    2. 초록색부분의 Dispatcher 코드 중복

    RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
    dispatcher.forward(request, response);

     

    3. 노란색부분의 viewPath 공통경로 중복

    String viewPath = "/WEB-INF/views/save-result.jsp";

     

    4. HttpServletRequest, HttpServletResponse 객체 미사용

     

    => 기능이 복잡해질수록 공통으로 처리해야하는 부분이 증가할 것이다.

    공통기능을 메서드로 뽑아도 공통기능 메서드를 항상 호출해야하고, 실수로 호출하지 않으면 오류가 발생한다.

     

    => 컨트롤러 호출 전에 공통기능을 처리해주면된다. Front Controller 도입하자.

    현재 상황

     

     

     

    인프런 - 스프링MVC 백엔드 웹개발 핵심기술

     

     

    반응형
    • 네이버 블러그 공유하기
    • 페이스북 공유하기
    • 트위터 공유하기
    • 구글 플러스 공유하기
    • 카카오톡 공유하기