0. 개요
- 이전 포스팅에서 MVC 1의 등장 이유와 MVC 1의 기본적인 구조에 대해서 알아보았다.
- 이번 포스팅에서는 MVC 1의 동작원리와 한계점에 대해서 알아보도록 하자.
1. MVC 1의 동작원리
- 위의 그림은 Servlet과 JSP를 이용한 MVC 1 구조의 흐름을 표현한 것이다.
- 아래의 코드 사진을 보고, 어떻게 이 흐름이 구현되는지 함께 알아보자.
1. Controller에 요청이 들어온다.
2. 요청이 들어오면 비즈니스 로직을 수행한다.
List<Member> members = memberRepository.findAll();
3. 수행한 로직은 Model에 저장한다. Model은 HttpServletRequest 객체가 가진 임시 저장소를 이용하여 구현한다.
- JSP는 HttpServletRequest의 임시저장소를 이용하여 Controller와 View가 데이터를 주고받는 방식을 사용한다.
- 그러므로 setAttribute를 사용하여 비즈니스 로직의 결과를 request 객체의 임시저장소에 저장한다.
- 전달된 request 객체의 데이터는 view 측에서 HttpServletRequest.getAttribute()를 통해 데이터를 사용한다.
request.setAttribute("members", members);
4. 이제 Model을 특정 JSP에게 전달한다. 이를 위해 JSP의 경로를 변수에 저장한다.
- 현재 Model을 request 객체에 담았다. dispatcher를 이용하여 이를 특정 JSP에게 전달한다.
String viewPath = "JSP 페이지의 경로";
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
5. JSP에서 해당 Model 객체의 데이터를 사용한다.
- 현재 Model에 들어있는 다수의 객체와 해당 객체가 데이터를 사용하기 위해서 JSTL을 사용한다.
- JSTL을 사용하면 반복문 같은 기능을 사용할 수 있다.
6. JSP는 Model로부터 가져온 데이터를 이용하여 View를 랜더링 한다.
2. MVC 1의 한계점
- 위에서 Servlet과 JSP를 이용한 MVC 1의 흐름을 간단하게 알아보았다.
- 여기서 생각해봐야 할 것은 위에서 예시로 보여준 Controller가 한 개만 존재하는 게 아니라는 것이다.
- 위와 같은 Controller가 여러 개 존재하므로, 중복적으로 작성되는 코드가 있는 것이다.
- Servlet과 JSP의 개선사항은 여기서 출발한다.
a) viewPath의 반복적인 작성
- 모든 Controller는 각자의 역할(비즈니스 로직)과 이를 사용하는 JSP에게 Model 객체를 전달한다.
- 그러므로 Controller마다 각각의 viewPath를 설정하게 된다.
- 만약 특정 JSP의 viewPath가 달라진다면, 해당 JSP를 사용하는 모든 Controller의 viewPath를 수정해야 한다.
- 이런 상황에서 viewPath를 수정해야 하는 Controller가 수십, 수백 개가 존재한다면 어떻게 해야 할까?
b) forward()의 반복적인 작성
- Controller마다 forward() 코드를 반복적으로 작성한다.
- 사실 페이지를 이동할 수 있는 기능을 가진 메서드가 forward() 밖에 없다.
- 반복적으로 작성되었다는 것만으로도 충분히 개선 사유가 되지만, 문제는 따로 있다.
- 이에 대한 내용은 다음 포스팅에서 상세하게 다루도록 하겠다.
c) 진입점이 너무 많다.
- Client의 요청 주소에 따라 Controller가 연결되어있다.
- 즉, Controller의 개수만큼 Client가 접근할 수 있는 진입점이 있다.
- 진입점이 여러 개이므로 중복 작성되는 코드가 많은 것이다.
d) 결론 - FrontController
- 전체적으로 공통된 기능을 처리하는 부분이 부족하다.
- 공통된 기능 class로 생성하더라도, 각 Controller에서 반복적으로 호출해야 한다는 문제점은 개선되지 않는다.
- 그러므로 공통 기능을 묶어서 처리해야 할 필요가 있다.
- 즉, Controller에 대한 진입점을 한 개로 만들면 된다.
- 이는 FrontController를 사용하여 구현할 수 있다.
'Back-end > Spring MVC 개념' 카테고리의 다른 글
9. Front Controller (1) (0) | 2022.03.04 |
---|---|
8. Forward와 Redirect (0) | 2022.03.03 |
6. MVC 1의 등장 (0) | 2022.03.01 |
5. JSP의 등장 (0) | 2022.02.28 |
4. Servlet - 요청/응답 처리방법 (0) | 2022.02.25 |
댓글