[6] 스프링 MVC (4) - 프론트 컨트롤러(FrontController) 패턴 -V1 / V2 / V3

김정욱·2021년 5월 4일
2

[6] 스프링 MVC

목록 보기
4/13
post-thumbnail

개요

  • MVC패턴에서 발생되는 많은 중복개선하기 위해 프론트 컨트롤러(FrontController) 패턴 도입
  • 공통된 부분을 처리해주는 FrontController로 중복을 줄일 수 있음
  • 점진적으로 개선
    • V1 : 프론트 컨트롤러(FrontController) 패턴 도입
    • V2 : view render를 처리해주는 MyView 도입
    • V3 : 서블릿(Servlet) 종속성 제거 / 뷰 리졸버(View Resolver) 도입으로 논리 뷰 이름 사용
    • V4 : V3 코드에서 반환타입논리 주소명으로 변경
    • V5 : 어댑터(Adapter) 패턴 도입으로 다양한 종류의 컨트롤러 처리
  • V5까지 점진적으로 개선시킨 구조실제 스프링 MVC의 핵심 구조와 동일

V1

[ 구조 ]

[ 코드 ]

( FrontControllerServletV1 )

  • urlPatterns = "/front-controller/v1/*"
    : /front-controller/v1 으로 시작하는 모든 url path를 처리
  • Map<String, ControllerV1> ControllerMap = new HashMap<>()
    : url path에 해당되는 컨트롤러를 매핑해주는 HashMap 생성
  • HttpServletResponse.SC_NOT_FOUND
    : 404 statusCode를 의미
  • 로직
    • url 파싱
    • 해당되는 controller 찾기 (없으면 종료)
    • 컨트롤러비즈니스 로직 수행

( ControllerV1 - Interface )

  • 여러 Controller비즈니스 로직을 수행하는 process 추상 메소드를 가진 인터페이스

( MemberFormControllerV1 )

  • 회원가입 viewPath 생성 후, 해당 form으로 dispath

( MemberSaveControllerV1 )

  • HttpServletRequest 객체에 담긴 내용으로 member 생성 뒤 저장
  • viewPath 생성 후 dispath

( MemberListControllerV1 )

  • 모든 member를 조회한 뒤 Model 역할을 하는 HttpServletRequest에 저장
  • viewPath 생성 후 dispatch

V2

[ 구조 ]

  • V1의 코드에서 화면 전환을 위한 dispatch과정MyView 객체로 처리해서 중복을 제거하는 모델

[ 코드 ]

( FrontControllerServletV2 )


( MyView )

  • HttpServletRequest / HttpServletResponse 객체를 받아서 dispatch를 해주는 객체

( ControllerV2 - Interface )


( MemberFormControllerV2 )


( MemberSaveControllerV2 )


( MemberListControllerV2 )

V3

[ 구조 ]

  • 지금까지 컨트롤러에서는 HttpServletRequest / HttpServletResponse를 사용하지 않아도 매개변수로 받음
    --> 불필요 & Servlet에 종속적
  • HttpServletRequestModel로 사용했음
    --> Model을 별도로 생성해서 Servlet의 종속성을 제거 (추가로 View 이름을 받는 역할도 할 예정)

  • V3의 개선 사항 (정리)
    • Servlet 종속성 제거 --> Model 추가
    • view path 중복 제거 --> View Resolver 추가

[ 코드 ]

( FrontControllerServletV3 )

  • Map<String, String> paramMap
    : HttpServletRequest에 있는 데이터를 편하게 사용하기 위한 HashMap
  • createParamMap
    : HttpServletRequest에 있는 모든 데이터순회하면서 HashMap을 생성하는 메서드
  • viewResolver
    : viewName라는 논리 주소를 받은 뒤 실제 주소가 있는 물리 주소를 가지는 MyView를 반환하는 메서드
    • 논리 뷰 이름 : members
    • 물리 뷰 경로 : /WEB-INF/views/member.jsp
      --> url path의 중복을 제거함 & 논리 주소로만 소통 가능
  • MyView(model, HttpServletRequest, HttpServletResponse)를 가지는 생성자 추가

( ModelView )

  • Servlet의 종속성을 제거하기 위해 별도로 추가한 Model
  • view에 가져가야 할 데이터가 담겨있는 model 이라는 HashMap / 실제 물리 주소인 viewName을 가짐

( ControllerV3 - Interface )

  • 모든 Controller(컨트롤러)ModelView를 반환해야 한다

( MemberFormControllerV3 )


( MemberSaveControllerV3 )

  • 가야할 논리 주소매개변수ModelView 객체생성
  • ModelView 객체view에 넘길 데이터를 ModelView.model에 추가한뒤 return!

( MemberListControllerV3 )

profile
Developer & PhotoGrapher

0개의 댓글