JSP MVC패턴

벨로그·2023년 4월 8일
0

MVC(Model-View-Controller) 패턴

사용자 인터페이스와 비즈니스 로직을 분리하여 각각의 로직을 독립적으로 운용하여 유지보수를 용이하게 만들 수 있는 디자인 패턴이다.
크게 모델,뷰,컨트롤러의 세 부분으로 각각의 요소는 다음과 같은 역할을 한다.

모델 : 비즈니스 영역의 상태 정보를 처리한다.
뷰 : 비즈니스 영역에 대한 프리젠테이션 뷰(사용자가 보게 될 결과화면)을 담당한다.
컨트롤러 : 사용자의 입력 및 흐름 제어를 담당한다.

MVC패턴의 핵심

어플리케이션의 흐름제어나 사용자의 처리요청은 컨트롤러(Servlet)가 한다. 비즈니스 로직을 처리하는 모델(Service,Dao,VO 자바클래스)과

화면을 보여주는 뷰(JSP)는 철저히 분리한다.

일단 model1, model2방식이 뭘까?

Model1


View와 Controller를 JSP에서 모두 구현하는 구조를 가지고 있다.

따라서 클라이언트의 요청을 받는것도 JSP, Model과 상호작용을 하여 변경된 Model을 사용하여 View를 다시 그려내는것도 JSP이다.

즉, 사용자의 요청처리와 요청에 대한 응답처리를 JSP에서 모두 구현하는 구조.

위의 특징때문에 MVC Model1구조는 흐름이 단순하기 때문에 개발이 쉽고 중소형 프로젝트에 적합하다는 장점이 있다.

하지만 프로젝트의 규모가 커질수록 유지보수가 어려워지고, View와 Controller가 하나의 JSP에 합쳐져 있기때문에 디자이너와 개발자의 협업에 어려움이 생길 수 있다.

Model2


View와 Controller가 분리된 구조를 가지고 있다.

클라이언트의 요청을 처리, 흐름제어를 하면서 필요시 Model과 상호작용을 하는 Controller는 Servlet에서 담당하고, 사용자 인터페이스를 보여주는 View는 JSP에서 담당하고 있다.

서블릿은 웹 브라우저의 요청을 알맞게 처리한 후 그 결과를 보여줄 JSP 페이지로 포워딩한다.

이 때 JSP페이지는 WEB-INF폴더에 있기 때문에 직접접근이 안된다. 서블릿에서 포워딩을 통해서만 접근가능하다.

이렇게 Controller와 View를 분리함으로써 클라이언트의 요청처리 부분과 응답처리 부분을 분리하여 각 로직을 독립적으로 수행할 수 있다.

따라서 유지보수 측면에서 매우 좋고 디자이너와 개발자간의 협력이 수월하다는 장점이 있다.

하지만 MVC Model1보다 프로그램의 흐름이 복잡하기 때문에 개발 난이도가 높으며, 설계에서 어려움을 겪을 수 있다는 단점이 있다.

WEB-INF폴더

WEB-INF는 Web Information의 약자로 web에 관련된 정보를 의미한다. Web 정보에 관한 중요한 파일들은 WEB-INF폴더에 넣게된다.

예를 들어web.xml, lib폴더, java파일(/WEB-INF/classes) 등이 있다. 이런 중요한 파일들이 있는 WEB-INF폴더에는 브라우저에서 직접 접근할 수 없다. 오직 서버내에서만 접근이 가능하다(Controller를 통해서만 접근 가능). 만약 브라우저가 WEB-INF폴더에 있는 파일에 직접 접근하려고 하면 404에러를 발생시킨다.

일반적으로 jsp 파일은 WEB-INF폴더에 넣고 브라우저의 직접적인 요청을 막는다.

css, img,jQuery 등의 정적 파일은 브라우저의 직접요청을 허용하기 위해서 WEB-INF폴더에 넣지 않는다.

JSP를 WEB-INF폴더에 넣는 이유

어떤 회사에서 모든 jsp 화면을 보여주기 전에 서블릿을 통해 특정기능을 수행하고 jsp로 포워딩하도록 프로젝트를 만들었다.

특정기능은 사용자의 IP와 접근시간을 DB에 저장하는 기능이다. 즉, 모든 사용자는 jsp화면을 보기전에 자신의 IP와 접근시간이 서버DB에 저장된다. 보통 화면을 만들 때 화면 이동간 버튼을 누를 시 요청되는 url은 서블릿을 통과하도록 되어있다. 근데 영리한 사용자는 JSP파일의 위치를 추측해 브라우저에 직접 요청한다. 이 경우 서블릿을 통과하지않기 때문에 JSP화면을 보게된다.

이러면 IP,접근시간이 DB에 저장되지않고도 화면을 볼 수 있게 된다. 이를 막기위해 JSP파일을 WEB-INF폴더에 넣어 JSP파일에 대해 직접요청하지 못하게 한다. 즉, 사용자는 화면을 볼려면 반드시 서블릿을 통과해야하고 무조건 IP,접근시간이 DB에 저장되게 된다.


MVC패턴과 JSP의 모델2구조는 완벽하게 일치한다.

컨트롤러=서블릿
모델=비즈니스 로직클래스,자바빈
뷰=JSP

너무헷갈려하지말자. 완벽히 똑같은 개념인데 MVC패턴은 일반적인 디자인패턴이고 모델2는 이런 MVC패턴을 JSP에서 적용하면서 JSP의 모델2라고 이름지은 것 뿐이다. MVC패턴 ⊃ JSP모델2.

JSP로 구현한 MVC 동작과정

  1. HTTP요청을 받음

    웹 브라우저가 전송한 HTTP 요청을 받는다. 서블릿의 doGet() ,doPost(), service()메소드 등이 호출된다.

  2. 클라이언트 요청을 분석

    브라우저가 어떤 요청을 했는지 분석한다. freeList인지, freeForm인지 아니면 memberList인지 알아낸다.

  3. 요청에 맞는 비즈니스 로직을 처리하는 모델 사용

    모델(service, DAO) 클래스에 요청에 맞는 일을 수행하도록 한다.

  4. 컨트롤러부터 요청을 받음

    요청에 맞는 일이 모델에게 넘어감

  5. 비즈니스 로직 수행+DB 접근

    요청에 맞는 로직을 수행함

  6. 수행 결과 컨트롤러에 리턴

    로직을 수행하고 얻은 결과(FreeBoardVO, List 등)을 컨트롤러에 리턴한다.

  7. 결과를 request 또는 session에 저장

    모델(Service,DAO)로부터 받은 결과값을 request나 session 객체에 저장.

  8. 알맞은 뷰로 포워딩 또는 리다이렉트

  • 2번에서 분석한 요청 및 수행결과에 맞는 알맞은 뷰(jsp)로 포워딩하거나 리다이렉트 요청.
  • 포워딩은 jsp로 포워딩하고 해당 jsp로 응답함.
  • 리다이렉트는 jsp로 포워딩하지않고 바로 response에 redirect요청을 담고 바로 응답. (서블릿의 service(),doGet(),doPost()메소드 등에서 포워딩하지않고 메소드가 끝나면 바로 브라우저로 응답하게 된다.)

참고 :
https://velog.io/@ovan/MVC-Model1%EA%B3%BC-MVC-Model2

https://brilliantdevelop.tistory.com/67

0개의 댓글