
MVC(Model-View-Controller)는 애플리케이션의 구성요소를 "관심사의 분리"라는 디자인 원칙을 적용시켜 3가지로 구분한 소프트웨어 디자인 패턴이다.
이런 Spring MVC Framework는 MVC 구조를 통해 유연(Flexible)하고, 느슨하게 결합(Loosely coupled)된 웹 애플리케이션을 개발할 수 있도록 도와준다.
출처 : MDN web docs
그럼 MVC 패턴으로 인해 구분된 3가지의 구성요소가 Spring Framework 내에서 하는 역할은 다음과 같다.
(입력의 분리, 출력의 분리, 데이터를 담을 객체로 분리하면서 점차 지금의 MVC 패턴이 만들어졌다고도 생각해 볼 수 있을 것 같다)
큰 틀에서 Model, View, Controller를 사용하는 과정은 다음과 같다.
- 사용자의 요청을 DispatcherServlet이 받는다.
- 사용자가 요청한 URL에 Mapping된 메서드를 가지고 있는 Controller가 선택된다.
- 선택된 Controller는 사용자가 요청한 URL에 Mapping된 메서드를 호출한 후 service logic이 실행되고 결과를 Model에 담는다.
- Model에 저장된 결과를 바탕으로 View에서 사용자에게 웹 페이지를 출력한다.
간단하게 코드를 작성해보았으며, 이해를 돕기위한 추가 설명이다.
위의 예시는 사용자가 로그인을 요청할 때, 입력받은 패스워드와 DB에 저장된 패스워드가 동일한지 확인 후 각 결과에 따라 처리하는 코드이다.
여기서 Controller 애너테이션이 붙은 클래스는 Controller 역할을 하므로, 위의 예시에서는
LoginController 클래스가 Controller 역할을 한다.
만약 패스워드가 틀렸다고 가정하면, loginCheck 메서드는 false를 반환 할 것이며,
RedirectAttributes 객체에 데이터를 map형태인 Key와 Value 형태로(loginMsg, LOGIN_ERR)담는다.
위 예시에서 RedirectAttributes는 redirect로 요청 시 Model대신 사용하는 객체라고 가정하고 보자
Controller에서 /login/login으로 redirect요청을 하였으니 /login/login에 Mapping된 View(jsp)에서 Model에 담겨진 데이터를 통해 로그인 실패 에러를 출력할 것이다.
실제로는 위의 과정보다 더 복잡하고 많은 절차들이 있으며, Model-View-Controller에 대한 감을 잡는 용도로만 생각하면 좋을 듯 하다.
DispatcherServlet 및 상세 동작과정 다음 포스트에서 볼 수 있다.