본문 바로가기
Back-end/Spring MVC 개념

7. MVC 1의 동작원리와 한계점

by devraphy 2022. 3. 2.

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

댓글