본문 바로가기

Architecture/Design Pattern

MVC Pattern과 리팩토링 과정

MVC패턴이 어떻게 리팩토링 되어가는에 대한 과정입니다. 뒤에 숫자는 정식 명칭이 아닙니다.

MVC1 & MVC2

https://user-images.githubusercontent.com/70089259/132357701-e076921e-428e-4d48-a492-daeed976e819.png

MVC1은 클라이언트의 요청이 있을 때 모든 구현 및 응답을 servlet으로 하게 된다. java안에 html을 담아야하기에 view에 적합하지 않다.

https://user-images.githubusercontent.com/70089259/132357704-02077372-9fec-4d85-b44d-5e0ae8a4fa66.png

MVC2는 클라이언트의 요청이 있을 때 모든 구현 및 응답을 JSP로 하게된다. 동적 프로그래밍이 필요하시 html안에 스크립트릿 표현으로 자바프로그래밍을 해야하기에 동적 기능만을 수행할 때 적합하지 않다.

여기서 응답은 JSP로 하며, 내부적인 동작은 servlet으로 하게되면 MVC3으로 넘어간다.

MVC3

https://user-images.githubusercontent.com/70089259/132357711-aa33e613-a5a6-40c9-b78a-8a7239406ed3.png

MVC3은 client의 요청에 따라 DB와 상호작용 및 동작시키는건 Controller로 처리를 하며, 응답 결과는 JSP로 만들어서 반환한다.

반환을 하는 방식은 2가지가 있다. Redirect와 forward 방식.

  • Redirect
    • 데이터 전달 방식 : QueryString
    • 기존 클라이언트의 요청을 받은 곳에서는 끊어버리고 새로운 곳으로 돌려버리는 것이다. 그러므로 request객체 등 모든 것이 초기화가 되는 문제점이 있다.
    • 데이터를 받을 때 QueryString으로 하게되어, 파라미터가 많을수록 많이 복잡해진다.
    • ex) 요청주소?var1=num1&var2=num2 등으로 넘겨준 후 Redirect로 받은 파일에서는 getParameter로 가져온다.
  • forward
    • 데이터 전달 방식 : ObjectBinding
    • 기존에 클라이언트의 요청을 받은 servlet에서 다른 곳으로 새로운 요청을 만들지 않고, RequestDisapatcher 객체를 만들어 응답을 끊지 않고, JSP로 만들어진 응답 결과를 대신 받아와서 응답을 해준다.
    • setAttribute로 객체바인딩을 해주면, 전달 받은 곳에서는 스크립트로 표현할 경우 getAttribute로 객체를 받아오거나 JSTL의 경우 메모리 공간에 명시되어있기에 EL을 사용해 바로 사용하면 된다.

MVC4

https://user-images.githubusercontent.com/70089259/136157039-7ef9cc70-7402-4811-b5c5-8296382e3a88.png

지금까지의 MVC pattern 에서는 client의 request에 따라서

다수의 Servlet이 request를 직접 받아서 응답을 해주었다.

MVC4 부터는 단일의 servlet이 request, response객체를 받고,

Controller interface를 implements한 request에 알맞는 각 POJO들이 메서드를 실행하고 결과값을 리턴한다.

https://user-images.githubusercontent.com/70089259/136155942-47832cf2-d7fc-4ed7-8668-4aab4686b092.png

  1. 클라이언트의 요청
  2. 요청된 명령을 frontController가 전부 받는다.
  3. 명령을 HandlerMapping 객체에 넣으면, 요청에 알맞는 POJO를 반환한다.
  4. 반환된 Controller(POJO)가 메서드를 실행한다.
  5. VO, DAO와 상호작용하는 POJO들은 실행 후 view page를 반환하는 POJO로 넘긴다.(redirect)
  6. view page를 반환하는 POJO들은 forward방식으로 page를 반환한다.
    • view page반환 시 context root 관리를 위해서 viewresolver라는 객체를 만들어 관리한다.

[ 패턴에 대한 자세한 구현 과정]

MVC1: https://github.com/moo-on/jsp-tutorial/tree/MVC1
MVC2: https://github.com/moo-on/jsp-tutorial/tree/MVC2
MVC3: https://github.com/moo-on/jsp-tutorial/tree/MVC3
MVC4: https://github.com/moo-on/jsp-tutorial/tree/MVC4