♪ 학습 내용
MVC 프레임워크 개선( view 분리 / 컨트롤러의 서블릿 종속성 제거 / 뷰 이름 중복 )
* View 분리
앞서 만든 코드에서는 각 컨트롤러마다 다음 코드가 중복 작성됐었따.
RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request,response);
중복을 제거하기 위해 뷰 코드를 처리하는 MyView 객체를 만들었다.
public MyView(String viewPath){
this.viewPath = viewPath;
}
viewPath를 생성자 파라미터로 가진다.
각 컨트롤러에서는 매번 forward 할 필요 없이 MyView 객체를 생성하고, 프론트 컨트롤러에 전달.
프론트 컨트롤러에서는 반환받은 MyView의 render를 호출 ---> jsp 로 forward !!
* 서블릿 종속성 / view 이름 중복 제거
1.
여태까지는 각 컨트롤러에서 request.setAttribute()를 이용하여 모델로 사용하였다.
만약 프론트 컨트롤러에서 request 의 쿼리 파라미터 정보를 자바 Map으로 각 컨트롤러에 넘겨주고,
컨트롤러에서는 request가 아닌, 새로운 모델 객체에 데이터를 담아 반환한다면 ..?
각 컨트롤러에서는 HttpServletRequest / Response 를 몰라도 된다. (사용 x)
----> 서블릿 종속성 제거
2.
v2 버전에서는 컨트롤러가 url 경로인 문자열 viewPath 만 반환하도록 개선하였다.
하지만 이 과정에서도 다음과 같이 매번 중복되는 부분이 발생.
ex ) /WEB-INF/views/@@.jsp , /WEB-INF/views/&&.jsp , /WEB-INF/views/##.jsp
이때 컨트롤러는 뷰의 논리이름(@@ / && / ## ...)을 반환하게 하고,
프론트 컨트롤러에서 반환받은 논리 이름을 이용해 처리하면 중복을 제거할 수 있다.
< 전체 과정 >
요청이 들어오면 프론트 컨트롤러에서 요청에 매핑되는 컨트롤러를 받고,
request의 정보를 자바 Map에 담아 파라미터로 넘기며 컨트롤러의 process 호출.
컨트롤러에서는 파라미터에서 필요한 데이터를 꺼내 맡은 로직 실행하고 new 연산자로 ModelView 객체 생성.
이때 이동하고자 하는 뷰의 논리 이름을 생성자 파라미터로 넘겨 ModelView 객체 안에 논리 이름을 담는다.
추가로 반환하고자 하는 데이터를 ModelView 객체의 Map에 담고, ModelView return.
ModelView를 반환받은 프론트 컨트롤러는 ModelView의 논리 이름을 물리 이름으로 변경하여 MyView 생성 (뷰리졸버)
MyView에 ModelView의 model 과 request, response를 파라미터로 넘기며 render() 호출.
MyView에서는 전달받은 model의 내용물을 request.setAttribute를 이용해 request에 복사.
후에 dispatcher.forward(request, response)
뭔가 복잡해진 느낌
- 서블릿 종속성 제거 된 거 확인 가능 !
-
//뷰의 논리 이름과 데이터를 담는 ModelView 생성
ModelView mv = new ModelView("save-result");
뷰 리졸버를 적용하면 논리 이름은 그대로이고 물리 경로 변경 시 쉽게 변경이 가능하다는 또 다른 장점이...!
컨트롤러의 서블릿 종속성을 제거했고, model을 따로 두었고, 뷰 이름 중복을 제거하였다.
♪ 다음 학습 내용
실용적이고 유연한 컨트롤러로 개선 ! ( 최종적으로 어댑터 패턴 적용 )
'Dev > Spring' 카테고리의 다른 글
[Spring MVC 1] 스프링 MVC-구조 (1) (0) | 2023.01.30 |
---|---|
[Spring MVC 1] MVC 프레임워크 만들기 (3) (0) | 2023.01.28 |
[Spring MVC 1] MVC 프레임워크 만들기 (1) (0) | 2023.01.25 |
[Spring MVC 1] 서블릿/JSP/MVC (2) (0) | 2023.01.24 |
[Spring MVC 1] 서블릿/JSP/MVC (1) (0) | 2023.01.22 |
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!