섹션4 중) V3의 뷰-컨트롤러-모델 분리

개발새발log·2022년 5월 11일
0

스프링 MVC 1편

목록 보기
2/3

✅ 김영한 님의 스프링 MVC 1편 - 백엔드 웹 개발 핵심 기술을 공부하며 정리한 글입니다.

생각보다 코드 흐름 따라가기 어려워서 한번 정리하고 넘어가는 게 좋을 거 같다. V1, V2까지의 흐름은 아래를 참고하면 된다.

V1, V2 참고

V3 : Model 추가

V1, V2까지는 프론트 컨트롤러를 도입하고, View를 분리했다.
그리하여 V2의 FrontController는

MyView view = controller.process(request, response);
view.render(request, response);

위과 같이 물리 주소를 직접적으로 렌더링한다.

👉 form 작성 페이지의 경우: "/WEB-INF/views/new-form.jsp"

여기까지 문제점은:
1. 서블릿에 종속적인 Controller 구현체
2. 뷰 이름의 중복 - 물리 주소에서 중복되는 부분 존재

이 문제들을 해결하기 위해 V3로 리팩토링 하면 다음과 같은 구조를 가질 것이다:

결국 FrontController는 다음과 같은 역할을 가지게 된다:
1. 매핑 정보를 조회하여 Controller를 조회
2. 해당 컨트롤러를 호출하여 비즈니스 로직 실행(save면 모델 객체에 데이터 저장 등) ModelView(view명, model 정보)를 반환받음 (Model에 데이터 저장)
3. viewResolver를 호출하여 논리 이름을 물리 이름으로 변환
4. 해당 경로의 View 렌더링 진행

실행하기

실행 흐름에 따라 따로 콘솔창에 출력되도록 정리해보면 다음과 같다:

  1. form 작성: /front-controller/v3/members/new-form
> 1. controller 구현체 생성 = hello.servlet.web.frontcontroller.v3.controller.MemberFormControllerV3@66c49235
> 2. modelView 반환: 모델 = {} 뷰 이름 = new-form
> 3. viewResolver: 논리 이름 -> 물리 이름 변환 : /WEB-INF/views/new-form.jsp
> 4. MyView 렌더링
  1. form 저장: /front-controller/v3/members/save
> 1. controller 구현체 생성 = hello.servlet.web.frontcontroller.v3.controller.MemberSaveControllerV3@5758f58e
> 2. modelView 반환: 모델 = {member=hello.servlet.domain.member.Member@5da09efe} 뷰 이름 = save-result
> 3. viewResolver: 논리 이름 -> 물리 이름 변환 : /WEB-INF/views/save-result.jsp
> 4. MyView 렌더링
  1. 목록 조회: /front-controller/v3/members
> 1. controller 구현체 생성 = hello.servlet.web.frontcontroller.v3.controller.MemberListControllerV3@17efecd8
> 2. modelView 반환: 모델 = {members=[hello.servlet.domain.member.Member@5da09efe, hello.servlet.domain.member.Member@1f0d52ad]} 뷰 이름 = members
> 3. viewResolver: 논리 이름 -> 물리 이름 변환 : /WEB-INF/views/members.jsp
> 4. MyView 렌더링

짚고 가기!

코드

📌 V3 코드 소스

  1. 왜 논리주소를 물리 주소로 변환하는 viewResolver의 과정을 거치나요?

A. 변경사항 발생 시(주소 변환 등) 컨트롤러 코드를 변경할 필요가 없어집니다.

  1. 렌더링 시 메커니즘은 어떻게 되는건가요?

A. Model에서 데이터를 꺼낸 뒤, request 객체에 담아둡니다. 이를 JSP로 forwarding 합니다.

profile
⚠️ 주인장의 머릿속을 닮아 두서 없음 주의 ⚠️

0개의 댓글