MVC 프레임워크 만들기

ttaho·2023년 4월 19일
0

Spring-MVC

목록 보기
3/6

프론트 컨트롤러 패턴

기존의 MVC 패턴을 적용했을때의 문제점을 알아보자.

공통적인 부분이 반복적으로 일어난다.
하지만 프론트 컨트롤러를 도입하면

공통적인 부분의 반복을 없앨 수 있다.

FrontController 패턴 특징

  • 프론트 컨트롤러 서블릿 하나로 클라이언트의 요청을 받음
  • 프론트 컨트롤러가 요청에 맞는 컨트롤러를 찾아서 호출
  • 입구를 하나로!
  • 공통 처리 가능
  • 프론트 컨트롤러를 제외한 나머지 컨트롤러는 서블릿을 사용하지 않아도 됨

스프링 웹 MVC도 FrontController 패턴 특징을 이용하여 DispatcherServlet을 구현했다.

프론트 컨트롤러 도입 - V1

V1의 구조를 다음과 같이 구현해보자.

서블릿과 비슷한 모양의 컨트롤러 인터페이스를 도입한다.

프론트 컨트롤러는 이 인터페이스를 호출해서 구현과 관계없이 로직의 일관성을 가져갈 수 있다.

회원등록 페이지, 회원저장 페이지,회원목록 페이지의 컨트롤러를 구현해보자.

내부 로직은 기존 서블릿과 거의 같다.
이제 프론트 컨트롤러를 만들자.

urlPatterns

urlPatterns = "/front-controller/v1/x" : /front-controller/v1를 포함한 하위 모든 요청은 이 서블릿에서 받아들인다.

controllerMap

  • key: 매핑 URL
  • value: 호출될 컨트롤러

service()

먼저 requestURI를 조회해서 실제 호출할 컨트롤러를 controllerMap에서 찾는다. 만약 없다면 404 상태 코드를 반환한다.

JSP

JSP는 이전 MVC에서 사용했던 것을 그대로 사용한다.

기존 서블릿, JSP로 만든 MVC와 동일하게 실행 되는 것을 확인할 수 있다.

View 분리 -V2

모든 컨트롤러에서 뷰로 이동하는 부분에 중복이 있고, 깔끔하지 않다.

이 부분을 깔끔하게 분리하기 위해 별도로 뷰를 처리하는 객체를 만들자.

V2 구조

MyView

뷰 객체는 이후 다른 버전에서도 함께 사용하므로 패키지 위치를 frontcontroller에 두었다.

ControllerV2 인터페이스

회원등록 페이지, 회원저장 페이지,회원목록 페이지의 컨트롤러를 구현해보자.

이제 각 컨트롤러는 복잡한 dispathcer.forward()를 직접 생성해서 호출하지 않아도 된다. 단순히 MyView 객체를 생성하고 거기에 뷰 이름만 넣고 반환하면 된다.

프론트 컨트롤러V2

ControllerV2의 반환 타입이 MyView이므로 프론트 컨트롤러는 컨트롤러의 호출 결과로 MyView를 반환 받는다. 그리고 view.render()를 호출하면 forward 로직을 수행해서 JSP가 실행된다.

프론트 컨트롤러의 도입으로 MyView 객체의 render()를 호출하는 부분을 모두 일관되게 처리할 수 있다. 각각의 컨트롤러는 MyView 객체를 생성만 해서 반환하면 된다.

profile
백엔드 꿈나무

0개의 댓글